Главная » Error » aiohttp

aiohttp

Короче

Меня поставила в тупик проблема, по-видимому, связанная с asyncio + aiohttp , при которой при отправке большого количества одновременных запросов GET более 85% запросов вызывают исключение aiohttp.client_exceptions.ClientConnectorError которое в конечном итоге проистекает из

socket.gaierror(8, ‘nodename nor servname provided, or not known’)

при отправке одиночных запросов GET или выполнении базового разрешения DNS на хосте / порте это исключение не возникает.

(Но, по крайней мере, мы знаем, что # 2423 работает .)

Как сделать повторение кода Python в exe?

  • 1 подписчик
  • 14 часов назад
  • 64 просмотра

ответов
0

  • python
    • Python

    • +1 ещё

    Простой

  • Ожидаемое поведение

    Успешное разрешение DNS.

    Как создать разные сессии/ прокси для каждого запроса?

    • 1 подписчик
    • 18 минут назад
    • 12 просмотров

    ответов
    0

  • telegram
    • Telegram

    Простой

  • Рассылка в телеграм боте?

    • 1 подписчик
    • 4 часа назад
    • 72 просмотра

    ответа
    3

  • python
    • Python

    Простой

  • Как отправить запрос к apps script и получить ответ?

    • 1 подписчик
    • 13 часов назад
    • 16 просмотров

    ответ
    1

  • python
    • Python

    Простой

  • Фактическое поведение

    В настоящее время 21205 из 24934 входных URL-адресов не разрешаются, увеличиваясь с aiohttp.TCPConnector._resolve_host() coroutine.

    Может ли телеграм-бот побудить телефон, включить камеру?

    • 1 подписчик
    • 51 минуту назад
    • 25 просмотров

    ответ
    1

  • python
    • Python

    Средний

  • Как получить response?

    • 1 подписчик
    • 15 часов назад
    • 92 просмотра

    ответа
    4

  • python
    • Python

    • +1 ещё

    Простой

  • Действия по воспроизведению

    Хотя в моем реальном коде я делаю много настроек, таких как использование пользовательского экземпляра TCPConnector , я могу воспроизвести проблему, используя только экземпляры и аргументы класса aiohttp умолчанию, в точности как показано ниже.

    Я следил за трассировкой, и корень исключения связан с разрешением DNS. Он исходит из метода _create_direct_connectionaiohttp.TCPConnector , который вызывает ._resolve_host() .

    Я также пробовал:

    • Использование (и неиспользование) aiodns
    • sudo killall -HUP mDNSResponder
    • Использование family=socket.AF_INET в качестве аргумента для TCPConnector (хотя я почти уверен, что aiodns все равно использует его)
    • С ssl=True и ssl=False

    Все безрезультатно.

    Полный код для воспроизведения приведен ниже. Входные URL-адреса находятся по адресу https://gist.github.com/bsolomon1124/fc625b624dd26ad9b5c39ccb9e230f5a.

    import asyncio
    import itertools

    import aiohttp
    import aiohttp.client_exceptions

    from yarl import URL

    ua = itertools.cycle(
    (
    “Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0”,
    “Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.10; rv:62.0) Gecko/20100101 Firefox/62.0”,
    “Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.13; ko; rv:1.9.1b2) Gecko/20081201 Firefox/60.0”,
    “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36”
    )
    )

    async def get(url, session) -> str:
    async with await session.request(
    “GET”,
    url=url,
    raise_for_status=True,
    хедерs={‘User-Agent’: next(ua)},
    ssl=False
    ) as resp:
    text = await resp.text(encoding=”utf-8″, errors=”replace”)
    print(“Got text for URL”, url)
    return text

    async def bulk_get(urls) -> list:
    async with aiohttp.ClientSession() as session:
    htmls = await asyncio.gather(
    *(
    get(url=url, session=session)
    for url in urls
    ),
    return_exceptions=True
    )
    return htmls

    # See https://gist.github.com/bsolomon1124/fc625b624dd26ad9b5c39ccb9e230f5a
    with open(“/path/to/urls.txt”) as f:
    urls = tuple(URL(i.strip()) for i in f)

    res = asyncio.run(bulk_get(urls)) # urls: Tuple[yarl.URL]

    c = 0
    for i in res:
    if isinstance(i, aiohttp.client_exceptions.ClientConnectorError):
    print(i)
    c += 1

    print(c) # 21205 !!!!! (85% failure rate)
    print(len(urls)) # 24934

    Печать каждой строки исключения из res выглядит так:

    Cannot connect to host sigmainvestments.com:80 ssl:False [nodename nor servname provided, or not known] Cannot connect to host giaoducthoidai.vn:443 ssl:False [nodename nor servname provided, or not known] Cannot connect to host chauxuannguyen.org:80 ssl:False [nodename nor servname provided, or not known] Cannot connect to host www.baohomnay.com:443 ssl:False [nodename nor servname provided, or not known] Cannot connect to host www.soundofhope.org:80 ssl:False [nodename nor servname provided, or not known] # And so on…

    Что расстраивает, так это то, что я могу ping эти хосты без проблем и даже вызвать базовый ._resolve_host() :

    Баш / оболочка:

    [~/] $ ping -c 5 www.hongkongfp.com
    PING www.hongkongfp.com (104.20.232.8): 56 data bytes
    64 bytes from 104.20.232.8: icmp_seq=0 ttl=56 time=11.667 ms
    64 bytes from 104.20.232.8: icmp_seq=1 ttl=56 time=12.169 ms
    64 bytes from 104.20.232.8: icmp_seq=2 ttl=56 time=12.135 ms
    64 bytes from 104.20.232.8: icmp_seq=3 ttl=56 time=12.235 ms
    64 bytes from 104.20.232.8: icmp_seq=4 ttl=56 time=14.252 ms

    — www.hongkongfp.com ping statistics —
    5 packets transmitted, 5 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 11.667/12.492/14.252/0.903 ms

    Python:

    In [1]: import asyncio
    …: from aiohttp.connector import TCPConnector
    …: from clipslabapp.ratemgr import default_aiohttp_tcpconnector
    …:
    …:
    …: async def main():
    …: conn = default_aiohttp_tcpconnector()
    …: i = await asyncio.create_task(conn._resolve_host(host=’www.hongkongfp.com’, port=443))
    …: return i
    …:
    …: i = asyncio.run(main())

    In [2]: i
    Out[2]:
    [{‘hostname’: ‘www.hongkongfp.com’,
    ‘host’: ‘104.20.232.8’,
    ‘port’: 443,
    ‘family’: ,
    ‘proto’: 6,
    ‘flags’: },
    {‘hostname’: ‘www.hongkongfp.com’,
    ‘host’: ‘104.20.233.8’,
    ‘port’: 443,
    ‘family’: ,
    ‘proto’: 6,
    ‘flags’: }]

    Информация о самом исключении:

    Исключение составляет aiohttp.client_exceptions.ClientConnectorError , который оборачивает socket.gaierror как базовый OSError .

    Поскольку у меня return_exceptions=True в asyncio.gather() , я могу получить сами экземпляры исключений для проверки. Вот один пример:

    In [18]: i
    Out[18]:
    aiohttp.client_exceptions.ClientConnectorError(8,
    ‘nodename nor servname provided, or not known’)

    In [19]: i.host, i.port
    Out[19]: (‘www.hongkongfp.com’, 443)

    In [20]: i._conn_key
    Out[20]: ConnectionKey(host=’www.hongkongfp.com’, port=443, is_ssl=True, ssl=False, proxy=None, proxy_auth=None, proxy_хедерs_hash=None)

    In [21]: i._os_error
    Out[21]: socket.gaierror(8, ‘nodename nor servname provided, or not known’)

    In [22]: raise i.with_traceback(i.__traceback__)
    —————————————————————————
    gaierror Traceback (most recent call last)
    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _create_direct_connection(self, req, traces, timeout, client_error)
    954 port,
    –> 955 traces=traces), loop=self._loop)
    956 except OSError as exc:

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _resolve_host(self, host, port, traces)
    824 addrs = await
    –> 825 self._resolver.resolve(host, port, family=self._family)
    826 if traces:

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/resolver.py in resolve(self, host, port, family)
    29 infos = await self._loop.getaddrinfo(
    —> 30 host, port, type=socket.SOCK_STREAM, family=family)
    31

    /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py in getaddrinfo(self, host, port, family, type, proto, flags)
    772 return await self.run_in_executor(
    –> 773 None, getaddr_func, host, port, family, type, proto, flags)
    774

    /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/concurrent/futures/thread.py in run(self)
    56 try:
    —> 57 result = self.fn(*self.args, **self.kwargs)
    58 except BaseException as exc:

    /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py in getaddrinfo(host, port, family, type, proto, flags)
    747 addrlist = [] –> 748 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    749 af, socktype, proto, canonname, sa = res

    gaierror: [Errno 8] nodename nor servname provided, or not known

    The above exception was the direct cause of the following exception:

    ClientConnectorError Traceback (most recent call last)
    in
    —-> 1 raise i.with_traceback(i.__traceback__)

    in get(url, session)
    19 raise_for_status=True,
    20 хедерs={‘User-Agent’: next(ua)},
    —> 21 ssl=False
    22 ) as resp:
    23 return await resp.text(encoding=”utf-8″, errors=”replace”)

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/client.py in _request(self, method, str_or_url, params, data, json, cookies, хедерs, skip_auto_хедерs, auth, allow_redirects, max_redirects, compress, chunked, expect100, raise_for_status, read_until_eof, proxy, proxy_auth, timeout, verify_ssl, fingerprint, ssl_context, ssl, proxy_хедерs, trace_request_ctx)
    474 req,
    475 traces=traces,
    –> 476 timeout=real_timeout
    477 )
    478 except asyncio.TimeoutError as exc:

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in connect(self, req, traces, timeout)
    520
    521 try:
    –> 522 proto = await self._create_connection(req, traces, timeout)
    523 if self._closed:
    524 proto.close()

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _create_connection(self, req, traces, timeout)
    852 else:
    853 _, proto = await self._create_direct_connection(
    –> 854 req, traces, timeout)
    855
    856 return proto

    ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _create_direct_connection(self, req, traces, timeout, client_error)
    957 # in case of proxy it is not ClientProxyConnectionError
    958 # it is problem of resolving proxy ip itself
    –> 959 raise ClientConnectorError(req.connection_key, exc) from exc
    960
    961 last_exc = None # type: Optional[Exception]

    ClientConnectorError: Cannot connect to host www.hongkongfp.com:443 ssl:False [nodename nor servname provided, or not known

    Как перейти по ярлыку?

    • 1 подписчик
    • 9 часов назад
    • 52 просмотра

    ответа
    2

  • python
    • Python

    Простой

  • Возможно ли запустить ChromeDriver в headless режиме с расширениями?

    • 2 подписчика
    • 17 часов назад
    • 37 просмотров

    ответов
    0

  • Показать ещёЗагружается…
  • Вакансии с Хабр Карьеры

    Python разработчик

    Сбер
    •Иннополис
    от 80 000 ₽

    Python-разработчик (Платформа Linux)

    Сбер
    •Москва
    от 250 000 до 350 000 ₽

    Бекенд-разработчик (Python)

    Налоги Онлайн

    от 320 000 до 640 000 ₽
    Ещё вакансии

    Заказы с Хабр Фриланса

    Разработка задания (node.js)

    18 окт. 2022, в 15:46
    10 руб./за проект

    Сделать Webview Android из веб приложения

    18 окт. 2022, в 15:23
    5000 руб./за проект

    Решить задачу на голом Питоне

    18 окт. 2022, в 15:19
    2500 руб./за проект
    Ещё заказы

    Минуточку внимания

    Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями

    Зарегистрироваться

    Самое интересное за 24 часа

    • Можно ли заменить в ноутбуке экран на другой, с более высоким разрешением?

      • 2 подписчика
      • 1 ответ
    • Как вывести общее количество товаров магазина Woocommerce в записи/на странице с помощью шорткода?

      • 2 подписчика
      • 0 ответов
    • Можно ли удалить рекламу Yandex с сайта?

      • 4 подписчика
      • 3 ответа
    • Как исправить эту ошибку docker-compose?

      • 1 подписчик
      • 1 ответ
    • Как скачивать с защищенных каналов Telegram?

      • 8 подписчиков
      • 1 ответ
    • Какие есть сервисы кэширования для сайта?

      • 7 подписчиков
      • 1 ответ
    • Как Отправить сгенерированный пдф файл на электронную почту?

      • 2 подписчика
      • 1 ответ
    • Как дать роли права на чтение только со slave?

      • 2 подписчика
      • 1 ответ
    • Как изменить код таким образом, чтобы промисы выполнялись поочередно?

      • 2 подписчика
      • 1 ответ
    • Как сгрупировать значения multiselect инпута в подмассивы если в форме несколько multiselect инпутов с одним названием tags[]?

      • 2 подписчика
      • 1 ответ
    • © Habr
    • О сервисе
    • Обратная связь
    • Блог

    Как завершить выполнение кода принудительно?

    • 1 подписчик
    • 13 часов назад
    • 103 просмотра

    ответ
    1

  • боты
    • Боты

    • +2 ещё

    Простой

  • Ваше окружение

    • Python 3.7.1
    • клиент aiohttp 3.5.4
    • Происходит в Mac OSX High Sierra и Ubuntu 18.04.

    NoneType: ‘NoneType’ object is not subscriptable. Как быть, где допустил ошибку?

    • 1 подписчик
    • 2 часа назад
    • 44 просмотра

    ответ
    1

  • python
    • Python

    • +2 ещё

    Простой

  • Источники

    • https://bleepcoder.com/ru/aiohttp/399620258/concurrent-get-requests-lead-to-clientconnectorerror-8
    • https://qna.habr.com/q/799299
    [свернуть]
    Решите Вашу проблему!


    ×
    Adblock
    detector