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添加代理也是非常簡單,只要在請(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)文章
windows安裝TensorFlow和Keras遇到的問題及其解決方法
這篇文章主要介紹了windows安裝TensorFlow和Keras遇到的問題及其解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-07-07
python基礎(chǔ)教程之對(duì)象和類的實(shí)際運(yùn)用
這篇文章主要介紹了python基礎(chǔ)教程之對(duì)象和類的實(shí)際運(yùn)用,本文講解對(duì)象和類的一方法技巧,例如屬性、內(nèi)置方法、self關(guān)鍵字的運(yùn)用等,需要的朋友可以參考下2014-08-08
Python高效生成requirements.txt的兩種方法
Python項(xiàng)目依賴管理是開發(fā)流程中的關(guān)鍵環(huán)節(jié),requirements.txt文件作為記錄項(xiàng)目依賴的標(biāo)準(zhǔn)方式,能確保環(huán)境一致性并簡化協(xié)作部署流程,掌握其生成方法對(duì)開發(fā)者至關(guān)重要,本文給大家介紹了兩種高效生成requirements.txt的方法,需要的朋友可以參考下2025-12-12
一文帶你深入理解Flask中的Session和Cookies
Flask,作為一個(gè)靈活的微型 web 框架,提供了會(huì)話(Session)和 Cookies 管理的能力,本文將深入探討 Flask 中的會(huì)話和 Cookies 的概念、工作機(jī)制以及應(yīng)用實(shí)例,希望對(duì)大家有所幫助2023-12-12
使用python查找替換PowerPoint演示文稿中的文本
演示文稿已成為商務(wù)會(huì)議、學(xué)術(shù)報(bào)告和教育培訓(xùn)中不可或缺的一部分,而PowerPoint演示文稿作為行業(yè)標(biāo)準(zhǔn)工具,更是承載著無數(shù)創(chuàng)意與信息的載體,本文將介紹如何使用Python來精確查找并替換PowerPoint演示文稿中的文本,需要的朋友可以參考下2024-07-07
Python實(shí)現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能,結(jié)合具體實(shí)例形式分析了Python字符串與數(shù)組相關(guān)轉(zhuǎn)換功能的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09

