Python自動(dòng)化測(cè)試requests模塊

一焙格、簡(jiǎn)介

requests庫(kù)是 python 用來(lái)發(fā)送 http 請(qǐng)求。它是 Python 語(yǔ)言里網(wǎng)絡(luò)請(qǐng)求庫(kù)中最好用的井氢,沒(méi)有之一腾务。
requests 庫(kù)有完善詳盡的[官方文檔]https://docs.python-requests.org/zh_CN/latest/?utm_source=testingpai.com

二、發(fā)送請(qǐng)求

1 請(qǐng)求方法

每一個(gè)請(qǐng)求方法都有一個(gè)對(duì)應(yīng)的 API驴娃,比如 GET 請(qǐng)求就可以使用 get() 方法

import requests
resp = requests.get('https://www.baidu.com')
resp = requests.post('http://httpbin.org/post', data = {'key':'value'})
requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

常用的請(qǐng)求方法是get請(qǐng)求和post請(qǐng)求

1.1 傳遞URL參數(shù)(針對(duì)get請(qǐng)求)

get請(qǐng)求有兩種情況奏候,一種是沒(méi)有帶參數(shù)的,比如唇敞,請(qǐng)求百度首頁(yè)

resp = requests.get('https://www.baidu.com')

另一種是帶URL參數(shù)的蔗草,此時(shí)需要使用params關(guān)鍵字參數(shù)

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)

通過(guò)打印輸出該 URL咒彤,你能看到 URL 已被正確編碼:

print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

有時(shí)候會(huì)遇到相同的 url 參數(shù)名,但有不同的值咒精,而 python 的字典又不支持鍵的重名镶柱,那么我們可以把鍵的值用列表表示

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3

1.2 傳遞表單參數(shù)(data 參數(shù))(針對(duì)post請(qǐng)求)

一般上post請(qǐng)求才有表單參數(shù),但是不是所有的post請(qǐng)求都是用表單參數(shù)
通常模叙,你想要發(fā)送一些編碼為表單形式的數(shù)據(jù)——非常像一個(gè) HTML 表單歇拆。

要實(shí)現(xiàn)這個(gè),只需簡(jiǎn)單地傳遞一個(gè)字典給 data 參數(shù)范咨。你的數(shù)據(jù)字典在發(fā)出請(qǐng)求時(shí)會(huì)自動(dòng)編碼為表單形式:

resp = requests.post('http://httpbin.org/post', data = {'key':'value'})
resp.json()

1.3 傳遞json參數(shù)

使用 json 參數(shù)直接傳遞故觅,然后它就會(huì)被自動(dòng)編碼

dic = {'key': 'value'}  # 字典
resp = requests.post('http://httpbin.org/post', json=dic)
print(resp.json())

1.4 files參數(shù)上傳文件

url = 'http://httpbin.org/post'
files = {'file': open('test.xls', 'rb')}
r = requests.post(url, files=files)
r.text

1.5 自定義headers

自定義請(qǐng)求headers,把字典數(shù)據(jù)傳遞給 headers 參數(shù)

url = 'http://httpbin.org/get'
headers = {'user-agent': 'abc/0.0.1'}
resp = requests.get(url, headers=headers)
resp.json()

1.6 自定義 Cookies

Requests 中自定義 Cookies 也不用再去構(gòu)造 CookieJar 對(duì)象渠啊,直接將字典遞給 cookies 參數(shù)输吏。

url = 'http://httpbin.org/get'
cookies = {'cookies_are': 'working'}
resp = requests.get(url, cookies=cookies)
resp.json()

定義什么cookies就返回什么cookies

1.7 設(shè)置代理

當(dāng)我們需要使用代理時(shí),同樣構(gòu)造代理字典替蛉,傳遞給 proxies 參數(shù)贯溅。

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('http://example.org', proxies=proxies)

http請(qǐng)求走h(yuǎn)ttp對(duì)應(yīng)的地址,https請(qǐng)求走h(yuǎn)ttps對(duì)應(yīng)的地址躲查,如果代理不支持https盗迟,即使key為https的地址寫了http開頭,也是不可用

VPN代理:
電腦開啟了VPN后熙含,要找到這個(gè)VPN的端口是什么罚缕,比如我的VPN占用的端口是:11000
Python代碼中這樣寫:

proxies = {
  'http': 'http://127.0.0.1:11000',
  'https': 'http://127.0.0.1:10000',
}

127.0.0.1就是本地的IP地址,上述設(shè)置中怎静,最好http和https都寫邮弹,單寫一個(gè)有可能代理不上
開啟fiddler后,不設(shè)置代理Python發(fā)送https請(qǐng)求也會(huì)失旘酒浮(請(qǐng)求http正常)腌乡,因?yàn)閒iddler也是一個(gè)代理軟件,需要設(shè)置代理(端口是fiddler中設(shè)置的夜牡,一般設(shè)置8888)

