Получить статью Википедии С Python

Я пытаюсь получить статью Википедии с urllib Python:

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

однако вместо html-страницы я получаю следующий ответ: Error-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 

Википедия, похоже, блокирует запрос, который не из стандартного браузера.

10 ответов


вам нужно использовать urllib2 что superseedes urllib на библиотека std python для изменения агента пользователя.

прямо из примеры

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

Это не решение конкретной проблемы. Но вам может быть интересно использовать библиотеку mwclient (http://botwiki.sno.cc/wiki/Python:Mwclient) вместо этого. Это было бы намного проще. Тем более, что вы напрямую получите содержимое статьи, которое устраняет необходимость разбора html.

Я сам использовал его для двух проектов, и он работает очень хорошо.


вместо того, чтобы пытаться обмануть Википедию, вы должны рассмотреть возможность использования их API высокого уровня.


Если вы пытаетесь получить доступ к содержимому Википедии (и не нуждаетесь в какой-либо конкретной информации о самой странице), вместо использования api вы должны просто вызвать индекс.php с 'action=raw' для того, чтобы получить wikitext, как в:

'http://en.wikipedia.org/w/index.php?действие=raw & title=Main_Page'

или, если вы хотите HTML-код, используйте 'action=render' как в:

'http://en.wikipedia.org/w/index.php? действие=рендер & title=Main_Page'

вы также можете определить раздел, чтобы получить только часть содержимого с чем-то вроде "section=3".

затем вы можете получить к нему доступ с помощью модуля urllib2 (как указано в выбранном ответе). Однако, если вам нужна информация о самой странице (например, ревизии), вам будет лучше использовать mwclient как sugested выше.

смотрите MediaWiki для FAQ если вам нужна дополнительная информация.


общее решение, которое я использую для любого сайта, - это доступ к странице с помощью Firefox и, используя расширение, такое как Firebug, записывать все детали HTTP-запроса, включая любые куки.

в вашей программе (в данном случае в Python) вы должны попытаться отправить HTTP-запрос, подобный тому, который работал из Firefox. Это часто включает в себя настройку полей User-Agent,Referer и Cookie, но могут быть и другие.


requests Это потрясающе!

вот как вы можете получить html-контент с помощью requests:

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

готово!


попробуйте изменить заголовок агента пользователя, вы отправляете запрос что-то вроде: Пользователь-агент: корпорация Mozilla/5.0 (X11, то; у; Линукс семейства i686; En-США; Р.:1.9.0.1) Gecko с/2008072820 в Ubuntu/8.04 (Харди) в Firefox/3.0.1 (Линукс Минт)


вам не нужно олицетворять пользовательский агент браузера; любой пользовательский агент вообще будет работать,просто не пустой.


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

Это, кажется, работает для меня без изменение агента пользователя. Без "action=raw" это не работает для меня.


запрос страницы с ?printable=yes дает вам весь относительно чистый HTML-документ. ?action=render дает вам только тело HTML. Запрос на разбор страницы через API действий MediaWiki с помощью action=parse также дает вам только HTML тела, но было бы хорошо, если вы хотите более тонкий контроль,см. справку API разбора.

Если вы просто хотите HTML-страницу, чтобы вы могли ее отобразить, это быстрее и лучше использовать новый RESTBase API, который возвращает кэшированное HTML-представление страницы. В этом случаеhttps://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein.

по состоянию на ноябрь 2015 года вам не нужно устанавливать пользовательский агент, но настоятельно рекомендуется. Кроме того, почти все Wikimedia wikis требуется HTTPS, поэтому избегайте перенаправления 301 и сделайте https запросы.