2011-04-18 145 views
2

拉动随机页面时,总是得到一个302响应我可以从维基百科拉任何页面脚本从维基百科

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 

但是,如果我试图拉与/维基/特殊随机页面:随机我得到一个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 

我如何获得一个非空RANDO m页?

回答

5

的302是重定向。它告诉你在以下行中的位置:

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

你只需要按照重定向。

2

HTTP代码302意味着你将被重定向。如果你看一下位置头,你会看到,你应该让你的新的要求。然后,您可以向该网址发送请求,并希望在该网页上获得200。

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

3

当你重定向到的响应对象都将有302码和geturl()方法将报告重定向URL。 Python的标准HTTP库默认处理重定向并不重要。请你帮个忙,不麻烦这个东西,并使用第三方mechanize库,这是一个简易替换为urllib2

使用机械化,你的代码应该是这样的:

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

+1很好的答案。 – NotMe 2011-04-18 22:53:28