前面我寫(xiě)的爬蟲(chóng)用的都是Python自帶的的標(biāo)準(zhǔn)庫(kù)urllib憔古,這個(gè)庫(kù)用起來(lái)還行罢坝,不過(guò)有些操作比較麻煩暑始。所以現(xiàn)在我們來(lái)學(xué)習(xí)一下一個(gè)非常著名的HTTP庫(kù)——requests搭独。
打開(kāi)官網(wǎng)還有一段警告±染担可見(jiàn)requests的方便牙肝,可以幫我們避免這么多危險(xiǎn)。
警告:非專業(yè)使用其他 HTTP 庫(kù)會(huì)導(dǎo)致危險(xiǎn)的副作用嗤朴,包括:安全缺陷癥惊奇、冗余代碼癥、重新發(fā)明輪子癥播赁、啃文檔癥、抑郁吼渡、頭疼容为、甚至死亡。
好了寺酪,廢話不多說(shuō)坎背,如果沒(méi)有安裝requests的話,先來(lái)安裝一下寄雀。
pip install requests
使用舉例
如果想快速上手requests得滤,可以參考快速上手文檔。居然是中文文檔盒犹,翻譯的還不錯(cuò)懂更,真的很良心眨业。
發(fā)起請(qǐng)求
發(fā)起GET請(qǐng)求非常簡(jiǎn)單,直接使用requests的get方法即可沮协。比方說(shuō)下面的代碼獲取百度首頁(yè)的信息龄捡。
import requests
baidu_url = 'https://www.baidu.com'
response = requests.get(baidu_url)
print(response.content.decode())
如果要在URL上附加參數(shù),也非常簡(jiǎn)單慷暂,使用params參數(shù)傳入字典即可聘殖。參數(shù)會(huì)自動(dòng)附加到URL上,列表參數(shù)也會(huì)正確的附加行瑞。這里這個(gè)網(wǎng)站是一個(gè)HTTP調(diào)試網(wǎng)站奸腺,值得收藏。如果我們?cè)L問(wèn)這個(gè)網(wǎng)站血久,它會(huì)將瀏覽器發(fā)送的請(qǐng)求頭突照,用戶代理、表單參數(shù)等信息以格式化JSON形式返回洋魂,對(duì)HTTP調(diào)試非常有幫助绷旗。
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ā)起請(qǐng)求之后角骤,返回值是一個(gè)Response對(duì)象,利用它我們可以方便的獲取結(jié)果心剥。
響應(yīng)對(duì)象的常用屬性和方法如下邦尊。
屬性名 | 結(jié)果 |
---|---|
text | HTTP字符 |
encoding | 響應(yīng)編碼,這個(gè)值可以改變优烧,改變之后text屬性也會(huì)根據(jù)編碼而變化 |
content | 未編碼的二進(jìn)制數(shù)據(jù) |
json() | 返回JSON數(shù)據(jù) |
raw | 結(jié)果的原始字節(jié)流 |
url | 請(qǐng)求的URL |
status_code | 狀態(tài)碼 |
headers | 請(qǐng)求頭字典 |
cookies | cookies字典 |
history | 如果發(fā)生重定向蝉揍,所有請(qǐng)求對(duì)象都會(huì)保存到這里 |
自定義header
如果要在請(qǐng)求上添加請(qǐng)求頭,也非常簡(jiǎn)單畦娄。有些網(wǎng)站對(duì)客戶端的限制比較嚴(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)庫(kù)熙卡,那么代碼就比較復(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ù)的事兒颓鲜。這種方式相當(dāng)于你在表單中填寫(xiě)這些數(shù)據(jù)表窘,然后點(diǎn)擊表單的提交典予。
data = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)
有時(shí)候POST數(shù)據(jù)不是使用表單方式,而是直接在請(qǐng)求體中附加參數(shù)蚊丐。那么我們?cè)诎l(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)做請(qǐng)求體發(fā)送麦备,比如說(shuō)上面這種將字典轉(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)頁(yè)上呛梆,上傳頭像等操作都需要上傳multipart/form-data類型的表單锐涯。使用requests也非常簡(jiǎn)單。需要注意打開(kāi)文件的時(shí)候最好使用二進(jìn)制模式填物,使用文本模式打開(kāi)文件可能導(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
對(duì)象升薯,它實(shí)現(xiàn)了標(biāo)準(zhǔn)庫(kù)的http.cookiejar。所以我們可以按照cookiejar的方法來(lái)使用RequestsCookieJar
击困。比如說(shuō)訪問(wèn)百度的時(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)
以上就是requests的快速入門(mén)了蹦浦。其實(shí)寫(xiě)完了我才發(fā)現(xiàn)我寫(xiě)的有點(diǎn)多余,因?yàn)閞equests的國(guó)際化做得很好撞蜂,有官方中文文檔盲镶。所以有什么問(wèn)題的話,直接看文檔吧谅摄!不愁看不懂。