Python HTTP庫(kù)requests 介紹

前面我寫(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)題的話,直接看文檔吧谅摄!不愁看不懂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末系馆,一起剝皮案震驚了整個(gè)濱河市送漠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌由蘑,老刑警劉巖闽寡,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代兵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爷狈,警方通過(guò)查閱死者的電腦和手機(jī)植影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涎永,“玉大人思币,你說(shuō)我怎么就攤上這事∠畚ⅲ” “怎么了谷饿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妈倔。 經(jīng)常有香客問(wèn)我博投,道長(zhǎng),這世上最難降的妖魔是什么盯蝴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任毅哗,我火速辦了婚禮,結(jié)果婚禮上捧挺,老公的妹妹穿的比我還像新娘虑绵。我一直安慰自己,他們只是感情好松忍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布蒸殿。 她就那樣靜靜地躺著,像睡著了一般鸣峭。 火紅的嫁衣襯著肌膚如雪宏所。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天摊溶,我揣著相機(jī)與錄音爬骤,去河邊找鬼。 笑死莫换,一個(gè)胖子當(dāng)著我的面吹牛霞玄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拉岁,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坷剧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喊暖?” 一聲冷哼從身側(cè)響起惫企,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狞尔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丛版,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年偏序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了页畦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡研儒,死狀恐怖豫缨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殉摔,我是刑警寧澤州胳,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站逸月,受9級(jí)特大地震影響栓撞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碗硬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一瓤湘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恩尾,春花似錦弛说、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冀偶,卻和暖如春醒第,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背进鸠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稠曼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人客年。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓霞幅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親量瓜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子司恳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容