爬虫requests高阶篇详细教程
文章目錄
一、前言
二、SSL驗證
三、代理設(shè)置
四、超時設(shè)置
? ? ? ??? 五、身份認(rèn)證
1)基本身份認(rèn)證
2)摘要式身份認(rèn)證
?六、總結(jié)
一、前言
本篇文高階篇,上一篇為基礎(chǔ)篇,希望你一定要學(xué)完基礎(chǔ)再來看高階篇內(nèi)容
基礎(chǔ)篇文章可以看大佬寫的這篇:requests基礎(chǔ)篇
二、SSL驗證
我們已12306網(wǎng)站為例子進行講解。
首先我們請求一下12306:
運行結(jié)果:? ?返回:200:
在這里居然能返回200,按道理是應(yīng)該失敗的,如果你有報錯SSLError,表示證書驗證錯誤,把 verify 參數(shù)設(shè)置為 False 即可:
運行結(jié)果:
可以看到報錯有個警告,讓我們添加證書,我們可以通過設(shè)置忽略警告的方式來屏蔽這個警告
import requests from requests.packages import urllib3urllib3.disable_warnings() response = requests.get('https://www.12306.cn', verify=False) print(response.status_code)運行結(jié)果:
或者通過捕獲警告到日志的方式忽略警告:
運行:
三、代理設(shè)置
對于某些網(wǎng)站,在測試的時候請求幾次,能正常獲取內(nèi)容。但是一旦開始大規(guī)模爬取,對于大規(guī)模且頻繁的請求,網(wǎng)站可能會彈出驗證碼,或者跳轉(zhuǎn)到登錄認(rèn)證頁面,更甚者可能會直接封禁客戶端的 IP,導(dǎo)致一定時間段內(nèi)無法訪問。
那么,為了防止這種情況發(fā)生,我們需要設(shè)置代理來解決這個問題,這就需要用到 proxies 參數(shù)。可以用這樣的方式設(shè)置:
當(dāng)然,直接運行這個實例可能不行,因為這個代理可能是無效的,請換成自己的有效代理試驗一下(自己買)
若代理需要使用 HTTP Basic Auth,也可以這樣寫:
除了基本的 HTTP 代理外,requests 還支持 SOCKS 協(xié)議的代理。
首先,需要安裝 socks 這個庫:
安裝成功如下:
然后就可以使用 SOCKS 協(xié)議代理了,示例如下:
運行:
你是不是想說我又在發(fā)無用代碼,都是不可以用的?你要把我上面的ip換成有用的ip,你就可以成功了,為了避免被xx我就不演示了。
四、超時設(shè)置
在本機網(wǎng)絡(luò)狀況不好或者服務(wù)器網(wǎng)絡(luò)響應(yīng)太慢甚至無響應(yīng)時,我們可能會等待特別久的時間才可能收到響應(yīng),甚至到最后收不到響應(yīng)而報錯。為了防止服務(wù)器不能及時響應(yīng),應(yīng)該設(shè)置一個超時時間,即超過了這個時間還沒有得到響應(yīng),那就報錯。這需要用到 timeout 參數(shù)。這個時間的計算是發(fā)出請求到服務(wù)器返回響應(yīng)的時間。示例如下:
import requestsr = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog', timeout=1) print(r.status_code)運行結(jié)果:
通過這樣的方式,我們可以將超時時間設(shè)置為 1 秒,如果 1 秒內(nèi)沒有響應(yīng),那就拋出異常。
實際上,請求分為兩個階段,即連接(connect)和讀取(read)。上面設(shè)置的 timeout 將用作連接和讀取這二者的 timeout 總和。如果要分別指定,就可以傳入一個元組:
運行結(jié)果:
如果想永久等待,可以直接將 timeout 設(shè)置為 None,或者不設(shè)置直接留空,因為默認(rèn)是 None。這樣的話,如果服務(wù)器還在運行,但是響應(yīng)特別慢,那就慢慢等吧,它永遠不會返回超時錯誤的。其用法如下:?
或直接不加參數(shù):
import requestsr = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog') print(r.status_code)運行結(jié)果:
五、身份認(rèn)證
為什么認(rèn)證?比如這個網(wǎng)址:點擊打開
身份驗證基本格式為:?
運行結(jié)果:
1)基本身份認(rèn)證
此時可以使用 requests 自帶的身份認(rèn)證功能:
import requests from requests.auth import HTTPBasicAuth r = requests.get('https://static3.scrape.cuiqingcai.com/', auth=HTTPBasicAuth('admin', 'admin')) print(r.status_code)這樣運行可還是會報錯:這就是我們前面說到的SSL驗證
因此我們加上SSL驗證為:?
運行結(jié)果:? 返回401 認(rèn)證失敗
這個示例網(wǎng)站的用戶名和密碼都是 admin,在這里我們可以直接設(shè)置。
import requests from requests.auth import HTTPBasicAuth r = requests.get('https://static3.scrape.cuiqingcai.com/', auth=HTTPBasicAuth('admin', 'admin'),verify=False) print(r.status_code)運行結(jié)果:
如果用戶名和密碼正確的話,請求時會自動認(rèn)證成功,返回 200 狀態(tài)碼;如果認(rèn)證失敗,則返回 401 狀態(tài)碼。
上面的代碼可以直接簡寫如下:?
運行結(jié)果:
2)摘要式身份認(rèn)證
另一種非常流行的HTTP身份認(rèn)證形式是摘要式身份認(rèn)證Digest Authentication,Requests 對它的支持也是開箱即可用的:
import requests from requests.auth import HTTPDigestAuth url = 'http://httpbin.org/digest-auth/auth/user/pass' requests.get(url, auth=HTTPDigestAuth('user', 'pass'))運行:?
六、總結(jié)
上一篇我們已經(jīng)學(xué)會了基礎(chǔ)篇教程,本篇是對上一篇內(nèi)容的補充豐富,希望大家能和我一樣通過跟隨大佬打卡,不斷進步不斷成長。若本篇有不當(dāng)之處,請大家多多指正!!!
總結(jié)
以上是生活随笔為你收集整理的爬虫requests高阶篇详细教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度linux安装好上不了网,Deepi
- 下一篇: java source folder作用