使用requests爬虫遇到的一个奇葩的问题:UnicodeEncodeError: 'latin-1' codec can't encode character
每一位成功的程序员,背后也许都站着无数的秃头的男人——为其提供各种开发工具&代码库,当然也包括…… 各种玄学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:我之前做了一个爬虫平台,可以对不同语言实现的爬虫程序进行调度,提供统一的配置中心、统一的数据持久化接口~ 所以每个爬虫用什么语言写区别并不大)
写下这篇文章就当做记录,希望以后的某一天,这个问题能得到解决~ (美好的愿望)
参考资料
- https://stackoverflow.com/questions/64769797/latin-1-codec-cant-encode-character-u2019
- https://www.cnblogs.com/xtmp/p/12693862.html
使用requests爬虫遇到的一个奇葩的问题:UnicodeEncodeError: 'latin-1' codec can't encode character的更多相关文章
- python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...
- Requests爬虫
一.request入门 之前写过一个urllib的爬虫方法,这个库是python内建的,从那篇文章也可以看到,使用起来很繁琐.现在更流行的一个爬虫库就是requests,他是基于urllib3封装的, ...
- [nginx]nginx的一个奇葩问题 500 Internal Server Error phpstudy2018 nginx虚拟主机配置 fastadmin常见问题处理
[nginx]nginx的一个奇葩问题 500 Internal Server Error 解决方案 nginx 一直报500 Internal Server Error 错误,配置是通过phpstu ...
- Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...
- 爬虫基础以及一个简单的实例(requests,re)
最近在看爬虫方面的知识,看到崔庆才所著的<Python3网络爬虫开发实战>一书讲的比较系统,果断入手学习.下面根据书中的内容,简单总结一下爬虫的基础知识,并且实际练习一下.详细内容请见:h ...
- requests 爬虫
爬虫 常用爬虫爬取网页,但如果一直爬取会被ban掉,因此需要对爬虫进行一些改进反反爬 使用requests和beautifulsoup4构建爬虫,1.随机user-agent:2.ip代理:4.coo ...
- Python requests库如何下载一个图片资源
原文地址https://blog.csdn.net/u011541946/article/details/77700074 前面一篇文章介绍了response对象的一些常用API,也已经提到,我们的重 ...
- 一:requests爬虫基础
一,什么是爬虫? 描述: 本质是一个自动化程序,一个模拟浏览器向某一个服务器发送请求获取响应资源的过程. 爬虫的基本流程 robots.txt协议 编写一个robots.txt的协议文件来约束爬虫程序 ...
- python爬虫 抓取一个网站的所有网址链接
sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...
- python +requests 爬虫-爬取图片并进行下载到本地
因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地 爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...
随机推荐
- vulnhub - Fawks - writeup
信息收集 目标开放了21的ftp有匿名登录,除此之外还有常规的80,和连个ssh的端口. 80端口的是一张图片,就是哈利波特的海报图. anonymous空密码登上去有一个文件下载下来是二进制的文件 ...
- Oracle数据库运维场景下,智能运维如何落地生根?
简介: 「智能运维大数据平台」是一款开箱即用的运维监控平台,通过特有的平台功能可以将企业的基础架构.应用程序.日志管理结合在一起,提供统一采集.统一存储.关联分析.统一监控企业业务保障能力,保障企业业 ...
- Java中常用不可变类
Java中常用的不可变类是指一旦被创建,它们的值就不可更改的类.在实际开发中,使用不可变类时可以带来多种优点,比如线程安全.缓存.副本等.下面我们将介绍Java中常见的不可变类: 1.字符串(Stri ...
- Mybatis源码4 Cache的实现和其原理
Mybatis CachingExecutor, 二级缓存,缓存的实现 一丶二级缓存概述 上一章节,我们知道mybaits在构造SqlSession的时候,需要让SqlSession持有一个执行器,如 ...
- 2023-11-04:用go语言,如果n = 1,打印 1*** 如果n = 2,打印 1*** 3*** 2*** 如果n = 3,打印
2023-11-04:用go语言,如果n = 1,打印 1*** 如果n = 2,打印 1*** 3*** 2*** 如果n = 3,打印 1*** 3*** 2*** 4*** 5*** 6*** ...
- OPPO关停自研芯片公司哲库,这对行业将产生什么影响?
OPPO什么时候关停自研芯片公司哲库? 公元2023年5月12日,OPPO关停了自研芯片公司哲库.这也是汶川大地震的日子,而OPPO创始人是四川人,真是冥冥之中自有天意.OPPO公司在一份声明中表示, ...
- nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接
nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题. 替换成openres ...
- Blog Statistics Dec 1, 2021 - Dec 1, 2022
1. Overview Data Date: Dec 1, 2021 - Dec 1, 2022 Number of articles: 51 All Platform Total Visits: 3 ...
- GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具
本文分享自华为云社区<GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具>,作者:华为云数据库和应用迁移专家. 前言 我们先从一个SQL语句说起(以某传统 ...
- 论文推荐|TDSC2022 安全补丁识别最新的方案E-SPI
摘要:TDSC 2022发表了安全补丁识别最新的方案"Enhancing Security Patch Identification by Capturing Structures in C ...