chrome打开V2EX后,出现400 Bad Request,如下图:
搜了一下,说错误原因可能是请求头不符合协议标准,一般都是由于cookie过长导致。
An http 400 bad request error means the server thinks your web browser is not obeying all the HTTP protocol rules.
于是我删除了v2ex的cookie,然后刷新页面,结果还是不可以。看了下浏览器请求头信息,如下:
没有了cookie结果仍然是400错误。我试着用Safari浏览器打开网站,则正常显示。
用python模拟了浏览器的访问,也可以正常抓取页面,如下:
>>> headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Charset':'UTF-8,*;q=0.5','Accept-Encoding':'gzip,deflate,sdch','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Host':'www.v2ex.com','Proxy-Connection':'keep-alive','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31'}
>>> r = requests.get("http://www.v2ex.com/", headers = headers)
>>> r.status_code
200
这是什么原因呢?
你应该点一下Request Header旁边的view source看一下实际发送的请求是什么样子的。我看到你的请求头里面有一个Proxy-Connection,这是个非标准的HTTP头,通常是浏览器检测到存在代理服务器的时候添加的。所以,我怀疑你的浏览器实际发的请求是这样的:
也就是说,在GET请求中使用了绝对路径,这是给HTTP代理服务器的请求。正常情况下,代理服务器会把这个URL转换成相对路径再转发给目标服务器。而不知道什么原因,也许是代理服务器没有起作用,这个请求被直接发到了v2ex,所以返回了400 Bad request,即请求不正确。
以下试验证明了这一点: