2016-10-31 1 views
3

Ich verwende Python 3.5 auf Ubuntu 16.Python 3.5 asyncio und aiohttp Errno 101 Netzwerk ist nicht erreichbar

Ich versuche, einen einfachen Client zu schreiben, zu verwenden aiohttp.

Hier ist der Code, den ich habe. Ich nahm es von here. Es ist das erste Codebeispiel mit deaktivierter SSL-Prüfung:

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)) 

Für einige Websites funktioniert dieser Code. Für andere, einschließlich http://python.org oder http://google.com funktioniert es nicht. Stattdessen erzeugt der Code diesen Fehler:

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

habe ich versucht, ein einfaches Skript requests, so etwas wie dieses:

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

Dies funktioniert, ich bin in der Lage google zu erreichen. Sowohl curl als auch wget erreichen auch Google.

Bei einigen Recherchen stieß ich auf ein anderes Problem. Dieses Problem ist ähnlich wie mein eigenes. Ich fand es here. Ich habe die hier angebotene Lösung ausprobiert, funktioniert aber immer noch nicht.

Dieses Problem tritt nicht bei allen Websites auf. Ich stieß auf HTTP- und HTTPS-Sites, die funktionierten und nicht funktionierten.

Irgendwelche Vorschläge, warum das passiert und wie kann ich das beheben?

Vielen Dank!

Anmerkungen:

Andere Dinge, die ich ausprobiert habe.

  1. Hinzufügen meines eigenen DNS-Resolvers, auch mit aiohttp.
  2. Verwenden Sie die https-Version der Websites, um den gleichen Fehler zu erhalten.
  3. Gehen zu einer etwas anderen URL, zum Beispiel https://www.google.com/?#q=python
+0

Hallo! Hast du dieses Problem gelöst? Ich bekomme den gleichen Fehler nur Workaround, die für mich arbeiten (neben der Angabe von family = socket.AF_INET was ich nicht tun kann) - Sitzung für jede Anfrage erstellen, aber es ist keine gute Lösung. – Vova

+0

Hey. Ja, aber ich habe es vergessen, seit es so lange her ist. Lass mich nachsehen und ich melde mich bei dir, wenn ich die Antwort finde. – mayk93

+0

Versuchen Sie 'family = socket.AF_INET' zum Connector hinzuzufügen oder 'allow_redirects = True' (wahrscheinlich ist es nicht das) zur Sitzung hinzuzufügen. – mayk93

Antwort

4

ich ein ähnliches Problem hatte, als für die Verbindung AsyncResolver als Resolver. Es war früher der Standard-Resolver, so könnte es in Ihrem Fall sein. Das Problem bezog sich auf Domains mit ipv6, wo der AsyncResolver Probleme hat, also bestand die Lösung darin, einfach die Familie für ipv4-Adressen anzugeben.

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

Wenn wir uns den Code ansehen, könnte das die Antwort sein. Anders als der Code in der Frage, jetzt habe ich die Familienflagge wie deine. – mayk93

Verwandte Themen