Frage

ich versuche, einen Wikipedia-Artikel mit Pythons urllib zu holen:

f = urllib.urlopen("http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes")           
s = f.read()
f.close()

Jedoch anstelle der HTML-Seite, die ich die folgende Antwort erhalten: Fehler - Wikimedia Foundation:

Request: GET http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes, from 192.35.17.11 via knsq1.knams.wikimedia.org (squid/2.6.STABLE21) to ()
Error: ERR_ACCESS_DENIED, errno [No Error] at Tue, 23 Sep 2008 09:09:08 GMT 

Wikipedia scheint Anfrage zu blockieren, die nicht von einem Standard-Browser sind.

Jeder weiß, wie dies zu umgehen?

War es hilfreich?

Lösung

Sie verwenden müssen, um die urllib2 dass superseedes urllib in der python std Bibliothek , um die User-Agenten zu ändern.

Direkt von der Beispiele

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

Andere Tipps

Es ist keine Lösung für das spezifische Problem. Aber es könnte wenig Interessantes für Sie die mwclient Bibliothek verwenden ( http://botwiki.sno.cc/ wiki / Python: Mwclient ) statt. Das wäre so viel einfacher. Vor allem, da Sie direkt die Artikelinhalte erhalten, die die Notwendigkeit beseitigt, damit Sie die HTML zu analysieren.

Ich habe es selbst für zwei Projekte verwendet, und es funktioniert sehr gut.

Anstatt zu versuchen, Wikipedia zu betrügen, sollten Sie rel="noreferrer"> High-Level-API mit ihrem

Die allgemeine Lösung, die ich für jede Website verwenden ist die Seite mit Firefox zugreifen und unter Verwendung einer Erweiterung wie Firebug, erfassen alle Details der HTTP-Anforderung einschließlich Cookies.

In Ihrem Programm (in diesem Fall in Python), sollten Sie versuchen, eine HTTP-Anforderung so ähnlich wie notwendig, um das eine zu senden, die von Firefox gearbeitet. Dies beinhaltet oft die User-Agent, Referer und Cookie-Felder festlegen, aber es könnte noch andere sein.

requests ist genial!

Hier ist, wie Sie den HTML-Inhalt mit requests zu bekommen:

import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text

Fertig!

Versuchen Sie, die User-Agent-Header zu ändern Sie wie in Ihrer Anfrage etwas senden: User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.1) Gecko / 2008072820 Ubuntu / 8,04 (hardy) Firefox / 3.0.1 (Linux Mint)

Sie brauchen nicht einen Browser User-Agent zu verkörpern; jeder User-Agent überhaupt funktioniert, nur nicht eine leere ein.

import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

Das scheint für mich zu arbeiten, ohne die User-Agenten zu ändern. Ohne die „action = raw“ es für mich nicht funktioniert.

abfragen Seite mit ?printable=yes gibt Ihnen ein ganzes relativ sauberes HTML-Dokument. ?action=render gibt Ihnen nur den Körper HTML. Anfordern der Seite durch die MediaWiki Aktion API mit action=parse gibt Ihnen ebenfalls nur wäre aber gut, wenn Sie eine feinere Kontrolle wollen, siehe Parse-API Hilfe .

Wenn Sie nur die HTML-Seite wollen, so dass Sie es machen kann, ist es schneller und besser ist es, die neuen verwenden RESTBase API, die eine im Cache gespeicherte HTML-Darstellung der Seite zurückgibt. In diesem Fall https://en.wikipedia.org/api/rest_v1/page / html / Albert_Einstein .

Ab November 2015 müssen Sie Ihren User-Agent nicht gesetzt, aber erfordern HTTPS , so eine 301-Weiterleitung vermeiden und macht http s Anfragen.

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