前幾次文章介紹了頁面爬取的三種用法丹墨,并且也使用到Requests模塊,但是沒有詳細的講解璃谨,本次推文專門帶大家了解一下Requests模塊匠璧。
一桐款、模塊簡介
Requests是使用Apache2 licensed 許可證的HTTP庫;
是一個基于Python開的Http庫夷恍,其在Python內(nèi)置模塊的基礎(chǔ)上進行了高度的封裝魔眨,從而我們在使用Http請求的時候變得非常的簡單;
比urllib2模塊更簡潔好用裁厅;
二冰沙、安裝
安裝很簡單
pip install requests
三、請求類型
HTTP的請求類型分別為:GET(獲取數(shù)據(jù))执虹、POST(提交表單)拓挥、PUT(更新)、DETELE(刪除)袋励、HEAD(獲取相應頭信息)侥啤、OPTIONS(獲取指定資源所支持HTTP請求方法)以及PATCH(新引入的,是對PUT方法的補充茬故,用來對已知資源進行局部更新)
常用到的是GET與POST.
基本用法都很簡單:
r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
具體使用哪種方式盖灸,是取決于服務端的限制,我們也可以通過options的方式獲取所支持的HTTP請求方式磺芭;
四赁炎、請求參數(shù)
HTTP請求的方式有哪些參數(shù)呢?
4.1 url 請求地址
r = requests.get('http://github.com') #括號中的地址就是url
4.2 params 接口參數(shù)
params= {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=params)
Get還可以使用 ”?Key=value” 拼接的方式
r = requests.get("http://httpbin.org/get?key=value")
4.3 headers 頭部信息
headers是一個字典的形式钾腺,可以隨便找一個網(wǎng)站徙垫,
按下F12——>選擇Network——>選擇一個Http請求讥裤,
就可以查看到Request Headers的信息了;
content-type:顯示此HTTP請求提交的內(nèi)容類型姻报;一般在開發(fā)過程己英,會約定好使用什么字符編碼格式來提交數(shù)據(jù),然后會按照固定的字符編碼來解析提交的數(shù)據(jù)吴旋;
我們也可以從瀏覽器上直接獲取到接口的傳遞參數(shù)時的編碼類型:
User-Agent:HTTP客戶端運行的瀏覽器類型的詳細信息损肛。通過該頭部信息web服務器可以判斷到當前HTTP請求的客戶端瀏覽器類別;
我們在爬蟲的時候荣瑟,有些網(wǎng)站限制了
User-agent(查看網(wǎng)站的robots.txt文檔)治拿,所以需要在爬蟲的時候偽裝成瀏覽器去訪問;
如果大家不知道寫啥可以去打開瀏覽器隨便找一個網(wǎng)站F12查看網(wǎng)絡(luò)請求的User-agent值就可以了褂傀;
referer:包含一個URL忍啤,用戶從該URL代表的頁面出發(fā)訪問當前請求的頁面加勤;
某些網(wǎng)頁可能設(shè)置限制了必須要從某個頁面才能點擊進入下一個頁面仙辟,如果直接進入后一個鏈接,將會識別為機器所為鳄梅,不是真實的人在操作叠国;
headers的設(shè)置還有很多,每一種配置都有自己的含義戴尸;
設(shè)置headers中的User-Agent + Referer也是反爬蟲的一種手段粟焊;
4.4 cookie
Cookie 的返回對象為 RequestsCookieJar,與字典類似孙蒙;我們常遇到的跨域的問題與之相關(guān)项棠;
cookies= requests.cookies.RequestsCookieJar()
cookies.set('tasty_cookie', 'yum', domain=’pythonzhishixuetang.com’, path='/cookies')
cookies.set('gross_cookie', 'blech', domain=’pythonzhishixuetang.com’, path='/elsewhere')
url = 'http://pythonzhishixuetang.org/getlist'
r = requests.get(url, cookies=cookies)
我們怎么看網(wǎng)站的cookies信息呢?
F12——>點擊 Application——>選擇左邊的 Cookies挎峦,
就可以查看網(wǎng)站的所有cookies信息了
各種參數(shù)的含義:
4.5 timeout 響應超時
響應超時處理香追,理論上所有的請求都應該加上超時時間,防止程序可能永遠失去相應坦胶;
4.6 SSL證書驗證
Requests 可以為 HTTPS 請求驗證 SSL 證書透典,SSL 驗證默認是開啟的,如果證書驗證失敗顿苇,Requests 會拋出 SSLError:
import requests
r = requests.get('https://12306.cn/')
print(r.text)
結(jié)果如下:
我們可以設(shè)置不校驗SSL證書峭咒,添加參數(shù)verify=False,如下
import requests
r = requests.get('https://12306.cn/',verify=False)
r.encoding='utf-8'
print(r.text)
結(jié)果
對于私有證書纪岁,你也可以傳遞一個 CA_BUNDLE 文件的路徑給 verify凑队;如果 verify 設(shè)為文件夾路徑,文件夾必須通過 OpenSSL 提供的 c_rehash 工具處理幔翰。
requests.get('https://github.com', verify='/path/to/certfile')
你也可以指定一個本地證書用作客戶端證書漩氨,可以是單個文件(包含密鑰和證書)或一個包含兩個文件路徑的元組:
requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
#或
requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem')
不過本地證書的私有 key 必須是解密狀態(tài)短条。目前,Requests 不支持使用加密的 key才菠。
4.7 auth 身份驗證
許多要求身份認證的web服務都接受 HTTP Basic Auth茸时。這是最簡單的一種身份認證,并且 Requests 對這種認證方式的支持是直接開箱即可用赋访;
requests.get('https://api.github.com/user', auth=('user', 'pass'))
如下:
import requests
r=requests.get('https://api.github.com/user')
print(r.text) #提示需要登錄身份信息
r=requests.get('https://api.github.com/user',auth=('xxx@qq.com', 'xxx'))#可以把這里的賬號換成自己的github的賬號與密碼
print(r.text) #獲取到個人賬號信息
結(jié)果
[圖片上傳失敗...(image-cb2feb-1618584887859)]
當然auth 也是可以存在會話session(在下面會介紹)中可都,不需要每次請求都去設(shè)置一次;
當然我們可以自定義認證方式蚓耽,要想自己實現(xiàn)渠牲,就從 AuthBase 繼承一個子類,并實現(xiàn) call() 方法:
class MyAuth(requests.auth.AuthBase):
def __call__(self, r):
#Implement my authentication
return r
url = 'http://httpbin.org/get'
r= requests.get(url, auth=MyAuth())
print(r)
4.8 proxies 代理
需要使用代理步悠,你可以通過為任意請求方法提供 proxies 參數(shù)來配置單個請求:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
如果你的代理需要auth驗證签杈,
也可以使用 http://user:password@host/ 語法:
proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}
五、 會話
什么是會話鼎兽?
即session會話對象可以跨請求保持某些參數(shù)
import requests
r=requests.get("http://httpbin.org/cookies/set/sessioncookie/python") #設(shè)置一個name為sessioncookie 值為python的cookie值
r=requests.get('http://httpbin.org/cookies') #獲取cookie值
print(r.text) #返回結(jié)果為空
s = requests.Session()
s.cookies.set("sessioncookie","python zhi shi xue tang") #在會話中設(shè)置一個name為sessioncookie 值為python zhi shi xue tang的cookie值
r = s.get("http://httpbin.org/cookies") #通過會話使用Get方式獲取所有的cookie
print(r.text) #獲取到cookie值
簡單的說就是創(chuàng)建一個會話答姥,并且在會話中保存cookie值,那所有通過該會話發(fā)出去的請求都含有會話中保存的cookie谚咬;
session 還可以設(shè)置headers鹦付、auth、proxies择卦、cert以及verify等等敲长,可以嘗試一下;
這種方式大大的提高了性能與效率秉继;
六祈噪、響應內(nèi)容
6.1 text
返回的是Unicode型的數(shù)據(jù)
import requests
r = requests.get('https://api.github.com/events')
print(r.text)
當你訪問 r.text 之時,Requests 會基于 HTTP 頭部對響應的編碼作出有根據(jù)的推測尚辑。能夠使用 r.encoding 屬性來改變它:
r.encoding = 'utf-8'
6.2 content
返回的是bytes型也就是二進制的數(shù)據(jù)
import requests
r = requests.get('https://api.github.com/events')
print(r.content)
以字節(jié)的方式訪問請求響應體辑鲤;
6.3 json
返回的是一個Json格式的數(shù)據(jù)
import requests
r = requests.get('https://api.github.com/events')
for item in r.json():
print(item)
如果 JSON 解碼失敗,r.json() 就會拋出一個異常
如果是獲取文本腌巾,可以通過r.text遂填;如果是獲取圖片,文件澈蝙,則可以通過r.content吓坚;如果是獲取json對象,可以通過r.json()灯荧;
七礁击、總結(jié)
本篇文章講述了Requests模塊的一些內(nèi)容,在之前爬蟲的教程中,只是非常簡單的使用了Requests模塊哆窿,沒有使用過多的功能链烈。后面的教程中可能就會用到比較多的功能了,比如設(shè)置Requests的headers信息挚躯,使用auth强衡、會話session、代理等等方式码荔,希望大家能靈活運用漩勤。
對了,http://httpbin.org/ 網(wǎng)站是一個可以能測試 HTTP 請求和響應的各種信息的網(wǎng)站缩搅,蠻好用的越败,大家可以了解一下。
最后還是貼出Requests模塊官網(wǎng)鏈接: