asyncio
非同期 Web クローラーを作成する方法を学ぼうとしています。以下は、フレームワークをテストするための粗雑なクローラーです。
import asyncio, aiohttp
from bs4 import BeautifulSoup
@asyncio.coroutine
def fetch(url):
with (yield from sem):
print(url)
response = yield from aiohttp.request('GET',url)
response = yield from response.read_and_close()
return response.decode('utf-8')
@asyncio.coroutine
def get_links(url):
page = yield from fetch(url)
soup = BeautifulSoup(page)
links = soup.find_all('a',href=True)
return [link['href'] for link in links if link['href'].find('www') != -1]
@asyncio.coroutine
def crawler(seed, depth, max_depth=3):
while True:
if depth > max_depth:
break
links = yield from get_links(seed)
depth+=1
coros = [asyncio.Task(crawler(link,depth)) for link in links]
yield from asyncio.gather(*coros)
sem = asyncio.Semaphore(5)
loop = asyncio.get_event_loop()
loop.run_until_complete(crawler("http://www.bloomberg.com",0))
非常asyncio
によく文書化されているように見えますが、文書化aiohttp
がほとんどないように思われるため、自分でいくつかのことを解決するのに苦労しています.
まず、ページ応答のエンコーディングを検出する方法はありますか? 次に、接続がセッション内で維持されるように要求できますか? または、これはデフォルトで True のようrequests
ですか?