編寫requests模塊是因?yàn)镻ython的urllib模塊用起來太復(fù)雜。
使用舉例
快速上手requests,參考中文文檔。
發(fā)起請求
發(fā)起GET請求直接使用requests的get方法即可。例如下面的代碼獲取百度首頁的信息:
import requests
baidu_url = 'https://www.baidu.com'
response = requests.get(baidu_url)
print(response.content.decode())
如果要在URL上附加參數(shù),使用params參數(shù)傳入字典即可,參數(shù)會(huì)自動(dòng)附加到URL上,列表參數(shù)也會(huì)正確的附加:
base_url = 'http://httpbin.org/'
params = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.get(f'{base_url}get', params=params)
print(response.url)
結(jié)果:
http://httpbin.org/get?name=yitian&age=22&friends=zhang3&friends=li4
其他常用的HTTP操作例如PUT、DELETE、HEAD、OPTIONS等也支持,調(diào)用相應(yīng)方法即可。
獲取結(jié)果
發(fā)起請求之后,返回值是一個(gè)Response對象,利用它我們可以方便的獲取結(jié)果。
Response對象的常用屬性和方法如下:
| 屬性名 | 結(jié)果 |
|---|---|
| text | HTTP字符 |
| encoding | 響應(yīng)編碼,這個(gè)值可以改變,改變之后text屬性也會(huì)根據(jù)編碼而變化 |
| content | 未編碼的二進(jìn)制數(shù)據(jù) |
| json() | 返回JSON數(shù)據(jù) |
| raw | 結(jié)果的原始字節(jié)流 |
| url | 請求的URL |
| status_code | 狀態(tài)碼 |
| headers | 請求頭字典 |
| cookies | cookies字典 |
| history | 如果發(fā)生重定向,所有請求對象都會(huì)保存到這里 |
自定義header
如果要在請求上添加請求頭,也非常簡單。有些網(wǎng)站對客戶端的限制比較嚴(yán)格,所以我們必須偽裝header。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
response = requests.get('http://httpbin.org/get', headers=headers)
print(response.text)
假如使用自帶的urllib標(biāo)準(zhǔn)庫,那么代碼就比較復(fù)雜了。從這里我們可以看到requests確實(shí)非常方便。
import urllib.request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
request = urllib.request.Request(baidu_url, headers=headers)
html = urllib.request.urlopen(request).read().decode()
print(html)
POST數(shù)據(jù)
如果我們要發(fā)送復(fù)雜的表單,就需要POST數(shù)據(jù)了。和GET傳送數(shù)據(jù)一樣,向方法中額外添加一個(gè)data參數(shù)。
data = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)
有時(shí)候POST數(shù)據(jù)不是使用表單方式,而是直接在請求體中附加參數(shù)。那么我們在發(fā)送參數(shù)的時(shí)候不能向data參數(shù)添加字典了,而應(yīng)該傳遞字符串。
import json
data = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=json.dumps(data))
print(response.text)
有些程序(例如Github的API)需要將JSON字符串直接當(dāng)做請求體發(fā)送,比如說上面這種將字典轉(zhuǎn)換為JSON的例子。在這種情況下,我們可以直接將字典的引用傳遞給方法的json參數(shù),這樣就不需要我們手動(dòng)轉(zhuǎn)換,requests會(huì)自動(dòng)轉(zhuǎn)換。
response = requests.post(f'{base_url}post', json=data)
上傳文件
在網(wǎng)頁上,上傳頭像等操作都需要上傳multipart/form-data類型的表單。使用requests也非常簡單。需要注意打開文件的時(shí)候最好使用二進(jìn)制模式,使用文本模式打開文件可能導(dǎo)致requests不能正確計(jì)算文件的大小。
file = open(r'c:\Windows\System32\drivers\etc\hosts', mode='rb')
data = {
'file': file
}
response = requests.post(f'{base_url}post', files=data)
print(response.text)
cookies
如果要獲取響應(yīng)的cookies,調(diào)用cookies屬性即可,它會(huì)返回一個(gè)RequestsCookieJar對象,它實(shí)現(xiàn)了標(biāo)準(zhǔn)庫的http.cookiejar。所以我們可以按照cookiejar的方法來使用RequestsCookieJar。比如說訪問百度的時(shí)候,它會(huì)分配一個(gè)cookie,所以我們可以使用下面的代碼獲取Cookie。
response = requests.get(baidu_url)
print(response.cookies)
如果要在發(fā)送數(shù)據(jù)的時(shí)候向服務(wù)器傳遞cookie,需要實(shí)例化一個(gè)RequestsCookieJar,然后傳遞給發(fā)送方法的cookies參數(shù)。
import requests.cookies
cookies = requests.cookies.RequestsCookieJar()
cookies.set('name', 'yitian')
response = requests.get(f'{base_url}cookies', cookies=cookies)
print(response.text)