Python之requests高級(jí)用法詳解
設(shè)置請(qǐng)求頭(headers)
在爬蟲操作中,經(jīng)常需要攜帶請(qǐng)求頭信息(比如User-Agent、Referer、Host、Origin、Cookie)才能正常訪問。
User-Agent : 瀏覽器名稱,服務(wù)器可以知道該請(qǐng)求是從哪個(gè)瀏覽器過來的,在爬蟲中經(jīng)常需要設(shè)置這個(gè)參數(shù)來偽裝我們的請(qǐng)求是從瀏覽器中過來的,這個(gè)值也是我們最經(jīng)常應(yīng)用的;Referer : 表示當(dāng)前請(qǐng)求是從哪個(gè)url過來的,在有些反爬蟲請(qǐng)求中,如果不是從指定頁面訪問該請(qǐng)求,就不會(huì)有相關(guān)響應(yīng);
Host : 標(biāo)識(shí)請(qǐng)求將要達(dá)到那臺(tái)主機(jī),并會(huì)在服務(wù)端被驗(yàn)證,如果不符合,就不能正確處理客戶端的請(qǐng)求;
Origin : 說明最初請(qǐng)求是從哪里發(fā)起的。Referer顯示來源頁面的完整地址,而Origin顯示來源頁面的Origin: protocal+host,不包含路徑等信息,也就不會(huì)包含含有用戶信息的敏感內(nèi)容,跟Referer相似,但是Origin只能用于post請(qǐng)求。Referer適用于所有請(qǐng)求;因此Origin較Referer更安全,多用于防范CSRF攻擊;
Cookie : http協(xié)議是無狀態(tài)的, 服務(wù)器無法區(qū)分多個(gè)請(qǐng)求是否來自同一個(gè)人,因此需要用cookie來進(jìn)行標(biāo)識(shí),一般如果需要登錄才能訪問的網(wǎng)站就需要發(fā)送cookie信息。
GET請(qǐng)求代碼示例
# 引入requests庫
import requests
# 聲明定義請(qǐng)求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 向指定的url發(fā)送請(qǐng)求,并返回
url = 'https://www.baidu.com/s'
# 傳入?yún)?shù)
data = {
'wd': '中國'
}
r = requests.get(url=url, params=data, headers=headers)
print(r.text)
POST請(qǐng)求代碼示例
# 引入requests庫
import requests
# 聲明定義請(qǐng)求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 請(qǐng)求地址
post_url = 'https://fanyi.baidu.com/sug'
# 參數(shù)
form_data = {
'kw': 'baby'
}
# 進(jìn)行post請(qǐng)求
req = requests.post(url=post_url, data=form_data, headers=headers)
print('json:', req.json())
設(shè)置代理服務(wù)器IP(proxy)
使用requests添加代理也是非常簡(jiǎn)單,只要在請(qǐng)求方法中(例如requests.get()或者requests.post())傳遞proxies參數(shù)就可以了,示例代碼如下:
GET請(qǐng)求代碼示例
# 引入requests庫
import random
import requests
# 聲明定義代理服務(wù)器列表
proxy_list = [
{"http": "58.21.202.124:8080"},
{"http": "58.21.202.39:8080"},
{"http": "39.107.232.194:8080"}
]
# 隨機(jī)選擇一個(gè)代理
proxy = random.choice(proxy_list)
# 聲明定義請(qǐng)求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 請(qǐng)求地址
url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
# 進(jìn)行GET請(qǐng)求,打印響應(yīng)結(jié)果
try:
req = requests.get(url=url, headers=headers, proxies=proxy)
print(req.text)
except requests.exceptions.ConnectionError as e:
print(e)
POST請(qǐng)求代碼示例
# 引入requests庫
import random
import requests
# 聲明定義代理服務(wù)器列表
proxy_list = [
{"http": "58.21.202.124:8080"},
{"http": "58.21.202.39:8080"},
{"http": "39.107.232.194:8080"}
]
# 隨機(jī)選擇一個(gè)代理
proxy = random.choice(proxy_list)
# 聲明定義請(qǐng)求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 請(qǐng)求地址
url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
# 進(jìn)行POST請(qǐng)求,打印響應(yīng)結(jié)果
try:
req = requests.post(url=url, headers=headers, proxies=proxy)
print(req.text)
except requests.exceptions.ConnectionError as e:
print(e)
Cookies(Session)
如果在一個(gè)相應(yīng)中包含了cookie,那么可以利用cookies屬性拿到這個(gè)返返回的cookie值,例如:
# 引入requests庫
import requests
# GET訪問
# 向指定的url發(fā)送請(qǐng)求,并返回
url = 'https://www.baidu.com/'
# 發(fā)送get請(qǐng)求
req = requests.get(url=url)
# 響應(yīng)內(nèi)容
print('Cookies信息:', req.cookies)
print(req.cookies.get_dict())
requests.Session()
上面那個(gè)不是重點(diǎn),重點(diǎn)的是requests.Session() ;之前使用urllib庫的時(shí)候是可以使用opener發(fā)送多個(gè)請(qǐng)求,多個(gè)請(qǐng)求之間是可以共享cookie的。那么如果使用requests,也要達(dá)到共享cookie的目的,那么可以使用requests庫給我們提供的session對(duì)象。注意,這里的session不是web開發(fā)中的那個(gè)session,這個(gè)地方只是一個(gè)會(huì)話的對(duì)象而已。還是以人人網(wǎng)登陸為例,使用requests來實(shí)現(xiàn),示例代碼如下:
# 引入requests庫
import requests
# 聲明定義header
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
# 創(chuàng)建session對(duì)象
session = requests.Session()
# 人人網(wǎng)登陸地址
post_uel = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019621044248'
# 參數(shù)
form_data = {
'email': '188****7357', # 這是手機(jī)號(hào),我隱藏掉中間四位
'icode': '',
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password': '01cb55635986f56265d3b55aaddaa79337d094cb56d6cf7724343a93ad586fe7',
'rkey': 'd5ff51375d8eb17a011cad5622d835fd',
'f': 'http%3A%2F%2Fwww.renren.com%2F971686685%2Fprofile'
}
ret1 = session.post(url=post_uel, headers=headers, data=form_data)
print('登陸結(jié)果:', ret1.json())
print('*' * 50)
# 人人網(wǎng)個(gè)人中心地址
get_url = 'http://www.renren.com/971686685/profile'
ret2 = session.get(url=get_url)
print(ret2.content.decode())
處理不信任的SSL證書
對(duì)于那些已經(jīng)被信任的SSL證書的網(wǎng)站,例如//www.baidu.com/,那么使用requests庫直接就可以正常的返回響應(yīng)。請(qǐng)求可以為HTTPS請(qǐng)求驗(yàn)證SSL證書,就像web瀏覽器一樣,SSL驗(yàn)證默認(rèn)是開啟的,如果證書驗(yàn)證失敗,請(qǐng)求會(huì)拋出SSLError遇到請(qǐng)求的SSL驗(yàn)證,可以直接跳過不驗(yàn)證,將verify=False設(shè)置一下即可示例代碼:
# 引入requests庫
import requests
# 向指定的url發(fā)送請(qǐng)求,并返回
url = 'https://www.12306.cn/'
# 發(fā)送get請(qǐng)求
req = requests.get(url=url, verify=False)
print(req.content)
到此這篇關(guān)于Python之requests高級(jí)用法詳解的文章就介紹到這了,更多相關(guān)requests高級(jí)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解
本文主要介紹了Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python使用signal定時(shí)結(jié)束AsyncIOScheduler任務(wù)的問題
這篇文章主要介紹了Python使用signal定時(shí)結(jié)束AsyncIOScheduler任務(wù),在使用aiohttp結(jié)合apscheduler的AsyncIOScheduler模擬定點(diǎn)并發(fā)的時(shí)候遇到兩個(gè)問題,針對(duì)每個(gè)問題給大家詳細(xì)介紹,需要的朋友可以參考下2021-07-07
python隊(duì)列通信:rabbitMQ的使用(實(shí)例講解)
下面小編就為大家分享一篇python隊(duì)列通信:rabbitMQ的使用(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
Python讀取Excel表格,并同時(shí)畫折線圖和柱狀圖的方法
今天小編就為大家分享一篇Python讀取Excel表格,并同時(shí)畫折線圖和柱狀圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python3隨機(jī)漫步生成數(shù)據(jù)并繪制
這篇文章主要為大家詳細(xì)介紹了Python3隨機(jī)漫步生成數(shù)據(jù)并繪制的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
解決Python下imread,imwrite不支持中文的問題
今天小編就為大家分享一篇解決Python下imread,imwrite不支持中文的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
解決Python pip 自動(dòng)更新升級(jí)失敗的問題
今天小編就為大家分享一篇解決Python pip 自動(dòng)更新升級(jí)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02

