Скрипт всегда получает 302 ответа при извлечении случайных страниц из Википедии - PullRequest
2 голосов
/ 18 апреля 2011

Я могу вытащить любую страницу из Википедии с помощью

import httplib
conn = httplib.HTTPConnection("en.wikipedia.org")
conn.debuglevel = 1
conn.request("GET","/wiki/Normal_Distribution",headers={'User-Agent':'Python httplib'})
r1 = conn.getresponse()
r1.read()

Обычный ответ будет

reply: 'HTTP/1.0 200 OK\r\n'
header: Date: Sun, 03 Apr 2011 23:49:36 GMT
header: Server: Apache
header: Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
header: Content-Language: en
header: Vary: Accept-Encoding,Cookie
header: Last-Modified: Sun, 03 Apr 2011 17:23:50 GMT
header: Content-Length: 263638
header: Content-Type: text/html; charset=UTF-8
header: Age: 1280309
header: X-Cache: HIT from sq77.wikimedia.org
header: X-Cache-Lookup: HIT from sq77.wikimedia.org:3128
header: X-Cache: MISS from sq66.wikimedia.org
header: X-Cache-Lookup: MISS from sq66.wikimedia.org:80
header: Connection: close

Но если я попытаюсь вытащить случайную страницу с помощью / wiki / Special:Случайно Я получаю 302 ответа и пустую страницу

reply: 'HTTP/1.0 302 Moved Temporarily\r\n'
header: Date: Mon, 18 Apr 2011 19:25:52 GMT
header: Server: Apache
header: Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
header: Vary: Accept-Encoding,Cookie
header: Expires: Thu, 01 Jan 1970 00:00:00 GMT
header: Location: http://en.wikipedia.org/wiki/Tuticorin_Port_Trust
header: Content-Length: 0
header: Content-Type: text/html; charset=utf-8
header: X-Cache: MISS from sq60.wikimedia.org
header: X-Cache-Lookup: MISS from sq60.wikimedia.org:3128
header: X-Cache: MISS from sq62.wikimedia.org
header: X-Cache-Lookup: MISS from sq62.wikimedia.org:80
header: Connection: close

Как получить непустую случайную страницу?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2011

302 - это редирект.Он говорит вам, куда идти в следующей строке:

header: Location: http://en.wikipedia.org/wiki/tuticorin_port_trust 

Вам просто нужно следовать перенаправлению.

3 голосов
/ 19 апреля 2011

Когда вы будете перенаправлены, объект ответа будет иметь код 302, а метод geturl() сообщит URL-адрес перенаправления. Стандартные HTTP-библиотеки Python делают нетривиальными обработку перенаправлений по умолчанию. Сделайте себе одолжение, не беспокойтесь об этом и используйте стороннюю библиотеку mechanize , которая является заменой для urllib2.

Используя mechanize, ваш код будет выглядеть так:

import httplib
import mechanize

host = 'en.wikipedia.org'
path = '/wiki/Special:Random'
url = 'http://' + host + path # We have to pass a http:// url

# It still uses httplib.HTTPConnection, so we can debug
httplib.HTTPConnection.debuglevel = 1

request = mechanize.Request(url, headers={'User-Agent': 'Python-mechanize'}) 
response = mechanize.urlopen(request)

print response.code
# => 200
print response.geturl()
# => 'http://en.wikipedia.org/wiki/Faliszowice,_Lesser_Poland_Voivodeship'
data = response.read()
2 голосов
/ 18 апреля 2011

Посмотрите на заголовок местоположения:

header: Location: http://en.wikipedia.org/wiki/Tuticorin_Port_Trust

Там написано, что вы должны быть перенаправлены на эту страницу.Прочитайте этот заголовок и сделайте еще один запрос к этой странице.

2 голосов
/ 18 апреля 2011

HTTP-код 302 означает, что вы перенаправлены.Если вы посмотрите на заголовок Location , вы увидите, где вы должны сделать новый запрос.Затем вы можете отправить запрос на этот URL-адрес, и, надеюсь, вы получите 200 на этой странице.

Чтобы уточнить: вас запрашивают , чтобы повторить запрос в другом месте.Вот почему ваш клиент должен сделать еще один запрос, когда он получает 302. Случайная страница Википедии, очевидно, работает, выбирая случайную страницу в своей базе данных, а затем возвращает ответ 302 с новой страницей в качестве поля «Местоположение».Если вы посмотрите на другие 302 ответа, я уверен, что вы увидите другую страницу в поле Местоположение.

...