2

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ですか?

4

1 に答える 1

1

response.headers['Content-Type']ライブラリを参照または使用chardetして、不適切な形式の HTTP 応答を見つけることができます。レスポンスボディはbytes文字列です。

キープアライブ接続の場合、次のように使用する必要がありますconnector

connector = aiohttp.TCPConnector(share_cookies=True)

response1 = yield from aiohttp.request('get', url1, connector=connector)
body1 = yield from response1.read_and_close()
response2 = aiohttp.request('get', url2, connector=connector)
body2 = yield from response2.read_and_close()
于 2014-06-26T19:51:51.760 に答える