Получить статью из Википедии с Python - PullRequest
39 голосов
/ 23 сентября 2008

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

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 

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

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

Ответы [ 10 ]

51 голосов
/ 23 сентября 2008

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

Прямо из примеров

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()
36 голосов
/ 23 сентября 2008

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

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

15 голосов
/ 11 июня 2009

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

3 голосов
/ 12 ноября 2010

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

http://en.wikipedia.org/w/index.php?action=raw&title=Main_Page'

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

http://en.wikipedia.org/w/index.php?action=render&title=Main_Page'

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

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

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

2 голосов
/ 19 сентября 2014

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

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

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

Готово!

2 голосов
/ 23 сентября 2008

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

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

1 голос
/ 23 сентября 2008

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

1 голос
/ 23 сентября 2008

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

0 голосов
/ 11 ноября 2015

Запрос страницы с помощью ?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 требуют HTTPS , поэтому избегайте перенаправления 301 и делайте http s запросов.

0 голосов
/ 25 января 2011
import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

Мне кажется, это работает без изменения пользовательского агента. Без «action = raw» у меня не получится.

...