我可以使用
从维基百科中删除任何页面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
如何获得非空的随机页面?
答案 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)