2

Asyncio で使用する必要があるスクレイピング スクリプトを Python で作成しました。また、Web Cookie をサポートするためにも必要です。元々は urllib.request で作成されたもので、スクリプトは次のようになります。

urls = ['example.com/subdomain-A', 'example.com/subdomain-B', 'example.com/subdomain-C', ...]
for url in urls:
    page = bs4.BeautifulSoup(urllib.request.build_opener(req.HTTPCookieProcessor).open(url))
    # Do some stuff with page

これは今のところ問題なく動作しますが、Asyncio でマルチスレッド化する必要もあります。それに関するドキュメントが見つからなかったので、次のことを試しました。

@asyncio.coroutine
def get(*args, **kwargs):
    response = yield from aiohttp.request('GET', *args, **kwargs)
    res = yield from response.read()
    return res
        
@asyncio.coroutine
def scraper(url):
    connector = aiohttp.connector.BaseConnector(share_cookies=True)
    response = yield from get(url, connector=connector)
    page = bs4.BeautifulSoup(response)
    # Do some stuff with page

urls = ['example.com/subdomain-A', 'example.com/subdomain-B', 'example.com/subdomain-C', ...]
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
tasks = [scraper(url) for url in urls]
loop.run_until_complete(asyncio.wait(tasks))

コンテキストの問題として、私がスクレイピングしようとしているページは、読み込み時にセッション Cookie の存在をテストし、存在しない場合は作成し、それ自体にリダイレクトするような方法で作成されています。さて、単純なスクレイピング アプローチでは、私はループに陥っており、Asyncio/Aiohttp では何も起こりません。

4

0 に答える 0