这其实是一个很蛋疼的问题,但鉴于我花了好大功夫才找到这个问题,还是记录一下...实际是基本功不扎实。

问题描述

Python在使用urllib库简单获取网站内容时,出现错误503。如:

import urllib.request

url = 'http://www.cnbeta.com'
headers = {
    'host': 'www.pcbeta.com'
}
s = urllib.request.Request(url=url, headers=headers)
con = urllib.request.urlopen(s)

解决方法

可能是设置了自定义headers,其中host字段中网址并不是URL中请求的网址。

举个例子

如果host缺省,会使用URL中的网址

import urllib.request

url = 'http://www.cnbeta.com'
s = urllib.request.Request(url=url, headers=headers)
con = urllib.request.urlopen(s)

这时抓包可以看到host的值为www.cnbeta.com,访问正常。

如果自定义host,会使用host值做DNS之类的,忽略URL

import urllib.request

url = 'http://www.cnbeta.com'
headers = {
    'host': 'www.pcbeta.com'
}
s = urllib.request.Request(url=url, headers=headers)
con = urllib.request.urlopen(s)

这时抓包可以看到host的值为www.pcbeta.com,请求结果为503错误。