urllib的Request詳解
一 點睛
urlopen()方法可以實現最基本請求的發起,但這幾個簡單的引數並不足以構建一個完整的請求。如果請求中需要加入Headers等資訊,就可以利用更強大的Request類來構建。
二 實戰
1 程式碼
import urllib.request
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
2 說明
我們依然是用urlopen()方法來發送這個請求,只不過這次該方法的引數不再是URL,而是一個Request型別的物件。通過構造這個資料結構,一方面我們可以將請求獨立成一個物件,另一方面可更加豐富和靈活地配置引數。
三 Request類介紹
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
-
第一個引數url用於請求URL,這是必傳引數,其他都是可選引數。
-
第二個引數data如果要傳,必須傳bytes(位元組流)型別的。如果它是字典,可以先用urllib.parse模組裡的urlencode()編碼。
-
第三個引數headers是一個字典,它就是請求頭,我們可以在構造請求時通過headers引數直接構造,也可以通過呼叫請求例項的add_header()方法新增。
新增請求頭最常用的用法就是通過修改User-Agent來偽裝瀏覽器,預設的User-Agent是Python-urllib,我們可以通過修改它來偽裝瀏覽器。比如要偽裝火狐瀏覽器,可以把它設定為:
Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
-
第四個引數origin_req_host指的是請求方的host名稱或者IP地址。
-
第五個引數unverifiable表示這個請求是否是無法驗證的,預設是False,意思就是說使用者沒有足夠許可權來選擇接收這個請求的結果。例如,我們請求一個HTML文件中的圖片,但是我們沒有自動抓取影象的許可權,這時unverifiable的值就是True`。
-
第六個引數method是一個字串,用來指示請求使用的方法,比如GET、POST和PUT等。
四 實戰
1 程式碼
from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Host': 'httpbin.org'
}
dict = {
'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
2 結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_1.py
{
"args": {},
"data": "",
"files": {},
"form": {
"name": "Germey"
},
"headers": {
"Accept-Encoding": "identity",
"Connection": "close",
"Content-Length": "11",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
},
"json": null,
"origin": "106.36.217.202",
"url": "http://httpbin.org/post"
}
3 說明
觀察結果可以發現,我們成功設定了data、headers和method。
另外,headers也可以用add_header()方法來新增,程式碼如下:
req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')