脚本从维基百科拉取随机页面时总是收到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
但是如果我尝试用 /wiki/Special:Random 来获取一个随机页面,我会收到一个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 个回答
2
看看这个位置头信息:
它告诉你应该被重定向到那个页面。读取这个头信息,然后再向那个页面发起一次请求。
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()
5
302是一个重定向的状态码。它是在告诉你接下来要去哪里:
header: Location: http://en.wikipedia.org/wiki/tuticorin_port_trust
你只需要跟着这个重定向走就可以了。