报错如下:
Traceback (most recent call last):
File "*.py", line 37, in <module>
html = get(URL, header)
File "*.py", line 20, in get_HTML
html = urllib.request.urlopen(request)
File "lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "lib/python3.6/urllib/request.py", line 526, in open
response = self._open(req, data)
File "lib/python3.6/urllib/request.py", line 544, in _open
'_open', req)
File "lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "lib/python3.6/urllib/request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
File "lib/python3.6/urllib/request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "lib/python3.6/http/client.py", line 1280, in _send_request
self.putheader(hdr, value)
File "lib/python3.6/http/client.py", line 1216, in putheader
if _is_illegal_header_value(values[i]):
TypeError: expected string or bytes-like object
错误原因:
请求加上HTTP报头信息,但是其中’Referer’设置为None。HTTP协议头中的Referer让服务器判断来源页面。Referer有什么作用呢?
2.防止恶意请求。比如静态请求是*.html
结尾的,动态请求是*.shtml
,那么由此可以这么用,所有的*.shtml
请求,必须 Referer 为我自己的网站。
那么在这里设置称为空的Referer,表示一个HTTP请求根本不包含Referer头部。根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的,因为这是一个“凭空产生”的 HTTP 请求,并不是从一个地方链接过去的。
允许 Referer 为空,意味着你允许比如浏览器直接访问,就是空。
解决方法:
1.删除Referer
2.可以设置抓取网站的Host
Reference:
什么是Referer?Referer的作用?空Referer是怎么回事?