每一位成功的程序员,背后也许都站着无数的秃头的男人——为其提供各种开发工具&代码库,当然也包括…… 各种玄学bug……

玄学的开端

最近在用Python做一个爬虫项目的时候遇到一个很奇怪的问题,而且还不是每次都会触发,实在是令人费解……

报错信息如下:

  1. 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之路

看代码

(又臭又长不看,建议跳过看后续)

先看看我提交的数据的格式吧~

这是身份认证相关的(太长只截取一部分)

  1. "spider9": {
  2. "Authorization": "Basic Z2VjZW50ZXJfYWR",
  3. "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  4. "cookie": "oauth=eyJhY2Nlc3NfdG"
  5. }

以下是header部分代码

  1. headers = {
  2. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
  3. 'Accept': 'application/json, text/plain, */*',
  4. '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',
  5. 'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/json;charset=utf-8',
  6. 'Authorization': config['spider9']['Authorization'],
  7. 'Blade-Auth': config['spider9']['Blade-Auth'].encode('utf-8').decode('latin1'),
  8. 'Content-Length': '60', 'Connection': 'keep-alive',
  9. 'Cookie': config['spider9']['cookie'],
  10. 'Pragma': 'no-cache', 'Cache-Control': 'no-cache',
  11. }

以下是requests请求代码:

  1. response = requests.post(
  2. url, headers=headers, verify=False,
  3. json={
  4. 'cityCode': '1234',
  5. 'createTimeFrom': None,
  6. 'createTimeTo': None
  7. }
  8. )

单纯看这代码,应该是完全没啥问题的,事实上我其他的爬虫也都是这样写的,已经稳定运行一年多了,就最近新写的这个爬虫不行… 有时候代码问题就是这么玄学

刚才说查到网友说先encode再decode的方法,我试着在headers里的AuthorizationBlade-AuthCookie这三个字段加上:

  1. 'Authorization': config['spider9']['Authorization'].encode('utf-8').decode('latin1')

这样倒是不会报这个UnicodeEncodeError的错误,但是后端服务那边直接报错说没有登录了……

所以这又是啥问题呢?

继续Stack Overflow查一下,有毛子网友说也遇到这个问题,下面有回答让设置环境变量试试,ok,那我也跟着试试看:

  1. export PYTHONUTF8=1

然后在Python里打印一下系统编码和locale:

  1. import sys
  2. import locale
  3. print(sys.getfilesystemencoding())
  4. print(locale.getpreferredencoding())

输出结果

  1. utf-8
  2. UTF-8

哦吼~ 再试试能不能跑… 还是不行,醉了,那就根本不是这个问题。

好吧,我投降了,不想死磕了。在哪里跌倒,就在哪里躺下

所以是什么问题呢?至今还是未解之谜…

后续

心好累,改用C#写爬虫,放弃Python…

说好的“人生苦短,我用Python”呢?怎么变得这么折腾了 TAT…

(PS:我之前做了一个爬虫平台,可以对不同语言实现的爬虫程序进行调度,提供统一的配置中心、统一的数据持久化接口~ 所以每个爬虫用什么语言写区别并不大)

写下这篇文章就当做记录,希望以后的某一天,这个问题能得到解决~ (美好的愿望)

参考资料

