Использование прокси в aiohttp

Рейтинг: 0Ответов: 0Опубликовано: 30.03.2023

Друзья, возник вопрос.

Использую документацию , хочу отправлять запросы с разных адресов.

Получился следующий код

import asyncio
import aiohttp


sites = [
    'https://ifconfig.me/ip',
    'https://ifconfig.me/ip',
    'https://ifconfig.me/ip',
]

proxys = [
    'https://proxy:port',
    'https://proxy:port',
    'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
    # 'https://proxy:port',
]


async def fetch(session, url):
    proxy_auth = aiohttp.BasicAuth('login', 'password')
    async with session.get(url[0], timeout=3, proxy=url[1], proxy_auth=proxy_auth) as resp:
        print(resp)
        if resp.ok:
            result = await resp.read()
            print(result)
        else:
            print("\n!MISSED!\n")


async def func():
    async with aiohttp.ClientSession(trust_env=True) as session:
        x = list(zip(sites, proxys))
        html_links = [fetch(session, url) for url in x]
        return await asyncio.gather(*html_links)



asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(func())

Получаю в ответ

raise asyncio.TimeoutError from None

asyncio.exceptions.TimeoutError

Почитав в интернете понял что проблема может быть из-за того что нет поддержки https прокси. Мои прокси именно такие, но разве https не предполагает наличие http, подумал я - и стер все s-ки из proxys. В ответ получил raise ClientHttpProxyError( aiohttp.client_exceptions.ClientHttpProxyError: 502, message='Bad Gateway', url=URL('http://proxy:port')

В документации есть сноска введите сюда описание изображения

https://github.com/aio-libs/aiohttp/discussions/6044#discussioncomment-1432443

Но и предоставленное решение не смогло меня удовлетворить. введите сюда описание изображения

Что я понял? Либо моих умений искать информацию недостаточно, либо я где-то в корне налажал/не понял/не разобрался.

Что я хочу? Хочу чтобы разработчики, которые сталкивались с такой же проблемой или же разработчики, решившие мою задачу другим способом, поделились своим опытом/натолкнули на мысль.

Требования для решения моей задачи. Я видел что обычные requests вроде как умеют стучаться на https сайт по https прокси, но у меня будет много запросов и очень ценно время за которое программа их выполнит, именно поэтому использую асинхронность. Наверно можно подумать о вэбсокете, но основная логика уже реализована на асинхронных запросах, поэтому хочется рассмотреть все возможные варианты решения, прежде чем глобально переписывать код.

Буду рад любым конструктивным комментариям и ответам.

Заранее спасибо.

Изменено:

Спрашивали, что будет если убрать параметр timeout. Вместо +/-3 секунд придется подождать гораздо больше. И будет следующая ошибка

ConnectionAbortedError: SSL handshake is taking longer than 60.0 seconds: aborting the connection

raise client_error(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientProxyConnectionError: Cannot connect to host proxy:port ssl:default [None]

Ответы

Ответов пока нет.