Urlibs Urlopen brechen auf einigen Websites (z. B. API Stackapps): Return Müllergebnisse zurück

StackOverflow https://stackoverflow.com/questions/3028426

Frage

Ich benutze urllib2's urlopen Funktionieren Sie, um zu versuchen, ein JSON -Ergebnis aus der Stackoverflow -API zu erhalten.

Der Code, den ich benutze:

>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()

Das Ergebnis, das ich bekomme:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\...

Ich bin ziemlich neu in Urllib, aber das scheint nicht das Ergebnis, das ich bekommen sollte. Ich habe es an anderen Orten ausprobiert und ich bekomme das, was ich erwarte (das gleiche wie das Besuch der Adresse mit einem Browser mir: ein JSON -Objekt).

Verwendung urlopen auf anderen Websites (zB "http://google.com") funktioniert gut und gibt mir echte HTML. Ich habe auch versucht, es zu verwenden urllib und es gibt das gleiche Ergebnis.

Ich bin ziemlich festgefahren und weiß nicht einmal, wo ich versuchen soll, dieses Problem zu lösen. Irgendwelche Ideen?

War es hilfreich?

Lösung

Das sieht fast nach etwas aus, das Sie mit der Gurke ernähren würden. Vielleicht etwas in der Nutzer-Agent-Zeichenfolge oder akzeptiert Header, das Urllib2 sendet, veranlasst Stackoverflow, etwas anderes als JSON zu senden.

Ein verräterischer Blick ist es zu betrachten conn.headers.headers Um zu sehen, was der Header vom Typ des Inhalts sagt.

Und diese Frage, Ergebnis eines ungeraden String -Formats aus dem API -Aufruf, kann Ihre Antwort haben. Grundsätzlich müssen Sie Ihr Ergebnis möglicherweise über einen GZIP -Dekompressor ausführen.

Doppelte Überprüfung mit diesem Code:

>>> req = urllib2.Request("http://api.stackoverflow.com/0.8/users/",
                          headers={'Accept-Encoding': 'gzip, identity'})
>>> conn = urllib2.urlopen(req)
>>> val = conn.read()
>>> conn.close()
>>> val[0:25]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ'

Ja, Sie erhalten definitiv gzip codierte Daten zurück.

Da Sie anscheinend unterschiedliche Ergebnisse auf verschiedenen Maschinen mit derselben Version von Python erhalten, und im Allgemeinen sieht es so aus irgendwo.

Ich habe 2009 eine Präsentation des EFF bei CodeCon gesehen. Sie haben End-to-End-Konnektivitätstests durchgeführt, um schmutzige ISP-Tricks verschiedener Art zu entdecken. Eines der Dinge, die sie während dieser Tests entdeckt haben, ist, dass eine überraschende Anzahl von NAT -Routern der Verbraucherebene zufällige HTTP -Header hinzufügt oder transparentes Proxying durchführt. Möglicherweise haben Sie ein Gerät in Ihrem Netzwerk, das das hinzufügt oder geändert wird Accept-Encoding Header, um Ihre Verbindung schneller erscheinen zu lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top