从维基百科中提取随机页面时,脚本总是得到302响应

时间:2011-04-18 19:40:35

标签: python http wikipedia

我可以使用

从维基百科中删除任何页面
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 个答案:

答案 0 :(得分:5)

302是重定向。它告诉你去哪一行:

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

您只需要遵循重定向。

答案 1 :(得分:3)

当您被重定向时,响应对象的代码为302,geturl()方法将报告重定向URL。 Python的标准HTTP库默认情况下处理重定向非常简单。帮自己一个忙,不要麻烦这些东西,并使用第三方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 :(得分:2)

HTTP代码302表示您正在被重定向。如果您查看位置标题,您会看到应该在何处提出新请求。然后,您可以向该URL发出请求,并希望在该页面上获得200.

澄清:您正在请求在其他地方重试请求。这就是为什么你的客户在收到302时需要再发一个请求的原因。维基百科的随机页面显然是通过在其数据库中选择一个随机页面,然后以新页面作为位置字段返回302响应。如果您查看其他302个回复,我相信您会在“位置”字段中看到不同的页面。

答案 3 :(得分:2)

查看位置标题:

  

标题:位置:http://en.wikipedia.org/wiki/Tuticorin_Port_Trust

它说您应该重定向到该页面。阅读该标题并对该页面发出另一个请求。