日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
【Python爬蟲】一招搞定發(fā)送中文HTTP請求頭

 有時(shí)需要將HTTP請求頭的值設(shè)為中文,但如果直接設(shè)成中文,會拋出異常,例如,下面的代碼為Chinese請求頭設(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. }
  8. req = request.Request(url = url,headers=headers,method="POST")
  9. request.urlopen(req)

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

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

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

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

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

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

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

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

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

 
 
 
 
  1. import base64
  2. # 對中文進(jìn)行編碼
  3. base64Value = base64.b64encode(bytes('Python從菜鳥到高手',encoding='utf-8'))
  4. print(str(base64Value,'utf-8'))
  5. # 對中文進(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請求頭,并對其解碼的完整過程。

 
 
 
 
  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請求頭,用url編碼格式
  9.     # 設(shè)置中文HTTP請求頭,用base64編碼格式
  10.     'MyChinese':base64.b64encode(bytes('這是中文HTTP請求頭',encoding='utf-8')),
  11.     'who':'Python Scrapy'
  12. }
  13. dict = {
  14.     'name':'Bill',
  15.     'age':30
  16. }
  17. data = bytes(urlencode(dict),encoding='utf-8')
  18. req = request.Request(url = url,data=data,headers=headers,method="POST")
  19. # 通過add_header方法添加中文HTTP請求頭,url編碼格式
  20. req.add_header('Chinese2',urlencode({"國籍":"中國"}))
  21. response=request.urlopen(req)
  22. # 獲取服務(wù)端的響應(yīng)信息
  23. value = response.read().decode('utf-8')
  24. print(value)
  25. import json
  26. # 將返回值轉(zhuǎn)換為json對象
  27. responseObj = json.loads(value)
  28. # 解碼url編碼格式的HTTP請求頭
  29. print(unquote(responseObj['headers']['Chinese1']))
  30. # 解碼url編碼格式的HTTP請求頭
  31. print(unquote(responseObj['headers']['Chinese2']))
  32. # 解碼base64編碼格式的HTTP請求頭
  33. print(str(base64.b64decode(responseObj['headers']['Mychinese']),'utf-8'))

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

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

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


分享文章:【Python爬蟲】一招搞定發(fā)送中文HTTP請求頭
文章地址:http://www.5511xx.com/article/cocosij.html