溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中Request 的作用是什么

發(fā)布時間:2021-07-10 14:11:21 來源:億速云 閱讀:292 作者:Leah 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Python中Request 的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Request的介紹

在入門教程中我們介紹了urllib庫和urllib2的用法,同時我們了解一些爬蟲的基礎(chǔ)以及對爬蟲有了基本的了解。其實在我們生產(chǎn)環(huán)境中,使用Request庫更加方便與實用,同時我們這需要短短的幾行代碼就能解決大量的事情。

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

Request的使用

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)

使用Request發(fā)送POST請求

其實發(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訪問登錄才能訪問的頁面。

Cookie獲取

我們可以使用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"

請求頭設(shè)置

爬蟲中我們需要定制請求頭來修改我們的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)

如果要下載驗證碼,可以使用上面的會話請求加載這里的下載代碼即可。

獲取Request響應(yīng)

爬蟲中我們發(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI