В этой статье
- Короче
- Как сделать повторение кода Python в exe?
- Ожидаемое поведение
- Как создать разные сессии/ прокси для каждого запроса?
- Рассылка в телеграм боте?
- Как отправить запрос к apps script и получить ответ?
- Фактическое поведение
- Может ли телеграм-бот побудить телефон, включить камеру?
- Как получить response?
- Действия по воспроизведению
- Как перейти по ярлыку?
- Возможно ли запустить ChromeDriver в headless режиме с расширениями?
- Минуточку внимания
- Как завершить выполнение кода принудительно?
- Ваше окружение
- NoneType: ‘NoneType’ object is not subscriptable. Как быть, где допустил ошибку?
Короче
Меня поставила в тупик проблема, по-видимому, связанная с 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
- +1 ещё
Простой
Ожидаемое поведение
Успешное разрешение DNS.
Как создать разные сессии/ прокси для каждого запроса?
- 1 подписчик
- 18 минут назад
- 12 просмотров
ответов
0

Telegram
Простой
Рассылка в телеграм боте?
- 1 подписчик
- 4 часа назад
- 72 просмотра
ответа
3

Python
Простой
Как отправить запрос к apps script и получить ответ?
- 1 подписчик
- 13 часов назад
- 16 просмотров
ответ
1

Python
Простой
Фактическое поведение
В настоящее время 21205 из 24934 входных URL-адресов не разрешаются, увеличиваясь с aiohttp.TCPConnector._resolve_host() coroutine.
Может ли телеграм-бот побудить телефон, включить камеру?
- 1 подписчик
- 51 минуту назад
- 25 просмотров
ответ
1

Python
Средний
Как получить response?
- 1 подписчик
- 15 часов назад
- 92 просмотра
ответа
4

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 Информация о самом исключении: Исключение составляет aiohttp.client_exceptions.ClientConnectorError , который оборачивает socket.gaierror как базовый OSError . Поскольку у меня return_exceptions=True в asyncio.gather() , я могу получить сами экземпляры исключений для проверки. Вот один пример: In [18]: i In [19]: i.host, i.port In [20]: i._conn_key In [21]: i._os_error In [22]: raise i.with_traceback(i.__traceback__) ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _resolve_host(self, host, port, traces) ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/resolver.py in resolve(self, host, port, family) /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) /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/concurrent/futures/thread.py in run(self) /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) 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) ~/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) ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in connect(self, req, traces, timeout) ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _create_connection(self, req, traces, timeout) ~/Scripts/python/projects/clab/lib/python3.7/site-packages/aiohttp/connector.py in _create_direct_connection(self, req, traces, timeout, client_error) ClientConnectorError: Cannot connect to host www.hongkongfp.com:443 ssl:False [nodename nor servname provided, or not known
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’:
Out[18]:
aiohttp.client_exceptions.ClientConnectorError(8,
‘nodename nor servname provided, or not known’)
Out[19]: (‘www.hongkongfp.com’, 443)
Out[20]: ConnectionKey(host=’www.hongkongfp.com’, port=443, is_ssl=True, ssl=False, proxy=None, proxy_auth=None, proxy_хедерs_hash=None)
Out[21]: socket.gaierror(8, ‘nodename nor servname provided, or not known’)
—————————————————————————
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:
824 addrs = await
–> 825 self._resolver.resolve(host, port, family=self._family)
826 if traces:
29 infos = await self._loop.getaddrinfo(
—> 30 host, port, type=socket.SOCK_STREAM, family=family)
31
772 return await self.run_in_executor(
–> 773 None, getaddr_func, host, port, family, type, proto, flags)
774
56 try:
—> 57 result = self.fn(*self.args, **self.kwargs)
58 except BaseException as exc:
747 addrlist = []
–> 748 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
749 af, socktype, proto, canonname, sa = res
—-> 1 raise i.with_traceback(i.__traceback__)
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”)
474 req,
475 traces=traces,
–> 476 timeout=real_timeout
477 )
478 except asyncio.TimeoutError as exc:
520
521 try:
–> 522 proto = await self._create_connection(req, traces, timeout)
523 if self._closed:
524 proto.close()
852 else:
853 _, proto = await self._create_direct_connection(
–> 854 req, traces, timeout)
855
856 return proto
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]
Как перейти по ярлыку?
- 1 подписчик
- 9 часов назад
- 52 просмотра
ответа
2

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
- +2 ещё
Простой
- https://bleepcoder.com/ru/aiohttp/399620258/concurrent-get-requests-lead-to-clientconnectorerror-8
- https://qna.habr.com/q/799299