使用requests爬虫遇到的一个奇葩的问题:UnicodeEncodeError: 'latin-1' codec can't encode character的更多相关文章

  1. python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法

    原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...

  2. Requests爬虫

    一.request入门 之前写过一个urllib的爬虫方法,这个库是python内建的,从那篇文章也可以看到,使用起来很繁琐.现在更流行的一个爬虫库就是requests,他是基于urllib3封装的, ...

  3. [nginx]nginx的一个奇葩问题 500 Internal Server Error phpstudy2018 nginx虚拟主机配置 fastadmin常见问题处理

    [nginx]nginx的一个奇葩问题 500 Internal Server Error 解决方案 nginx 一直报500 Internal Server Error 错误,配置是通过phpstu ...

  4. 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 ...

  5. 爬虫基础以及一个简单的实例(requests,re)

    最近在看爬虫方面的知识,看到崔庆才所著的<Python3网络爬虫开发实战>一书讲的比较系统,果断入手学习.下面根据书中的内容,简单总结一下爬虫的基础知识,并且实际练习一下.详细内容请见:h ...

  6. requests 爬虫

    爬虫 常用爬虫爬取网页,但如果一直爬取会被ban掉,因此需要对爬虫进行一些改进反反爬 使用requests和beautifulsoup4构建爬虫,1.随机user-agent:2.ip代理:4.coo ...

  7. Python requests库如何下载一个图片资源

    原文地址https://blog.csdn.net/u011541946/article/details/77700074 前面一篇文章介绍了response对象的一些常用API,也已经提到,我们的重 ...

  8. 一:requests爬虫基础

    一,什么是爬虫? 描述: 本质是一个自动化程序,一个模拟浏览器向某一个服务器发送请求获取响应资源的过程. 爬虫的基本流程 robots.txt协议 编写一个robots.txt的协议文件来约束爬虫程序 ...

  9. python爬虫 抓取一个网站的所有网址链接

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  10. python +requests 爬虫-爬取图片并进行下载到本地

    因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地   爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...

随机推荐

  1. MS17-010(永恒之蓝)漏洞分析与复现

    一.漏洞简介1.永恒之蓝介绍:永恒之蓝漏洞(MS17-010),它的爆发源于 WannaCry 勒索病毒的诞生,该病毒是不法分子利用NSA(National Security Agency,美国国家安 ...

  2. Java 并发编程(二 )Thread

    线程状态 线程一般的状态转换图如下: 在线程生命周期中存在的状态解释如下: New(初始化)状态 此时线程刚刚被实例化,可以通过调用 start() 方法来启动这个实例化的的线程,使其状态转变成为 R ...

  3. 面试官:请说一下Mysql事务实现原理

    在日常工作中,数据库是我们必须使用的,其中使用最多的也是大部分中小公司的选择是Mysql,跳槽面试中也是必问的,今天我们就说一下Mysql事务 MySQL中的事务实现原理主要涉及以下几个方面: ACI ...

  4. 如何在IIS上部署docsify以及404问题

    操作步骤 创建一个文件夹,在文件夹中新建2个文件 index.html:入口文件,整个网站只需要这个html文件,其他文件都是md文件 README.md:主页内容,如果没有这个文件,访问时提示404 ...

  5. 借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05

    指针是指什么?指针是存储另一个变量的内存地址的变量.变量是一种使用方便的占位符,用于引用计算机内存地址,一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址.类比的话,指针就是书籍中的目录, ...

  6. 神经网络入门篇:激活函数的导数(Derivatives of activation functions)

    激活函数的导数 在神经网络中使用反向传播的时候,真的需要计算激活函数的斜率或者导数.针对以下四种激活,求其导数如下: 1)sigmoid activation function 图1.8.1 其具体的 ...

  7. 你的JoinHint为什么不生效

    本文分享自华为云社区<你的JoinHint为什么不生效[绽放吧!GaussDB(DWS)云原生数仓]>,作者:你是猴子请来的救兵吗 . 引言 提起数据库的Hint,几乎每个DBA都知道这一 ...

  8. 输入的查询SQL语句,是如何执行的?

    摘要:输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程. 本文分享自华为云社区<一条查询SQL是如何执行的>,作者: 共饮一杯无 . 执行如下SQL,我们看到的只 ...

  9. TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉

    在C++有Java这种强类型语言中,常用的Array.List.Set ,在集合中只能是一种类型(可以复习下:<再谈Java数据结构-分析底层实现与应用注意事项). int data[] = n ...

  10. 总结MySQL 的一些知识点:MySQL 连接的使用

    MySQL 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...