自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【Python爬蟲】一招搞定發(fā)送中文HTTP請(qǐng)求頭

開發(fā) 后端
有時(shí)需要將HTTP請(qǐng)求頭的值設(shè)為中文,但如果直接設(shè)成中文,會(huì)拋出異常,例如,下面的代碼為Chinese請(qǐng)求頭設(shè)置了中文。

[[385644]]

 有時(shí)需要將HTTP請(qǐng)求頭的值設(shè)為中文,但如果直接設(shè)成中文,會(huì)拋出異常,例如,下面的代碼為Chinese請(qǐng)求頭設(shè)置了中文。

  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) 

執(zhí)行這段代碼,會(huì)拋出如下的異常。

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

這個(gè)異常表明HTTP請(qǐng)求頭只能是英文字符和符號(hào),不能是雙字節(jié)的文字,如中文。為了解決這個(gè)問題,在設(shè)置HTTP請(qǐng)求頭時(shí)需要將中文編碼,然后發(fā)送到服務(wù)端后,在服務(wù)端用同樣的規(guī)則解碼。可以采用多種編碼方式,例如url編碼,base64編碼,url編碼就是在瀏覽器地址欄中如果輸入中文,會(huì)將其轉(zhuǎn)換為%xx的形式。如輸入“中國(guó)”,會(huì)變成E4%B8%AD%E5%9B%BD。

對(duì)字符串url編碼,需要使用urllib.parse模塊的urlencode函數(shù),解碼要使用unquote函數(shù),代碼如下:

  1. from urllib.parse import unquote,urlencode 
  2. # 對(duì)中文進(jìn)行編碼 
  3. value = urlencode({'name':'李寧'}) 
  4. print(value) 
  5. # 對(duì)中文進(jìn)行解碼 
  6. print(unquote(value)) 

執(zhí)行這段代碼,會(huì)輸出如下結(jié)果:

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

使用urlencode函數(shù)進(jìn)行編碼時(shí),需要指定字典類型,不能直接對(duì)字符串進(jìn)行編碼。因?yàn)閡rlencode函數(shù)只能對(duì)url參數(shù)進(jìn)行編碼。

base64編碼需要使用base64模塊中的b64encode函數(shù),解碼使用b64decode函數(shù),代碼如下:

  1. import base64 
  2. # 對(duì)中文進(jìn)行編碼 
  3. base64Value = base64.b64encode(bytes('Python從菜鳥到高手',encoding='utf-8')) 
  4. print(str(base64Value,'utf-8')) 
  5. # 對(duì)中文進(jìn)行解碼,并按utf-8編碼格式將解碼后的結(jié)果轉(zhuǎn)換為字符串 
  6. print(str(base64.b64decode(base64Value),'utf-8')) 

b64encode函數(shù)編碼后返回的是bytes類型,需要使用str函數(shù)將其轉(zhuǎn)換為字符串類型。b64decode函數(shù)解碼時(shí)需要指定bytes類型的值,b64decode函數(shù)的返回值也是bytes類型,所以也需要str函數(shù)將該函數(shù)的返回值轉(zhuǎn)換為字符串。

下面的例子演示了設(shè)置中文HTTP請(qǐng)求頭,并對(duì)其解碼的完整過程。

  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':'李寧'}),  # 設(shè)置中文HTTP請(qǐng)求頭,用url編碼格式 
  9.     # 設(shè)置中文HTTP請(qǐng)求頭,用base64編碼格式 
  10.     'MyChinese':base64.b64encode(bytes('這是中文HTTP請(qǐng)求頭',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請(qǐng)求頭,url編碼格式 
  18. req.add_header('Chinese2',urlencode({"國(guó)籍":"中國(guó)"})) 
  19. response=request.urlopen(req) 
  20. # 獲取服務(wù)端的響應(yīng)信息 
  21. value = response.read().decode('utf-8'
  22. print(value) 
  23. import json 
  24. # 將返回值轉(zhuǎn)換為json對(duì)象 
  25. responseObj = json.loads(value) 
  26. # 解碼url編碼格式的HTTP請(qǐng)求頭 
  27. print(unquote(responseObj['headers']['Chinese1'])) 
  28. # 解碼url編碼格式的HTTP請(qǐng)求頭 
  29. print(unquote(responseObj['headers']['Chinese2'])) 
  30. # 解碼base64編碼格式的HTTP請(qǐng)求頭 
  31. print(str(base64.b64decode(responseObj['headers']['Mychinese']),'utf-8')) 

運(yùn)行結(jié)果如圖1所示。

圖1 設(shè)置中文HTTP請(qǐng)求頭

本文轉(zhuǎn)載自微信公眾號(hào)「極客起源」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系極客起源公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 極客起源
相關(guān)推薦

2022-09-06 11:53:00

開發(fā)計(jì)算

2010-03-16 08:59:45

Windows 7純凈版安裝

2015-08-03 14:02:37

Windows 10升級(jí)

2023-12-18 08:24:09

LinuxPythonWord

2020-12-31 13:17:57

手機(jī)電腦多屏協(xié)同

2020-10-20 08:01:30

MySQL密碼Windows

2019-01-23 10:11:43

Python爬蟲IP

2022-01-25 13:00:52

前端設(shè)計(jì)優(yōu)化

2021-08-21 23:33:16

iOS蘋果系統(tǒng)

2021-12-13 06:56:46

TCP孤兒連接

2025-04-18 09:49:48

2013-07-30 11:24:33

SAP“簡(jiǎn)化IT 一招

2018-08-14 05:21:43

路由器網(wǎng)絡(luò)運(yùn)維網(wǎng)絡(luò)

2021-01-25 05:41:25

Flash Fliqlo軟件

2021-11-22 11:30:37

JavaScript代碼瀏覽器

2021-08-02 05:16:36

IE技巧操作系統(tǒng)

2024-05-31 14:04:18

2022-12-26 09:16:56

請(qǐng)求量代碼QPS

2017-02-28 20:03:49

WIFI無(wú)線網(wǎng)卡

2022-06-21 09:27:01

PythonFlaskREST API
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)