Codec latin 1 không thể mã hóa các yêu cầu python ký tự

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

"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
1、
"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
2、
"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
0这三个字段加上:

'Authorization': config['spider9']['Authorization'].encode['utf-8'].decode['latin1']
复制代码

这样倒是不会报这个

"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
1的错误,但是后端服务那边直接报错说没有登录了……

所以这又是啥问题呢?

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

export PYTHONUTF8=1
复制代码

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

________số 8

输出结果

utf-8
UTF-8
复制代码

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

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

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

后续

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

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

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

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

参考资料

  • ngăn xếp chồng lên nhau. com/câu hỏi/6…
  • www. cnblog. com/xtmp/p/1269…

Lỗi 1910416 - Cập nhật ngăn xếp báo cáo lỗi mặc dù mọi thứ đều ổn. k. do sự cố mã hóa - UnicodeEncodeError. codec 'latin-1' không thể mã hóa ký tự '\u2192' ở vị trí 1702. thứ tự không nằm trong phạm vi [256]

Báo cáo cập nhật ngăn xếp không thành công mặc dù mọi thứ đều ổn. k. do mã hóa tôi

Liên kếtHệ thốngIDRiêng tưƯu tiênTrạng tháiTóm tắtCập nhật lần cuốiTrình theo dõi vấn đề mũ đỏOSP-14260Không cóKhông cóKhông có


Nó hiện diện trong mã trang 1252 [Tây Âu]. Đây là mã hóa dành riêng cho Windows dựa trên ISO-8859-1 nhưng đặt các ký tự bổ sung vào phạm vi 0x80-0x9F. Trang mã 1252 thường bị nhầm lẫn với ISO-8859-1 và đó là một hành vi khó chịu nhưng hiện là tiêu chuẩn của trình duyệt web nếu bạn cung cấp các trang của mình dưới dạng ISO-8859-1, thì trình duyệt sẽ coi chúng là cp1252 thay vào đó. Tuy nhiên, chúng thực sự là hai bảng mã riêng biệt

"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
0

Nếu bạn chỉ đang sử dụng cơ sở dữ liệu của mình dưới dạng lưu trữ byte, bạn có thể sử dụng cp1252 để mã hóa

"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
3 và các ký tự khác có trong trang mã phương Tây của Windows. Nhưng các ký tự Unicode khác không có trong cp1252 sẽ gây ra lỗi

Bạn có thể sử dụng

"spider9": {
  "Authorization": "Basic Z2VjZW50ZXJfYWR",
  "Blade-Auth": "bearer eyJhbGciOiJIUzI1NiIsI",
  "cookie": "oauth=eyJhY2Nlc3NfdG"
}
复制代码
4 để loại bỏ các lỗi bằng cách loại bỏ các ký tự, nhưng thực sự trong thế kỷ này, bạn nên sử dụng UTF-8 trong cả cơ sở dữ liệu và trang của mình. Mã hóa này cho phép sử dụng bất kỳ ký tự nào. Tốt nhất, bạn cũng nên nói với MySQL rằng bạn đang sử dụng chuỗi UTF-8 [bằng cách đặt kết nối cơ sở dữ liệu và đối chiếu trên các cột chuỗi], để nó có thể so sánh và sắp xếp phân biệt chữ hoa chữ thường đúng cách

Mã hóa latin1 trong Python là gì?

Mã hóa văn bản đơn giản nhất [được gọi là 'latin-1' hoặc 'iso-8859-1' ] ánh xạ các điểm mã 0–255 thành các byte 0x0 – 0xff , which means that a string object that contains code points above U+00FF can't be encoded with this codec.

mã hóa là gì =' Latin

Latin-1 [hoặc chính thức hơn, ISO-8859-1] là tiêu chuẩn mã hóa ký tự . Nó xác định một tập hợp các ký tự được sử dụng cho các ngôn ngữ chính ở Tây Âu.

mã hóa utf 8 python là gì?

UTF-8 là một trong những bảng mã được sử dụng phổ biến nhất và Python thường mặc định sử dụng nó. UTF là viết tắt của “Định dạng chuyển đổi Unicode” và '8' có nghĩa là các giá trị 8 bit được sử dụng trong mã hóa. [Cũng có bảng mã UTF-16 và UTF-32, nhưng chúng ít được sử dụng hơn UTF-8. ]

Chủ Đề