您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Python中Request 的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在入門教程中我們介紹了urllib庫和urllib2的用法,同時我們了解一些爬蟲的基礎(chǔ)以及對爬蟲有了基本的了解。其實在我們生產(chǎn)環(huán)境中,使用Request庫更加方便與實用,同時我們這需要短短的幾行代碼就能解決大量的事情。
在Python簡介與環(huán)境配置中我們已經(jīng)安裝了PIP管理工具,如果你是2.x版本,也可以使用easy_install來安裝Request庫,它可以幫助我們很容易的安裝三方庫:
使用pip安裝Request
# pip2.x安裝requests pip install requests # pip3.x安裝requests pip3 install requests
使用easy_install安裝Request
easy_install requests
在python中引入三方模塊非常簡單,只需要import引入即可:
import requests req = requests.get("https://ptorch.com") print(req.text)
這樣我們即可快速提取目標(biāo)網(wǎng)頁的代碼,使用起來非常方便!
Request基本請求方式
你可以通過requests庫發(fā)送所有的http請求:
requests.get("http://httpbin.org/get") #GET請求 requests.post("http://httpbin.org/post") #POST請求 requests.put("http://httpbin.org/put") #PUT請求 requests.delete("http://httpbin.org/delete") #DELETE請求 requests.head("http://httpbin.org/get") #HEAD請求 requests.options("http://httpbin.org/get") #OPTIONS請求
使用Request發(fā)送GET請求
想要使用爬蟲獲取某個目標(biāo)網(wǎng)頁,直接使用get方法即可發(fā)送HTTP GET請求:
req = requests.get("http://httpbin.org/get")
通常情況下我們不會只訪問基礎(chǔ)網(wǎng)頁,特別是爬取動態(tài)網(wǎng)頁時我們需要傳遞不同的參數(shù)獲取不同的內(nèi)容;GET傳遞參數(shù)有兩種方法,可以直接在鏈接中添加參數(shù)或者利用params添加參數(shù):
import requests payload = {'key1': 'value1', 'key2': 'value2'} req = requests.get("http://httpbin.org/get", params=payload) # 方法二 # req = requests.get("http://httpbin.org/get?key2=value2&key1=value1") print(req.url)
其實發(fā)送POST請求與GET方式很相似,只是參數(shù)的傳遞我們需要定義在data中即可:
import requests payload = {'key1': 'value1', 'key2': 'value2'} req = requests.post("http://httpbin.org/post", data=payload) print(req.text)
POST發(fā)送JSON數(shù)據(jù)
很多時候你想要發(fā)送的數(shù)據(jù)并非編碼為表單形式的,發(fā)現(xiàn)特別在爬取很多java網(wǎng)址中出現(xiàn)這個問題。如果你傳遞一個string而不是一個 dict,那么數(shù)據(jù)會被直接發(fā)布出去。我們可以使用json.dumps()是將dict轉(zhuǎn)化成str格式;此處除了可以自行對dict進(jìn)行編碼,你還可以使用json參數(shù)直接傳遞,然后它就會被自動編碼。
import json import requests url = 'http://httpbin.org/post' payload = {'some': 'data'} req1 = requests.post(url, data=json.dumps(payload)) req2 = requests.post(url, json=payload) print(req1.text) print(req2.text)
POST文件上傳
如果我們要使用爬蟲上傳文件,可以使用file參數(shù):
url = 'http://httpbin.org/post' files = {'file': open('test.xlsx', 'rb')} req = requests.post(url, files=files) req.text
如果有熟悉WEB開發(fā)的伙伴應(yīng)該知道,如果你發(fā)送一個非常大的文件作為multipart/form-data請求,你可能希望將請求做成數(shù)據(jù)流。默認(rèn)下requests不支持, 你可以使用requests-toolbelt三方庫。
在很多時候我們開發(fā)的爬蟲需要登錄,登錄后我們需要記錄登錄狀態(tài),否則無法爬取登錄后才能爬取的網(wǎng)頁,在request中提供了requests.Session()這樣的類:
import requests s = requests.Session() s.get('http://httpbin.org/get')
這樣我們的request只要調(diào)用一次登錄入口就會自動維護(hù)網(wǎng)站的Session記錄我們的登錄狀態(tài),以后我們可以直接使用request訪問登錄才能訪問的頁面。
我們可以使用cookies來獲取響應(yīng)中的cookie: 如果某個響應(yīng)中包含一些 cookie,你可以快速訪問它們:
req = requests.get("https://ptorch.com") req = requests.get("https://ptorch.com") print(req.cookies) print(req.cookies['laravel_session'])
要想發(fā)送你的cookies到服務(wù)器,可以使用cookies參數(shù):
cookies = dict(cookies_are='working Test') req = requests.get("http://httpbin.org/cookies", cookies=cookies) print(req.text) # '{"cookies": {"cookies_are": "working Test"}}'
Cookie的返回對象為RequestsCookieJar,它的行為和字典類似,但界面更為完整,適合跨域名跨路徑使用。你還可以把Cookie Jar傳到Requests中:
jar = requests.cookies.RequestsCookieJar() jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') url = 'http://httpbin.org/cookies' req = requests.get(url, cookies=jar) print(req.text) # '{"cookies": {"tasty_cookie": "yum"}}'
保存cookie方便下次訪問,我們需要將CookieJar轉(zhuǎn)為字典或者將字典轉(zhuǎn)為CookieJar
#將CookieJar轉(zhuǎn)為字典: cookies = requests.utils.dict_from_cookiejar(r.cookies) #將字典轉(zhuǎn)為CookieJar: cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
你可以告訴requests在經(jīng)過以timeout參數(shù)設(shè)定的秒數(shù)時間之后停止等待響應(yīng)?;旧纤械纳a(chǎn)代碼都應(yīng)該使用這一參數(shù)。如果不使用,你的程序可能會永遠(yuǎn)失去響應(yīng):
requests.get('http://github.com', timeout=0.001)
注:timeout 僅對連接過程有效,與響應(yīng)體的下載無關(guān)。
也就是說,這個時間只限制請求的時間。即使返回的 response 包含很大內(nèi)容,下載需要一定時間,然而這并沒有什么卵用。
很多情況下網(wǎng)址具有反爬蟲機(jī)制,如果我們的訪問量達(dá)到一定的數(shù)量會封掉我們的IP,比如很多朋友爬取微信文章常常需要使用代理,你可以通過proxies參數(shù)為任意請求來設(shè)置代理,我們可以百度免費(fèi)代理來獲取一些免費(fèi)的代理,速度不是很快,但是練習(xí)足夠了。
import requests proxies = { "https": "http://127.0.0.1:4433" } req = requests.post("http://httpbin.org/post", proxies=proxies) print(req.text)
我們也可以通過HTTP_PROXY和HTTPS_PROXY環(huán)境變量來配置代理。
export HTTP_PROXY="http://127.0.0.1:2091" export HTTPS_PROXY="http://127.0.0.1:2092"
爬蟲中我們需要定制請求頭來修改我們的HTTP請求,特別是很多發(fā)爬蟲工具禁止腳本訪問,我們可以設(shè)置headers參數(shù)來模擬瀏覽器訪問,同時我們還可以通過headers來傳遞cookie來保持我們的登錄狀態(tài):
headers = {'user-agent': 'my-app/0.0.1'} req = requests.get("https://api.github.com/some/endpoint", headers=headers)
有時候我們想下載我們爬取頁面的img圖片,你可以使用requests請求圖片,獲取response.content文本信息,實際上獲取的是圖片的二進(jìn)制文本,然后保存即可:
import requests response = requests.get("https://cache.yisu.com/upload/information/20210521/347/241257.png") img = response.content open('logo.jpg', 'wb').write(response.content)
如果要下載驗證碼,可以使用上面的會話請求加載這里的下載代碼即可。
爬蟲中我們發(fā)送了請求,我們可以使用如下方法獲取Request響應(yīng)用于分析和檢測:
# 響應(yīng)狀態(tài)碼 req.status_code # 響應(yīng)頭 req.headers # 獲取請求鏈接 req.url # 獲取網(wǎng)頁編碼 req.encoding # 獲取cookie req.cookies # 獲取網(wǎng)頁代碼 req.text
上述就是小編為大家分享的Python中Request 的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。