现象描述:
最近写的一份代码,在自己电脑环境下跑的好好的,但是部署到了linux就报了此错误。
详细报错如下:
File "/usr/local/python3/lib/python3.9/site-packages/bi_slave-3.0-py3.9.egg/bi_slave/common/http_sync.py", line 145, in __call__
resp = self.send_request()
File "/usr/local/python3/lib/python3.9/site-packages/bi_slave-3.0-py3.9.egg/bi_slave/common/http_sync.py", line 202, in send_request
resp = session.send(prep, **send_kwargs)
File "/usr/local/python3/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/usr/local/python3/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/usr/local/python3/lib/python3.9/site-packages/urllib3/connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "/usr/local/python3/lib/python3.9/site-packages/urllib3/connectionpool.py", line 387, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/local/python3/lib/python3.9/http/client.py", line 1253, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/local/python3/lib/python3.9/http/client.py", line 1294, in _send_request
self.putheader(hdr, value)
File "/usr/local/python3/lib/python3.9/http/client.py", line 1226, in putheader
values[i] = one_value.encode('latin-1')
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 38-39: ordinal not in range(256)
第一步:
在网络上找问题分析,
https://stackoverflow.com/questions/66339110/python-session-get-response-uses-latin-1-instead-of-utf-8-encoding
发现几乎雷同一大堆,都是关于改写源码的 latin-1 为 utf-8,源码修改 总感觉不太好,,,
第二步:
从报错可以看出:self.putheader(hdr, value) 可知应该是请求头的报错;
由报错和第一步可知,和编码有关,而 latin-1编码适用于 大小写英文字母,阿拉伯数字,及常用的标点符等,那么是不是有些超出了此范围呢?
经过检查发现,请求头中:referer防盗链 brand_name 包含 汉字
headers['referer'] = 'https://www.zhihu.com/search?q={}&type=content&sort=created_time'.format(brand_name)
遂将 汉字进行url编码
from urllib.parse import quote
headers['referer'] = 'https://www.zhihu.com/search?q={}&type=content&sort=created_time'.format(quote(brand_name))
至此,搞定。