【Python爬虫】一招搞定发送中文HTTP请求头

开发 后端
有时需要将HTTP请求头的值设为中文,但如果直接设成中文,会抛出异常,例如,下面的代码为Chinese请求头设置了中文。

[[385644]]

 有时需要将HTTP请求头的值设为中文,但如果直接设成中文,会抛出异常,例如,下面的代码为Chinese请求头设置了中文。

  1. from urllib import request 
  2. url = 'http://httpbin.org/post' 
  3. headers = { 
  4.     'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
  5.     'Host':'httpbin.org'
  6.     'Chinese':'李宁'
  7. req = request.Request(url = url,headers=headers,method="POST"
  8. request.urlopen(req) 

执行这段代码,会抛出如下的异常。

  1. UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256) 

这个异常表明HTTP请求头只能是英文字符和符号,不能是双字节的文字,如中文。为了解决这个问题,在设置HTTP请求头时需要将中文编码,然后发送到服务端后,在服务端用同样的规则解码。可以采用多种编码方式,例如url编码,base64编码,url编码就是在浏览器地址栏中如果输入中文,会将其转换为%xx的形式。如输入“中国”,会变成E4%B8%AD%E5%9B%BD。

对字符串url编码,需要使用urllib.parse模块的urlencode函数,解码要使用unquote函数,代码如下:

  1. from urllib.parse import unquote,urlencode 
  2. # 对中文进行编码 
  3. value = urlencode({'name':'李宁'}) 
  4. print(value) 
  5. # 对中文进行解码 
  6. print(unquote(value)) 

执行这段代码,会输出如下结果:

  1. name=%E6%9D%8E%E5%AE%81 
  2. name=李宁 

使用urlencode函数进行编码时,需要指定字典类型,不能直接对字符串进行编码。因为urlencode函数只能对url参数进行编码。

base64编码需要使用base64模块中的b64encode函数,解码使用b64decode函数,代码如下:

  1. import base64 
  2. # 对中文进行编码 
  3. base64Value = base64.b64encode(bytes('Python从菜鸟到高手',encoding='utf-8')) 
  4. print(str(base64Value,'utf-8')) 
  5. # 对中文进行解码,并按utf-8编码格式将解码后的结果转换为字符串 
  6. print(str(base64.b64decode(base64Value),'utf-8')) 

b64encode函数编码后返回的是bytes类型,需要使用str函数将其转换为字符串类型。b64decode函数解码时需要指定bytes类型的值,b64decode函数的返回值也是bytes类型,所以也需要str函数将该函数的返回值转换为字符串。

下面的例子演示了设置中文HTTP请求头,并对其解码的完整过程。

  1. from urllib import request 
  2. from urllib.parse import unquote,urlencode 
  3. import base64 
  4. url = 'http://httpbin.org/post' 
  5. headers = { 
  6.     'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
  7.     'Host':'httpbin.org'
  8.     'Chinese1':urlencode({'name':'李宁'}),  # 设置中文HTTP请求头,用url编码格式 
  9.     # 设置中文HTTP请求头,用base64编码格式 
  10.     'MyChinese':base64.b64encode(bytes('这是中文HTTP请求头',encoding='utf-8')), 
  11.     'who':'Python Scrapy' 
  12. dict = { 
  13.     'name':'Bill'
  14.     'age':30 
  15. data = bytes(urlencode(dict),encoding='utf-8'
  16. req = request.Request(url = url,data=data,headers=headers,method="POST"
  17. # 通过add_header方法添加中文HTTP请求头,url编码格式 
  18. req.add_header('Chinese2',urlencode({"国籍":"中国"})) 
  19. response=request.urlopen(req) 
  20. # 获取服务端的响应信息 
  21. value = response.read().decode('utf-8'
  22. print(value) 
  23. import json 
  24. # 将返回值转换为json对象 
  25. responseObj = json.loads(value) 
  26. # 解码url编码格式的HTTP请求头 
  27. print(unquote(responseObj['headers']['Chinese1'])) 
  28. # 解码url编码格式的HTTP请求头 
  29. print(unquote(responseObj['headers']['Chinese2'])) 
  30. # 解码base64编码格式的HTTP请求头 
  31. print(str(base64.b64decode(responseObj['headers']['Mychinese']),'utf-8')) 

运行结果如图1所示。

图1 设置中文HTTP请求头

本文转载自微信公众号「极客起源」,可以通过以下二维码关注。转载本文请联系极客起源公众号。

 

责任编辑:武晓燕 来源: 极客起源
相关推荐

2022-09-06 11:53:00

开发计算

2010-03-16 08:59:45

Windows 7纯净版安装

2020-12-31 13:17:57

手机电脑多屏协同

2020-10-20 08:01:30

MySQL密码Windows

2023-12-18 08:24:09

LinuxPythonWord

2015-08-03 14:02:37

Windows 10升级

2019-01-23 10:11:43

Python爬虫IP

2022-01-25 13:00:52

前端设计优化

2021-12-13 06:56:46

TCP孤儿连接

2021-08-21 23:33:16

iOS苹果系统

2018-08-14 05:21:43

路由器网络运维网络

2021-01-25 05:41:25

Flash Fliqlo软件

2013-07-30 11:24:33

SAP“简化IT 一招

2021-11-22 11:30:37

JavaScript代码浏览器

2017-02-28 20:03:49

WIFI无线网卡

2021-08-02 05:16:36

IE技巧操作系统

2022-06-21 09:27:01

PythonFlaskREST API

2022-12-26 09:16:56

请求量代码QPS

2023-01-03 15:36:44

2021-02-09 21:49:51

Python参数Get
点赞
收藏

51CTO技术栈公众号