Python-requests nicht geben mir die gleiche HTML wie mein browser
Bin ich Griff nach einer Wikia-Seite mit Python-requests. Es gibt allerdings ein problem: die Anfragen Anfrage nicht geben mir die gleiche HTML - wie mein browser mit derselben Seite.
Zum Vergleich, hier ist die Seite, Firefox bekommt von mir, und hier ist die Seite anfordert, holt (laden Sie Sie auf Ansicht - sorry, keine einfache Möglichkeit, visuell einfach Gastgeber ein wenig HTML von einer anderen Seite).
Werden Sie beachten ein paar Unterschiede (super unfreundlich diff). Es gibt einige kleine Dinge, wie Attribute beinig bestellt anders und so, aber es gibt auch ein paar sehr, sehr große Dinge. Am wichtigsten ist der fehlen der letzten sechs <img>
s, und die Gesamtheit der navigation und Fußzeile Abschnitte. Auch in den raw-HTML wie es aussieht ist die Seite abgeschnitten abrupt.
Warum ist das passiert und gibt es eine Möglichkeit es zu beheben? Ich habe daran gedacht, ein paar Dinge schon, von denen keines fruchtbar erwiesen haben:
- Request-Header stören? NÖ, ich habe versucht, kopieren Sie den Kopfzeilen mein browser sendet,
User-Agent
alle 1:1 in die Anforderungen verlangen, aber nichts änderte sich. - JavaScript-Inhalte zu laden, nachdem das HTML geladen wird? Nee. Selbst mit JS deaktiviert, Firefox gibt mir die "gute" Seite.
- Äh... naja... was sonst könnte es sein?
Es wäre erstaunlich, wenn Sie wissen, einen Weg, dies passieren könnte, und eine Möglichkeit, es zu beheben. Danke!
- Server sind frei zu dienen, was immer Sie möchten, basierend auf die Stimmung, die Phasen des Mondes, und vor allem, was Header Ihrer Anfrage enthält. Firefox sendet andere Header als
requests
. - Auch user-agents, die Dinge geladen, die über JavaScript, etc.
- Dies ist jedoch nicht
requests
Schuld. Es ist der server der Wahl. Sie können Experimentieren und kopieren über Header von Firefox an Ihrerequest
code; die üblichen übeltäter sind cookies, die User-Agent-header und die Akzeptieren* Familie von Headern. - Dann gibt es noch die browser selbst; es analysiert HTML empfangen und führt JavaScript-code aus, wenn einer vorhanden ist. Parsen von HTML mittels einfügen fehlt implizite Elemente (wie
<tbody>
in Tabellen) und alles reparieren, was kaputt ist. Darstellung der geparsten HTML zurück an Sie können leicht dazu führen, dass die Reihenfolge der Attribute ändern sich auch. - die OP bereits erklärt, dass Sie die JS deaktiviert.
- Dann gibt es die Netzwerk-Topologie. Ist Ihr browser so konfiguriert, einen proxy überhaupt? Ist requests (überprüfen Sie Umgebungsvariablen? Sind Sie den Zugriff auf den server die selbe IP-Adresse?
- Wie bereits erwähnt, kopierte ich die Header Firefox nutzt und verwendet Sie für die
requests.get()
("User-Agent" enthalten), und keine Würfel. Das ist nicht das Problem. Plus, ich bin so ziemlich ganz sicher, Wikia nicht ausschließen, sechs Bilder und die navigation für bestimmte IPs / proxies nur. Laden Sie die HTML-Dateien und betrachten Sie in Ihrem browser - Sie werden sehen, einige ziemlich offensichtlich, seltsame Unterschiede.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ein ähnliches Problem:
Um das Problem zu lösen, landete ich den Austausch der Anfragen Bibliothek für das urllib.Anfrage.
Grundsätzlich habe ich ersetzt:
mit:
und dann hat es geklappt.
Vielleicht eine dieser Bibliotheken ist dabei etwas seltsames hinter den kulissen? Nicht sicher, ob das eine option für Sie ist oder nicht.
Ich vorschlagen, dass Sie nicht senden die richtigen header (oder senden Sie es falsch) mit Ihrer Anfrage. Das ist, warum Sie bekommen unterschiedliche Inhalte. Hier ist ein Beispiel für einen HTTP-request mit header:
Wenn Sie sicher sind, dass Sie senden die richtigen header, aber sind noch dabei, verschiedene html. Sie können versuchen, zu verwenden Selen. Es ermöglicht Ihnen die Arbeit mit dem browser direkt (oder mit phantomjs wenn deine Maschine kein GUI). Mit Selen werden Sie in der Lage, einfach zu greifen, html-Code direkt vom browser.
Viele der Unterschiede, die ich sehe, zeigen mir, dass der Inhalt ist immer noch da, es ist nur gerendert, in einer anderen Reihenfolge, manchmal mit verschiedenen Abständen.
Konnte Sie empfangen, unterschiedliche Inhalte basierend auf mehrere verschiedene Dinge:
Wenn Sie alle Ihre Header auf der Oberseite des Diff, dann können wir vielleicht mehr Sinn machen, es.
Ich vermute, dass die Anwendung entschied sich, nicht zu erbringen bestimmte Bilder, da Sie nicht optimiert sind für das, was er denkt, ist eine Art " Roboter/mobile device (Python-Requests)
Auf einen genaueren Blick auf das diff, scheint es, dass alles geladen wurde in beiden Anfragen, nur mit einer anderen Formatierung.
User-Agent
gefolgt), und nichts gutes von ihm kam. Die Zeit und die render-Reihenfolge sind definitiv keine Faktoren, keine Frage.Ich Stand vor ähnlichen Problem beim anfordern einer Seite. Dann ist mir aufgefallen, dass die URL, die ich war mit notwendig 'http' werden vorangestellt, um die URL aber ich war voranstellen von "https". Meine Wunsch-URL sah aus wie https://example.com. So stellen Sie die URL Aussehen http://example.com. Hoffe, es löst das problem.
Vielleicht Anfragen und Browser verwenden unterschiedliche Möglichkeiten zum Rendern der raw-Daten aus WEB-server, und das diff in dem obigen Beispiel sind nur mit der gerenderten html.
Fand ich, dass wenn html ist gebrochen, verschiedene Browser, z.B. Chrome und Safari verwenden verschiedene Möglichkeiten, um fix bei der Analyse. Also vielleicht ist es ja die gleiche Idee mit Anfragen und Firefox.
Sowohl aus Anfragen und Firefox ich schlage vor, vergleichen die raw-Daten, d.h. die byte-stream-in-Buchse. Anfragen können .raw-Eigenschaft des response-Objekts, um die raw-Daten in den socket. (http://docs.python-requests.org/en/master/user/quickstart/) Wenn der raw-Daten aus beiden Seiten sind die gleichen, und es gibt einige gebrochene codes in HTML, vielleicht ist es aufgrund der unterschiedlichen auto-Festsetzung der Richtlinien der Anfrage und der browser beim Parsen gebrochen html.