前言
如果面試問你如何用 python 發 get/post 請求? 這種問題只要是個小白花10分鍾隨便看下博客都能學得會。
面試官如果知道你是資深的,還是初級的呢? 面試其實最喜歡考那些你不常用的功能(工作中用不到的),因為你用不到這些功能,所以會被你忽略!
代理功能
如何用 requests 庫使用代理?
如果你沒接觸過爬蟲,其實基本上用不到代理功能。平常公司的網絡都是可以正常請求的,很少有這種需要使用代理的場景,當然也有個別公司網絡管理的比較嚴。
requests 庫的代理使用,在官方文檔給了示例https://requests.readthedocs.io/zh_CN/latest/user/advanced.html#proxies
平常多看看官方文檔就知道了
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
關於 https 證書
https 請求需用到 SSL 證書,平常我都是教大家簡單省事一點,設置 verify=False 來忽略 SSL 證書的校驗。
但是面試嘛,上面說到,你越是忽略的東西,它越是喜歡問你(其實沒卵用,了解下什么是 SSL 證書就行了)
如果你本地已經有了證書,也可以指定本地的證書
獲取響應時間
關於如何獲取接口的響應時間,可以關注我前面這篇https://www.cnblogs.com/yoyoketang/p/8035428.html
響應時間的正確姿勢應該是:r.elapsed.total_seconds(),單位是s
timeout超時
如果我們想設置timeout超時,設置超時為1s,那么就會拋出這個異常:requests.exceptions.ConnectTimeout: HTTPConnectionPool
import requests
r = requests.get("http://cn.python-requests.org/zh_CN/latest/", timeout=1)
print(r.elapsed)
print(r.elapsed.total_seconds())
print(r.elapsed.microseconds)
超時重試
如果跟主機連接失敗超時后,我希望能再主動嘗試連接幾次,避免一超時就失敗了,可以參考前面這篇https://www.cnblogs.com/yoyoketang/p/12961469.html
Requests 自帶了一個傳輸適配器,也就是 HTTPAdapter。 這個適配器使用了強大的 urllib3,為 Requests 提供了默認的 HTTP 和 HTTPS 交互。
每當 Session 被初始化,就會有適配器附着在 Session 上,其中一個供 HTTP 使用,另一個供 HTTPS 使用。
(這個一般也用不到,爬蟲的小伙伴爬數據失敗的話,會用得上)
import requests
from requests.adapters import HTTPAdapter
s = requests.session()
# 上海-悠悠 QQ交流群:717225969
# max_retries=3 重試3次
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
url = "https://www.github.com/"
r = s.request("GET", url=url, timeout=15)
print(r.text)
這樣每次請求超時15s,超時后會重試3次,最大請求時長45s.
Ajax 異步請求
什么是異步請求,什么是同步請求?
Ajax 即 “Asynchronous Javascript And XML”(異步 JavaScript 和 XML),是指一種創建交互式、快速動態網頁應用的網頁開發技術,無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。
通過在后台與服務器進行少量數據交換,Ajax 可以使網頁實現異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。
可以參考前面這篇https://www.cnblogs.com/yoyoketang/p/14278002.html
添加頭部參數 "X-Requested-With": "XMLHttpRequest"
即可
url = "http://49.235.x.x:8081/zentao/user-login.html"
h = {
"X-Requested-With": "XMLHttpRequest"
}
body = {
"account": "admin",
"password": "yoyo123456",
"passwordStrength": 1,
"referer": "/zentao/",
"verifyRand": "1014015280",
"keepLogin": 1
}
r = requests.post(url, headers=h, data=body)
print(r.text)
requests 庫一些常用插件
如何真正的模擬瀏覽器請求,渲染整個頁面?
requests庫發請求的時候,不會加載頁面的js和css,所以並不是真正意義上的模擬瀏覽器發請求,很多新手以為等價於瀏覽器發請求。
requests-html終於可以支持JavaScript了,這就相當於是一個真正意義上的無界面瀏覽器了。
中文文檔地址:https://cncert.github.io/requests-html-doc-cn/#/
也可以參考我前面這篇https://www.cnblogs.com/yoyoketang/p/10663392.html
這個插件其實工作中也用不到,工作中接口都是純接口,這個一般也是爬蟲的小伙伴會很實用。