Holt einen Wikipedia-Artikel mit Python
-
02-07-2019 - |
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?
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.
Wenn Sie versuchen, Wikipedia-Inhalte zugreifen (und müssen keine spezifischen Informationen über die Seite selbst), anstatt die api verwenden Sie sollten nur nennen index.php mit ‚action = raw‘, um das zu bekommen wikitext, wie in:
'http://en.wikipedia.org/w/index.php? action = raw & title = Main_Page'
Oder, wenn Sie den HTML-Code wollen, verwenden Sie 'action = machen' wie in:
'http://en.wikipedia.org/w/index.php? action = render & title = Main_Page'
Sie können auch einen Abschnitt definieren nur einen Teil des Inhalts mit so etwas wie ‚section = 3‘ zu erhalten.
Sie könnten dann Zugriff auf den urllib2 Modul (wie in der gewählten Antwort sugested). Wenn Sie jedoch Informationen über die Seite selbst (wie Revisionen) benötigen, werden Sie besser die mwclient wie oben sugested.
Siehe href="http://www.mediawiki.org/wiki/API%3aFAQ#get_the_content_of_a_page_.28wikitext.29.3F" rel="nofollow"> MediaWiki FAQ
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
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.