web-dev-qa-db-ja.com

プロキシでのAiohttpの使用

非同期を使用して、(IDで識別される)URLのリストからHTMLを取得しようとしています。プロキシを使用する必要があります。

以下のようなプロキシでaiohttpを使用しようとしています:

_import asyncio
import aiohttp
from bs4 import BeautifulSoup

ids = ['1', '2', '3']

async def fetch(session, id):
    print('Starting {}'.format(id))
    url = f'https://www.testing.com/{id}'

    async with session.get(url) as response:
        return BeautifulSoup(await response.content, 'html.parser')

async def main(id):
    proxydict = {"http": 'xx.xx.x.xx:xxxx', "https": 'xx.xx.xxx.xx:xxxx'}
    async with aiohttp.ClientSession(proxy=proxydict) as session:
        soup = await fetch(session, id)
        if 'No record found' in soup.title.text:
            print(id, 'na')


loop = asyncio.get_event_loop()
future = [asyncio.ensure_future(main(id)) for id in ids]


loop.run_until_complete(asyncio.wait(future))
_

ここの問題によると: https://github.com/aio-libs/aiohttp/pull/2582ClientSession(proxy=proxydict)は動作するはずです。

ただし、エラーが発生します"__init__() got an unexpected keyword argument 'proxy'"

これを解決するにはどうすればよいですか?ありがとうございました。

5
yl_low

Session.get呼び出し内でプロキシ構成を設定できます。

async with session.get(url, proxy=your_proxy_url) as response:
    return BeautifulSoup(await response.content, 'html.parser')

プロキシに認証が必要な場合は、次のようにプロキシのURLに設定できます。

proxy = 'http://your_user:your_password@your_proxy_url:your_proxy_port'
async with session.get(url, proxy=proxy) as response:
    return BeautifulSoup(await response.content, 'html.parser')

または:

proxy = 'http://your_proxy_url:your_proxy_port'
proxy_auth = aiohttp.BasicAuth('your_user', 'your_password')
async with session.get(url, proxy=proxy, proxy_auth=proxy_auth) as response:
    return BeautifulSoup(await response.content, 'html.parser')

詳しくは こちら をご覧ください

4
ArMo

愚かな私-@Milan Velebitによるドキュメントを読んだ後、変数はtrust_env=Trueproxyまたはproxiesの代わり。プロキシ情報は、HTTP_PROXY/HTTPS_PROXY環境変数のfrom/setである必要があります。

2
yl_low

documentation のとおり、実際にはproxyパラメータはなく、代わりにproxies

2
Milan Velebit