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

Я пытаюсь получить статью в Википедии с помощью python urllib:

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

Однако вместо html-страницы я получаю следующий ответ: Ошибка - Фонд Викимедиа:

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 

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

Кто-нибудь знает, как обойти это?

Ответ 1

Вам нужно использовать urllib2, который перенаправляет urllib в python std library, чтобы изменить агент пользователя.

Прямо от examples

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

'http://en.wikipedia.org/w/index.php действие = оказывают &? Название = Main_Page'

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

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

Если вам нужна дополнительная информация, обратитесь к Часто задаваемые вопросы о MediaWiki.

Ответ 5

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

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

Ответ 6

requests является потрясающим!

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

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

Готово!

Ответ 7

Попробуйте изменить заголовок агента пользователя, который вы отправляете в свой запрос, например: 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)

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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