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

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

from urllib import request url = http://httpbin.org/post headers = {      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,     Host:httpbin.org,     Chinese:李宁, } req = request.Request(url = url,headers=headers,method="POST") request.urlopen(req) 

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

UnicodeEncodeError: latin-1 codec cant 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函数,代码如下:

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

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

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

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

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

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

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

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

from urllib import request from urllib.parse import unquote,urlencode import base64 url = http://httpbin.org/post headers = {      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,     Host:httpbin.org,     Chinese1:urlencode({ name:李宁}),  # 设置中文HTTP请求头,用url编码格式     # 设置中文HTTP请求头,用base64编码格式     MyChinese:base64.b64encode(bytes(这是中文HTTP请求头,encoding=utf-8)),     who:Python Scrapy } dict = {      name:Bill,     age:30 } data = bytes(urlencode(dict),encoding=utf-8) req = request.Request(url = url,data=data,headers=headers,method="POST") # 通过add_header方法添加中文HTTP请求头,url编码格式 req.add_header(Chinese2,urlencode({ "国籍":"中国"})) response=request.urlopen(req) # 获取服务端的响应信息 value = response.read().decode(utf-8) print(value) import json # 将返回值转换为json对象 responseObj = json.loads(value) # 解码url编码格式的HTTP请求头 print(unquote(responseObj[headers][Chinese1])) # 解码url编码格式的HTTP请求头 print(unquote(responseObj[headers][Chinese2])) # 解码base64编码格式的HTTP请求头 print(str(base64.b64decode(responseObj[headers][Mychinese]),utf-8)) 

运行结果如图1所示。

图1 设置中文HTTP请求头

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

数据库
上一篇:“巅峰之战,一码当先”, 第三届“先导杯”强势来袭
下一篇:戴尔PowerEdge R740XD服务器 助力石油行业探索数字转型之道