解决 TypeError: expected string or bytes-like object

报错如下:

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是怎么回事?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值