2016-10-31 6 views
3

Я использую Python 3.5 на Ubuntu 16.питона 3,5 asyncio и aiohttp Errno 101 Сеть недостижима

Я пытаюсь использовать aiohttp написать простой клиент.

Вот код, который у меня есть. Я взял его с here. Это первый пример кода, при котором проверка ssl отключена:

import aiohttp 
import asyncio 
import async_timeout 

async def fetch(session, url): 
    with async_timeout.timeout(10): 
     async with session.get(url) as response: 
      return await response.text() 

async def main(loop): 
    conn = aiohttp.TCPConnector(verify_ssl=False) 
    async with aiohttp.ClientSession(loop=loop, connector=conn) as session: 
     html = await fetch(session, 'http://www.google.com') 
     print(html) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main(loop)) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main(loop)) 

Для некоторых сайтов этот код работает. Для других, включая http://python.org или http://google.com, он не работает. Вместо этого код создает эту ошибку:

aiohttp.errors.ClientOSError: [Errno 101] Cannot connect to host google.com:80 ssl:False [Can not connect to google.com:80 [Network is unreachable]] 

Я попытался простой requests сценарий, что-то вроде этого:

import requests 
rsp = requests.get('http://google.com') 
print(rsp.text) 

Это работает, я могу достичь Google. Оба curl и wget также достигают google.

Выполнение некоторых исследований, я столкнулся с другой проблемой. Эта проблема похожа на мою. Я нашел его here. Я попробовал предлагаемое здесь решение, но оно все еще не работает.

Эта проблема не возникает для всех сайтов. Я наткнулся на сайты http и https, которые работали и не работали.

Любые предложения относительно того, почему это происходит и как я могу это исправить?

Спасибо!

Примечания:

Другие предметы, которые я пробовал.

  1. Добавление собственного DNS-резольвера, также использующего aiohttp.
  2. Использование https-версии сайтов, получение одинаковой ошибки.
  3. Переход к немного другой URL, например https://www.google.com/?#q=python
+0

Здравствуйте! Вы решили эту проблему? Я получаю ту же ошибку только обходной путь, который работает для меня (помимо описания семейства = socket.AF_INET, который я не могу сделать) - создайте сеанс для каждого запроса, но это нехорошее решение. – Vova

+0

Эй. Да, но я забыл, как это было так давно. Позвольте мне проверить, и я вернусь к вам, если найду ответ. – mayk93

+0

Попробуйте добавить 'family = socket.AF_INET' к коннектору или 'allow_redirects = True' (возможно, это не так) к сеансу. – mayk93

ответ

4

У меня была аналогичная проблема при использовании AsyncResolver в качестве распознавателя для подключения. Раньше это был распознаватель по умолчанию, поэтому он мог бы быть в вашем случае. Проблема была связана с доменами с ipv6, где AsyncResolver имеет проблемы, поэтому решение было просто указать семейство на адреса ipv4.

conn = aiohttp.TCPConnector(
     family=socket.AF_INET, 
     verify_ssl=False, 
    ) 
+0

Оглядываясь на код, это может быть ответ. В отличие от кода в вопросе, теперь у меня есть семейный флаг, похожий на ваш. – mayk93

 Смежные вопросы

  • Нет связанных вопросов^_^