1.8 重定向

在網(wǎng)絡(luò)請(qǐng)求中与纽,我們常常會(huì)遇到狀態(tài)碼是 3 開頭的重定向問(wèn)題,在 Requests 中是默認(rèn)開啟允許重定向的塘装,即遇到重定向時(shí)急迂,會(huì)自動(dòng)繼續(xù)訪問(wèn)。

resp = requests.get('http://github.com', allow_redirects=False)
resp.status_code

1.9 禁止證書驗(yàn)證

方法1:
有時(shí)候我們使用了抓包工具蹦肴,這個(gè)時(shí)候由于抓包工具提供的證書并不是由受信任的數(shù)字證書頒發(fā)機(jī)構(gòu)頒發(fā)的僚碎,所以證書的驗(yàn)證會(huì)失敗,所以我們就需要關(guān)閉證書驗(yàn)證阴幌。

在請(qǐng)求的時(shí)候把 verify 參數(shù)設(shè)置為 False 就可以關(guān)閉證書驗(yàn)證了勺阐。

import requests
resp = requests.get('https://httpbin.org/get', verify=False)

但是關(guān)閉驗(yàn)證后卷中,會(huì)有一個(gè)比較煩人的 warning,可以使用以下方法關(guān)閉警告:

from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全請(qǐng)求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

方法2:
在調(diào)試代碼的時(shí)候渊抽,經(jīng)常用到fiddler蟆豫,但是代碼本身不需要代理fiddler,這個(gè)時(shí)候添加下面代碼懒闷,在代碼請(qǐng)求的時(shí)候就不通過(guò)fiddler了十减,這樣就不用關(guān)閉fiddler了

import os
os.environ['NO_PROXY'] = 'stackoverflow.com'

如果代碼請(qǐng)求https要通過(guò)fiddler抓包,代碼需要設(shè)置代理毛雇,也要安裝證書(實(shí)際使用中嫉称,代碼已經(jīng)看到請(qǐng)求的參數(shù)了,一般不需要通過(guò)fiddler抓取代碼的請(qǐng)求)在調(diào)試代碼的時(shí)候灵疮,經(jīng)常用到fiddler织阅,但是代碼本身不需要代理fiddler,這個(gè)時(shí)候添加下面代碼震捣,在代碼請(qǐng)求的時(shí)候就不通過(guò)fiddler了荔棉,這樣就不用關(guān)閉fiddler了

import os
os.environ['NO_PROXY'] = 'stackoverflow.com'

如果代碼請(qǐng)求https要通過(guò)fiddler抓包,代碼需要設(shè)置代理蒿赢,也要安裝證書(實(shí)際使用中润樱,代碼已經(jīng)看到請(qǐng)求的參數(shù)了,一般不需要通過(guò)fiddler抓取代碼的請(qǐng)求)
1.10 設(shè)置超時(shí)
設(shè)置訪問(wèn)超時(shí)羡棵,設(shè)置 timeout 參數(shù)即可壹若。

requests.get('http://github.com', timeout=0.001)

上述可見,通過(guò) Requests 發(fā)起請(qǐng)求皂冰,只需要構(gòu)造好幾個(gè)需要的字典店展,并將其傳入請(qǐng)求的方法中,即可完成基本的網(wǎng)絡(luò)請(qǐng)求秃流。

2. 響應(yīng)

通過(guò) Requests 發(fā)起請(qǐng)求獲取到的赂蕴,是一個(gè) requests.models.Response 對(duì)象。通過(guò)這個(gè)對(duì)象可以很方便的獲取響應(yīng)的內(nèi)容(包括狀態(tài)碼舶胀、數(shù)據(jù)概说、響應(yīng)頭、響應(yīng)cookies等等)嚣伐。

2.1 響應(yīng)數(shù)據(jù)

通過(guò) Response 對(duì)象的 text 屬性可以獲得字符串格式的響應(yīng)內(nèi)容糖赔。

import requests
resp = requests.get('https://www.baidu.com')
resp.text

Requests 會(huì)自動(dòng)的根據(jù)響應(yīng)的報(bào)頭來(lái)猜測(cè)網(wǎng)頁(yè)的編碼是什么,然后根據(jù)猜測(cè)的編碼來(lái)解碼網(wǎng)頁(yè)內(nèi)容纤控,基本上大部分的網(wǎng)頁(yè)都能夠正確的被解碼挂捻。而如果發(fā)現(xiàn) text 解碼不正確的時(shí)候,就需要手動(dòng)的去指定解碼的編碼格式船万。

