文章目錄
- 一、前言
- 二、SSL驗證
- 三、代理設定
- 四、超時設定
- 五、身份認證
- 1)基本身份認證
- 2)摘要式身份認證
- 六、總結
一、前言
本篇文高階篇,上一篇為基礎篇,希望你一定要學完基礎再來看高階篇內容,由于字數限制,下一篇我講requests的多個實戰,基礎篇文章:requests基礎篇
二、SSL驗證
我們已12306網站為例子進行講解,
首先我們請求一下12306:
import requests
response = requests.get('https://www.12306.cn/index/')
print(response.status_code)
回傳:200
神奇的是能回傳200,按道理是應該失敗的,不過也好,如果你有報錯SSLError,表示證書驗證錯誤,把 verify 引數設定為 False 即可:
import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
運行:

可以看到報錯有個警告,讓我們添加證書,我們可以通過設定忽略警告的方式來屏蔽這個警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
運行:

或者通過捕獲警告到日志的方式忽略警告:
import logging
import requests
logging.captureWarnings(True)
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
運行:

三、代理設定
對于某些網站,在測驗的時候請求幾次,能正常獲取內容,但是一旦開始大規模爬取,對于大規模且頻繁的請求,網站可能會彈出驗證碼,或者跳轉到登錄認證頁面,更甚者可能會直接封禁客戶端的 IP,導致一定時間段內無法訪問,
那么,為了防止這種情況發生,我們需要設定代理來解決這個問題,這就需要用到 proxies 引數,可以用這樣的方式設定:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
requests.get('https://www.taobao.com', proxies=proxies)
當然,直接運行這個實體可能不行,因為這個代理可能是無效的,請換成自己的有效代理試驗一下(自己買)
若代理需要使用 HTTP Basic Auth,也可以這樣寫:
import requests
proxies = {'https': 'http://user:password@10.10.1.10:3128/',}
requests.get('https://www.taobao.com', proxies=proxies)
除了基本的 HTTP 代理外,requests 還支持 SOCKS 協議的代理,
首先,需要安裝 socks 這個庫:
!pip install socks
如下:

然后就可以使用 SOCKS 協議代理了,示例如下:
import requests
proxy='123.58.10.36:8080' #本地代理
#proxy='username:password@123.58.10.36:8080'
proxies={
'http':'http://'+proxy,
'https':'https://'+proxy
}
try:
response=requests.get('http://httpbin.org/get',proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('錯誤:',e.args)
運行:

你是不是想說我又在發無用代碼,都是不可以用的?你要把我上面的ip換成有用的ip,你就可以成功了,為了避免被xx我就不演示了,
四、超時設定
在本機網路狀況不好或者服務器網路回應太慢甚至無回應時,我們可能會等待特別久的時間才可能收到回應,甚至到最后收不到回應而報錯,為了防止服務器不能及時回應,應該設定一個超時時間,即超過了這個時間還沒有得到回應,那就報錯,這需要用到 timeout 引數,這個時間的計算是發出請求到服務器回傳回應的時間,示例如下:
import requests
r = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog', timeout=1)
print(r.status_code)
運行:

通過這樣的方式,我們可以將超時時間設定為 1 秒,如果 1 秒內沒有回應,那就拋出例外,
實際上,請求分為兩個階段,即連接(connect)和讀取(read),上面設定的 timeout 將用作連接和讀取這二者的 timeout 總和,如果要分別指定,就可以傳入一個元組:
import requests
r = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog', timeout=(10,20))
print(r.status_code)
運行:

如果想永久等待,可以直接將 timeout 設定為 None,或者不設定直接留空,因為默認是 None,這樣的話,如果服務器還在運行,但是回應特別慢,那就慢慢等吧,它永遠不會回傳超時錯誤的,其用法如下:
import requests
r = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog', timeout=None)
print(r.status_code)
或直接不加引數:
import requests
r = requests.get('https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343&type=blog')
print(r.status_code)
五、身份認證
為什么認證?比如這個網址:點擊打開

身份驗證基本格式為:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
print(r.status_code)
1)基本身份認證
此時可以使用 requests 自帶的身份認證功能:
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驗證為:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://static3.scrape.cuiqingcai.com/', auth=HTTPBasicAuth('username', 'password'),verify=False)
print(r.status_code)
這個示例網站的用戶名和密碼都是 admin,在這里我們可以直接設定,

如果用戶名和密碼正確的話,請求時會自動認證成功,回傳 200 狀態碼;如果認證失敗,則回傳 401 狀態碼,
上面的代碼可以直接簡寫如下:
import requests
r = requests.get('https://static3.scrape.cuiqingcai.com/', auth=('admin', 'admin'))
print(r.status_code)
運行:

2)摘要式身份認證
另一種非常流行的HTTP身份認證形式是摘要式身份認證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'))
運行:

六、總結
上一篇我們已經學會了基礎篇教程,本篇是對上一篇內容的補充豐富,希望你認真從我的文章中領悟爬蟲的快樂,下一篇我會教大家多個實戰內容,不必擔心只學了理論就不會實戰,后續我會上更多的教程來豐富爬蟲,不用擔心你學不好,有問題粉絲群找我,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330279.html
標籤:其他
上一篇:QT多執行緒實作UDP資料的發送
下一篇:初階指標。
