淺談requests庫
本文為部落格園ShyButHandsome的原創作品,轉載請註明出處
右邊有目錄,方便快速瀏覽
安裝
pip install requests # 是requests而不是request(有s的)
requests的簡單使用
# requests的簡單使用,看看效果就行,後面會更仔細細講 import requests r = requests.get("https://www.baidu.com") # 構造一個Request物件, 返回一個Response物件 print(r.status_code) # 檢視狀態碼,檢查是否成功,200則為成功 print(r.encoding) # 檢視當前編碼,預設為header的charset欄位 print(r.apparent_encoding) # 檢視requests根據上下文判斷的編碼(備選編碼) r.encoding = 'utf-8' #此處我們是已知網頁編碼才這麼寫 # 一般來說,我們都是採取r.encoding = r.apparent_encoding 的方式讓它自己轉換編碼 print(r.text) # 檢視獲取到的網頁內容
簡單拓展:(後續會更加詳細的講)
方法 | 說明 | HTML |
---|---|---|
requests.request() |
構造一個請求,支撐以下各方法的基礎方法 | \(ALL\) |
requests.get() |
獲取HTML 網頁的主要方法 |
GET |
requests.head() |
獲取HTML 網頁頭資訊的方法 |
HEAD |
requests.post() |
向HTML 網頁提交POST 請求的方法 |
POST |
requests.put() |
向HTML 網頁提交PUT 請求的方法 |
PUT |
requests.patch() |
向HTML 網頁提交區域性修改請求 |
PATCH |
requsets.delete() |
向HTML |
DELETE |
從requests.get()方法
看requests庫
r = requests.get(url)
requests.get()
方法會
- 構造一個向伺服器請求資源的
Requset物件
- 返回一個包含伺服器資源的
Response物件
這裡的Response物件
就是r
type(r)
# 在python console中返回的結果是 <class 'requests.models.Response'>
# 即, r是一個Response物件
r
儲存著所有從伺服器返回的資源,同時也包含了我們向伺服器請求的Request
的資訊
requests.get()
requests.get(url, params = None, **kwargs)
url
: 擬獲取(目標網站)的\(url\)連結params
:url
中的額外引數,字典或位元組流格式(可選)**kwargs
\(12\)個控制訪問的引數(可選)
探祕get()
方法:
以下是requsets/api.py
中的部分內容
def get(url, params=None, **kwargs):
"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
我們可以發現:(在上面的最後一行return語句
)
get()方法
是由requsets()方法
封裝得來的
requests庫
一共提供了\(7\)個常用方法(詳見上文:requests庫
的簡單使用)
實際上:
除了request()方法
外
其他\(6\)個方法都是通過呼叫request()方法
來實現的
前面提到的:
requests.get()
方法會
- 構造一個向伺服器請求資源的
Requset物件
- 返回一個包含伺服器資源的
Response物件
requests.get()方法
構造出的Response物件
實質上是requests()方法
構造出來的
你甚至可以說requests庫
只有一個方法:requests.request()
requests.request()
構造出了兩個重要的物件
Request物件
(負責發請求),和
Resopnse物件
(儲存返回資訊)
而這個Response物件
包含了爬蟲返回的全部內容,當屬重中之重
Response物件
的幾個常見且重要屬性:
屬性 | 說明 |
---|---|
r.status_code |
HTTP 請求的返回狀態,\(200\)表示連線成功,\(404\)(等)表示連線失敗 |
r.text |
HTTP 響應內容的字串形式,即,url 對應的頁面內容 |
r.encoding |
從HTTP header 中猜測的相應內容的編碼方式 |
r.apparent_encoding |
從內容中分析出相應內容編碼方式(備選編碼方式) |
r.content |
HTTP 響應內容的二進位制形式 |
關於編碼:
r.encoding
會從header
的charset
欄位讀取編碼資訊,
如果不存在charset
欄位,則預設編碼為ISO-8859-1
關於Response物件
舉幾個小例子:
r.status_code
: 和我們常見的"404,網站不見了"是一個道理r.text
: 字串形式儲存著網頁原始碼,編碼方式是可以變的r.content
: 假設你現在get()
到了一個圖片,那麼這個圖片,就是用二進位制的形式儲存的,那麼就可以通過r.content
來還原這張圖片
爬取網頁資訊的基本流程:
graph TD A[requests.get] -->B(r.status_code) B --> C{200} C -->|YES| D[將r.text轉換為可讀編碼] C -->|NO| E[產生異常] D --> F[進一步操作] E --> G[進行除錯]# 在python console的實踐(實踐出真知)
>>> import requests
>>>
>>> r = requests.get("https://www.baidu.com")
>>>
>>> type(r)
<class 'requests.models.Response'>
>>>
>>> r.status_code # 檢視當前狀態碼,非200則產生了異常
200
>>> # 狀態碼為200沒有問題,可以進行下一步操作
...
>>> r.encoding
'ISO-8859-1'
>>> # 預設就是'ISO-8859-1',但這種編碼方式並不支援中文,我們可以直接列印試試
...
>>> r.text # python console中是展開的,複製到這就成了一行,可以拖動程式碼框底部滑塊左右移動來觀察
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç\x99¾åº¦ä¸\x80ä¸\x8b class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ\x96°é\x97»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å\x9c°å\x9b¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§\x86é¢\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å\x90§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç\x99»å½\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">ç\x99»å½\x95</a>\');\r\n </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ\x9b´å¤\x9a产å\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å\x85³äº\x8eç\x99¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a> 京ICPè¯\x81030173å\x8f· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
>>>
>>> # 可以發現出現了亂碼(不出現才怪)
... # 接下來我們需要將r.text轉換為可讀編碼,就是r.encoding和r.apparent_encoding的使用
...
>>> r.apparent_encoding # 檢視備選編碼方式
'utf-8'
>>> r.encoding = 'utf-8' # 或者直接r.encoding = r.apparent_encoding
>>>
>>> r.encoding
'utf-8'
>>> r.encoding # 檢查是否成功改變編碼方式
'utf-8'
>>> # 成功更換,接下來看看效果吧
...
>>> r.text # python console中是展開的,複製到這就成了一行,可以拖動程式碼框底部滑塊左右移動來觀察
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新聞</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地圖</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>視訊</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>貼吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登入</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登入</a>\');\r\n </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多產品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>關於百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必讀</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意見反饋</a> 京ICP證030173號 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
>>>
>>> # 這一次就能看見漢字的出現了
...
>>> # 接下來我們試試狀態碼不是200
... # 通過不斷的主動試錯能加深對一門新技術的理解
...
>>> # 比如,故意打錯url試試
...
>>> r = requests.get("http://www.fkbaidu.com")
>>> r.status_code
503
>>> # 或者,我們試試訪問某些"遺蹟"
...
>>> r = requests.get("https://www.github.com/breakwa11/shadowsocksr")
>>> r.status_code
404
>>>
>>> # 更多的情況可以自己多嘗試嘗試
... # 網路連線有風險,異常處理很重要
... # 通過主動試錯,來掌握常見的異常處理
...
>>> exit() # 結束程式執行
爬取網頁的通用程式碼框架
網路連線有風險,異常處理很重要
既然異常處理很重要,那總得知道是有什麼異常不是?
Requests庫
的常見異常
異常 | 說明 |
---|---|
requests.ConnectionError |
網路連線錯誤異常,如DNS 查詢失敗/拒絕連線等 |
requests.HTTPError |
HTTP 錯誤異常 |
requests.URLRequired |
URL 缺失異常 |
requests.TooManyRedirects |
超過最大重定向次數,產生重定向異常 |
requests.ConnectTimeout |
連線遠端伺服器超時異常 |
requests.Timeout |
請求URL 超時,產生超時異常 |
requests.ConnectTimeout
和requests.Timeout
的區別:
Timeout
是指從發出URL
請求到獲取整個網頁內容超時的異常ConnectTimeout
僅指與遠端伺服器連線產生的超時異常
raise_for_status()方法
:
回顧前面流程圖,
我們在上文有介紹過這個流程圖
graph TD A[requests.get] -->B(r.status_code) B --> C{200} C -->|YES| D[將r.text轉換為可讀編碼] C -->|NO| E[產生異常] D --> F[進一步操作] E --> G[進行除錯]
我們需要在status_code
為\(200\)的時候再進行下一步操作
而raise_for_status()方法
就可以實現這個判斷
如果status_code
不是\(200\),則產生異常requesets.HTTPError
瞭解了幾個常見的異常後,我們就可以來分析這個通用的程式碼框架了
import requests
def main():
url = "https://www.baidu.com"
print(get_HTML_text(url))
def get_HTML_text(url):
try:
r = requests.get(url, timeout=30)
# 檢測異常
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
# 異常處理
return "產生異常!!!"
if __name__ == "__main__":
main()
這個程式碼框架就是脫胎於這個流程圖
丟擲異常 處理異常
沒有異常 繼續幹活
當然,並不是說爬蟲程式碼就一定要按照上面的程式碼來寫
這是一種思路
requests.request()方法
在
requests的簡單使用
處,我們有提到Requests庫
的\(7\)個常用方法
方法 說明 HTML
requests.request()
構造一個請求,支撐以下各方法的基礎方法 \(ALL\) requests.get()
獲取 HTML
網頁的主要方法GET
requests.head()
獲取 HTML
網頁頭資訊的方法HEAD
requests.post()
向 HTML
網頁提交POST
請求的方法POST
requests.put()
向 HTML
網頁提交PUT
請求的方法PUT
requests.patch()
向 HTML
網頁提交區域性修改請求PATCH
requsets.delete()
向 HTML
頁面提交刪除請求DELETE
在
從requests.get()方法看requests庫
處,我們有提到:你甚至可以說
requests庫
只有一個方法:requests.request()
現在就來單獨講講requests.request()方法
同樣,我又跑了去找它的原始碼
原始碼是最好的說明書,官方文件其次
然後,很幸運地,
我發現它是提供了介面的
下面這段是requests/api.py
中的程式碼
def request(method, url, **kwargs):
"""Constructs and sends a :class:`Request <Request>`.
:param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:`Request`.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
:param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
:param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
:param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file.
:param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
:param timeout: (optional) How many seconds to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) <timeouts>` tuple.
:type timeout: float or tuple
:param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
:type allow_redirects: bool
:param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
:param verify: (optional) Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``.
:param stream: (optional) if ``False``, the response content will be immediately downloaded.
:param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
:return: :class:`Response <Response>` object
:rtype: requests.Response
Usage::
>>> import requests
>>> req = requests.request('GET', 'https://httpbin.org/get')
>>> req
<Response [200]>
"""
# By using the 'with' statement we are sure the session is closed, thus we
# avoid leaving sockets open which can trigger a ResourceWarning in some
# cases, and look like a memory leak in others.
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)
同樣的,我們在它的原始碼中發現了它十分詳細的使用說明
我不想做翻譯機,
你已經是個成熟的程式設計師了,要學會自己翻譯(能不百度就別百度)
那麼我就用我的話大致說一遍吧!
從它的腦袋:def request(method, url, **kwargs):
開始
method
method: method for the new :class:
Request
object: "GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", or "DELETE".
這個引數是用來構建一個Request物件
的(就是提交一個請求)
負責決定請求方式
它的值一共有\(7\)個(不區分大小寫,實踐得出)
- "GET"
- "OPTIONS"
- "HEAD"
- "POST"
- "PUT"
- "PATCH"
- "DELETE"
與HTML
分別對應(名字都一樣,太貼心了)
url
url: URL for the new :class:
Request
object.
而這個url
則是決定你要向哪個網頁發起請求
它的值就是目標網站的url
引用它的原始碼給出的例子:
>>> import requests
>>> req = requests.request('GET', 'https://httpbin.org/get')
>>> req
<Response [200]>
這裡的'GET'
就是method
'https://httpbin.org/get'
就是url
我們也看到:
req
返回的是一個Response物件
這些上文都講過了,就不贅述了
**kwargs
這個是可選引數,共\(13\)個:
- params
- data
- json
- headers
- cookies
- files
- auth
- timeout
- allow_redirects
- proxies
- verify
- stream
- cert
params
params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:
Request
.
它的值是字典,元組列表或位元組序列(Dictionary, list of tuples or bytes
)
功能是將它的值作為引數新增到url
中
舉個例子:
>>> # 在python console中演示對params的使用
...
>>> import requests
>>>
>>> dic = {'wd': 'ShyButHandsome'}
>>>
>>> r = requests.get("https://www.baidu.com/s", params = dic) # 此處要顯示指定params
>>>
>>> r.url # 這樣就起到了在百度搜索"ShyButHandsome"的作用,後文還會再給出demo
'https://www.baidu.com/s?wd=ShyButHandsome'
data
data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:
Request
.
它的值是字典,元組列表,位元組序列或檔案物件(Dictionary, list of tuples, bytes, or file-like object
)
功能是向伺服器提供/提交資源(可以實現登入的功能)
舉個例子:
>>> # 在python console中演示對params的使用
...
>>> import requests
>>>
>>> url = "http://httpbin.org/post" # 本來是想post百度的,但是會出錯,這裡是官方給的練手的地方
>>> dic = {'key': 'value'}
>>> r = requests.post(url, data = dic)
>>> r. text
'{
"args": {},
"data": "",
"files": {},
"form": {
"key": "value" // 這裡
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0"
},
"json": null,
"url": "http://httpbin.org/post"
}
'
json
json: (optional) A JSON serializable Python object to send in the body of the :class:
Request
.
它的值是python物件
功能是把python物件
編碼成JSON
提交
我當時挺奇怪,這不是用data
也能做嗎?
是的,但data
更加簡單,你不用去import json
>>> # 不匯入json
...
>>> import requests
>>> url = "http://httpbin.org/post"
>>> dic = {'key': 'value'}
>>> r = requests.post(url, json = dic)
>>> r.text
'{
"args": {},
"data": "{\\"key\\": \\"value\\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "16",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
},
"json": {
"key": "value" // 這裡
},
"url": "http://httpbin.org/post"
}
'
>>> # 匯入json
...
>>> import json # 這裡
>>> import requests
>>> url = "http://httpbin.org/post"
>>> dic = {'key': 'value'}
>>> r = requests.post(url, data=json.dumps(dic)) # 這裡
>>> r.text
'{
"args": {},
"data": "{\\"key\\": \\"value\\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "16",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
},
"json": {
"key": "value" // 這裡
},
"url": "http://httpbin.org/post"
}
'
headers
headers: (optional) Dictionary of HTTP Headers to send with the :class:
Request
.
它的值為字典(Dictionary
)
功能是自定義HTTP
頭(有些網站指定特定的瀏覽器才能訪問,這種時候就可以通過修改header
中的user-agent
來模擬這種瀏覽器)
舉個例子:
>>> # 通過修改header中的user-agent模擬Chrome10
>>> import requests
>>> url = "http://httpbin.org/post"
>>> hd = {'user-agent': 'Chrome/10'}
>>> r = requests.post(url, headers = hd)
>>> r.text
'{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "Chrome/10", // 這裡
},
"json": null,
"url": "http://httpbin.org/post"
}
'
cookies
cookies: (optional) Dict or CookieJar object to send with the :class:
Request
.
它的值是字典或CookieJar
功能是Request
中的cookie
files
files: (optional) Dictionary of
'name': file-like-objects
(or{'name': file-tuple}
) for multipart encoding upload.file-tuple
can be a 2-tuple('filename', fileobj)
, 3-tuple('filename', fileobj, 'content_type')
or a 4-tuple('filename', fileobj, 'content_type', custom_headers)
, where'content-type'
is a string defining the content type of the given file andcustom_headers
a dict-like object containing additional headers to add for the file.
它的值是字典
功能是傳輸檔案(可以實現向某一個連線提交某一個檔案)
auth
auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
它的值是元組
支援HTTP
認證功能
timeout
timeout: (optional) How many seconds to wait for the server to send data before giving up, as a float, or a :ref:
(connect timeout, read timeout) <timeouts>
tuple.
它的值是浮點數或元組
功能是:如果連線時間超出給定引數(單位是秒),則丟擲timeout
異常
proxies
proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
它的值是字典
功能是設定訪問代理伺服器(可以增加登入認證)
能夠有效的防止對爬蟲的逆追蹤
allow_redirects
allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to
True
.
布林型別,預設True
功能是重定向開關
stream
stream: (optional) if
False
, the response content will be immediately downloaded.
布林型別,預設True
功能是獲取內容立即下載開關
verify
verify: (optional) Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to
True
.
布林型別,預設為True
功能是認證SSL
證書開關
cert
cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
它的值是字串或元組型別
本地SSL
證書路徑
文章題目為:淺談,寫太多反而累贅
如果想更加深入瞭解的話,推薦仔細閱讀(並做好筆記)requests的文件(有中文噠!)
寫在最後
其實不光是看官方文件,實踐也很重要
不然,學得快,忘得也快
我是ShyButHandsome,一個對技術充滿好奇的大帥哥,如果你覺得這篇文章寫的還行的話,不妨點點推薦?