久久就要複習一下爬蟲寫法,不然不常用就生疏了,針對三種語言寫個 async
的版本吧。
node.js
const axios = require('axios');
const urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
];
(async () => {
try {
const requests = urls.map(url => axios.get(url));
const responses = await Promise.all(requests);
responses.forEach(response => {
console.log(response.data.id);
});
} catch (error) {
console.error(error.message);
}
})();
Python
import aiohttp
import asyncio
urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
]
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.json()
async def main():
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
responses = await asyncio.gather(*tasks)
for responses in responses:
print(responses.get('id'))
if __name__ == '__main__':
asyncio.run(main())
PHP
<?php
use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;
include "vendor/autoload.php";
$urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
];
$client = new Client([
'verify' => false,
]);
$promises = [];
foreach ($urls as $url) {
$promises[] = $client->getAsync($url);
}
$results = Utils::all($promises)->wait();
foreach ($results as $result) {
echo json_decode($result->getBody()->getContents(), true)['id'], PHP_EOL;
}