import requests
resp = requests.get('https://www.baidu.com')
resp.encoding = 'utf-8'   # 設(shè)置編碼
resp.text

如果需要獲得原始的二進(jìn)制數(shù)據(jù)刻撒,那么使用 content 屬性即可。

resp.content

如果訪問(wèn)之后獲得的數(shù)據(jù)是 JSON 格式的耿导,可以使用 json() 方法声怔,直接獲取轉(zhuǎn)換成字典格式的數(shù)據(jù)

resp = requests.get('http://httpbin.org/get')
resp.json()

2.2 狀態(tài)碼

通過(guò) status_code 屬性獲取響應(yīng)的狀態(tài)碼

resp = requests.get('http://httpbin.org/get')
resp.status_code

2.3 響應(yīng)頭

通過(guò) headers 屬性獲取響應(yīng)的報(bào)頭

resp.headers

2.4 服務(wù)器返回的 cookies

通過(guò) cookies 屬性獲取服務(wù)器返回的 cookies

import requests
url = 'http://www.baidu.com'
resp = requests.get(url)
resp.cookies

輸出的cookies

<RequestsCookieJar[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1600346744, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

2.4.1 把cookies轉(zhuǎn)換成字典

# 獲取登錄成功后的cookie信息
cookiejar = resp.cookies  # 獲取cookies

# 把cookie轉(zhuǎn)換成字典
cookie = requests.utils.dict_from_cookiejar(cookiejar)

2.5 url

可以使用 url 屬性查看訪問(wèn)的 url舱呻。

params = {'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
resp.url

輸出

http://httpbin.org/get?key1=value1&key2=value2

3. Session

在 Requests 中醋火,實(shí)現(xiàn)了 Session(會(huì)話) 功能,當(dāng)我們使用 Session 時(shí)箱吕,能夠像瀏覽器一樣芥驳,在沒(méi)有關(guān)閉關(guān)閉瀏覽器時(shí),能夠保持住訪問(wèn)的狀態(tài)茬高。

這個(gè)功能常常被我們用于登陸之后的數(shù)據(jù)獲取兆旬,使我們不用再一次又一次的傳遞 cookies。

import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
resp = session.get('http://httpbin.org/cookies')
print(resp.text)
{
"cookies": {
"sessioncookie": "123456789"
}
}

首先我們需要去生成一個(gè) Session 對(duì)象怎栽,然后用這個(gè) Session 對(duì)象來(lái)發(fā)起訪問(wèn)丽猬,發(fā)起訪問(wèn)的方法與正常的請(qǐng)求是一模一樣的。

同時(shí)熏瞄,需要注意的是脚祟,如果是我們?cè)?get() 方法中傳入 headers 和 cookies 等數(shù)據(jù),那么這些數(shù)據(jù)只在當(dāng)前這一次請(qǐng)求中有效强饮。如果你想要讓一個(gè) headers 在 Session 的整個(gè)生命周期內(nèi)都有效的話由桌,需要用以下的方式來(lái)進(jìn)行設(shè)置:

# 設(shè)置整個(gè)headers
session.headers = {
    'user-agent': 'lemonban/0.0.1'
}
# 增加一條headers
session.headers.update({'x-test': 'true'})

4. token

待補(bǔ)充...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邮丰,隨后出現(xiàn)的幾起案子行您,更是在濱河造成了極大的恐慌,老刑警劉巖柠座,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑雅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妈经,警方通過(guò)查閱死者的電腦和手機(jī)淮野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吹泡,“玉大人骤星,你說(shuō)我怎么就攤上這事”疲” “怎么了洞难?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揭朝。 經(jīng)常有香客問(wèn)我队贱,道長(zhǎng)色冀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任柱嫌,我火速辦了婚禮锋恬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘编丘。我一直安慰自己与学,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布嘉抓。 她就那樣靜靜地躺著索守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抑片。 梳的紋絲不亂的頭發(fā)上卵佛,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蓝丙,去河邊找鬼级遭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渺尘,可吹牛的內(nèi)容都是我干的挫鸽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸥跟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丢郊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起医咨,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枫匾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拟淮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體干茉,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年很泊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了角虫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡委造,死狀恐怖戳鹅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昏兆,我是刑警寧澤枫虏,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響隶债,放射性物質(zhì)發(fā)生泄漏腾它。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一燃异、第九天 我趴在偏房一處隱蔽的房頂上張望携狭。 院中可真熱鬧继蜡,春花似錦回俐、人聲如沸藤肢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俺猿。三九已至碘举,卻和暖如春忘瓦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背引颈。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工耕皮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝙场。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓凌停,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親售滤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罚拟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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