一个玄学的爬虫bug竟让我放弃Python语言!?背后的原因令人唏嘘~
每一位成功的程序员,背后也许都站着无数秃头的男人——为其提供各种开发工具&代码库,当然也包括…… 各种玄学bug…… 玄学的开端 最近在用Python做一个爬虫项目的时候遇到一个很奇怪的问题,而且还不是每次都会触发,实在是令人费解…… 报错信息如下: UnicodeEncodeError: 'latin-1' codec can't encode character '\u2026' in pos
目录4 个章节
每一位成功的程序员,背后也许都站着无数秃头的男人——为其提供各种开发工具&代码库,当然也包括…… 各种玄学bug……
玄学的开端
最近在用Python做一个爬虫项目的时候遇到一个很奇怪的问题,而且还不是每次都会触发,实在是令人费解……
报错信息如下:
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2026' in position 512: ordinal not in range(256)
把错误信息拿到搜索引擎去查询一番,中文社区上的说法是在请求的body或者headers里有中文数据,
解决方法是:先encode成UTF-8然后再用latin-1编码decode出来。
不过我请求的数据里面没有中文啊!
由此踏上了令人头秃的抓bug之路
看代码
(又臭又长不看,建议跳过看后续)
先看看我提交的数据的格式吧~
这是身份认证相关的(太长只截取一部分)
"spider9": {
"Authorization": "Basic Z2VjZW50ZXJfYWR",
"Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
"cookie": "oauth=eyJhY2Nlc3NfdG"
}
以下是header部分代码
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/json;charset=utf-8',
'Authorization': config['spider9']['Authorization'],
'Blade-Auth': config['spider9']['Blade-Auth'].encode('utf-8').decode('latin1'),
'Content-Length': '60', 'Connection': 'keep-alive',
'Cookie': config['spider9']['cookie'],
'Pragma': 'no-cache', 'Cache-Control': 'no-cache',
}
以下是requests请求代码:
response = requests.post(
url, headers=headers, verify=False,
json={
'cityCode': '1234',
'createTimeFrom': None,
'createTimeTo': None
}
)
单纯看这代码,应该是完全没啥问题的,事实上我其他的爬虫也都是这样写的,已经稳定运行一年多了,就最近新写的这个爬虫不行… 有时候代码问题就是这么玄学…
刚才说查到网友说先encode再decode的方法,我试着在headers里的Authorization、Blade-Auth、Cookie这三个字段加上:
'Authorization': config['spider9']['Authorization'].encode('utf-8').decode('latin1')
这样倒是不会报这个UnicodeEncodeError的错误,但是后端服务那边直接报错说没有登录了……
所以这又是啥问题呢?
继续Stack Overflow查一下,有毛子网友说也遇到这个问题,下面有回答让设置环境变量试试,ok,那我也跟着试试看:
export PYTHONUTF8=1
然后在Python里打印一下系统编码和locale:
import sys
import locale
print(sys.getfilesystemencoding())
print(locale.getpreferredencoding())
输出结果
utf-8
UTF-8
哦吼~ 再试试能不能跑… 还是不行,醉了,那就根本不是这个问题。
好吧,我投降了,不想死磕了。在哪里跌倒,就在哪里躺下
所以是什么问题呢?至今还是未解之谜…
后续
心好累,改用C#写爬虫,放弃Python…
说好的“人生苦短,我用Python”呢?怎么变得这么折腾了 TAT…
(PS:我之前做了一个爬虫平台,可以对不同语言实现的爬虫程序进行调度,提供统一的配置中心、统一的数据持久化接口~ 所以每个爬虫用什么语言写区别并不大)
写下这篇文章就当做记录,希望以后的某一天,这个问题能得到解决~ (美好的愿望)
参考资料
_EOF_
一个玄学的爬虫bug竟让我放弃Python语言!?背后的原因令人唏嘘~
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
Selenium爬虫实战:截取网页上的图片
前言 同样是为了刷课,没想到工作后依然和大学一样逃脱不了需要刷网课的命运…… 正文 直接说干货了,截取图片,需要截取的图片是什么图片大家都懂(说的就是你,验证码),其他图片的话不需要截取,直接拿到地址下载就行,验证码不行,同样的地址再访问一次内容就变了。 我不知道为啥selenium不能直接把特定img元素的图片拿出来,太反人类了。 根据我找到的资料,主要有两种思路,一种是模拟鼠标操作,在验证码上
2022-05-27 · 爬虫 · 约 1 分钟
爬虫笔记:代理池和线程池
前言 爬虫和反爬虫是一对矛和盾,反爬虫很常见的一个方法就是封IP,一个IP短时间内频繁访问,可以做限流或者是加入黑名单,我之前的后台开发相关博客也有涉及这一块。 不过今天说的是爬虫,所以应对的方法就是用代理池,每次请求都用不同的IP就行,再加上UA模拟,完全是正常用户的行为,可以避开限流和黑名单反爬。 然后爬虫是一种IO密集型程序,如果全程单线程执行那会很慢,因此可以用多线程来提高数据采集效率,不
2022-02-12 · 爬虫 · 约 1 分钟
Selenium爬虫实践:ajax请求抓包、浏览器退出
前言 最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能爬虫,但是cookie还经常失效,为了不每次登录失效就来找我重新注入Cookie,我写了一个手机版的网页,用来控制后台的selenium自动登录,截取token和cookie。 ajax请求抓包方案 搜索资料的过程真的痛苦,不过还好这时间没有白花,
2022-05-27 · 爬虫 · 约 1 分钟
编写爬虫下载公众号上好看的壁纸
很多年前我还在大学的时候,曾经写过一篇类似的文章,不过当时是采集某游戏官网上好看的壁纸。 最近微信公众号总是给我推荐各种壁纸,里面有不少好看的,不过一张张保存太麻烦了,索性写个爬虫自动下载。
2025-01-20 · 爬虫 · 约 1 分钟
讨论
共 0 条加载评论中…