07 requests 第三方庫
官方定義:Requests is the only Non-GMO HTTP library for Python, safe for human consumption.
簡單翻譯一下就是:Requests 是唯一適用於 Python 的 Non-GMO HTTP 庫,可供開發人員安全使用。
上面是 requests 庫的官方定義。簡單來說 requests 庫是 Python 的第三方 HTTP 庫,以 urllib 為基礎。因為使用簡單,人性化,安全的特性,被廣泛的用來爬蟲的請求傳送。
1. requests 安裝
可以通過 PIP 進行安裝:
Tips:Python 環境安裝之後 PIP 也會自動安裝,直接開啟 CMD 命令列使用即可。
pip install requests
也可以到 官網下載,然後通過以下命令進行安裝。然後進入到下載的目錄,輸入以下命令:
python setup.py install
2. requests 請求
下面我們使用網作為目標網站,並使用 requests 庫進行請求:
2.1 get 無引數請求
我們直接使用 request 的 get 方法來請求網,然後列印返回結果:
import requests
r = requests.get('https://www.imooc.com/')
print(r.text)
請求結果如下,格式為HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>網-程式設計師的夢工廠</title> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> <meta name="renderer" content="webkit" /> <meta name="mobile-agent" content="format=wml"; url="https://m.imooc.com/"> <link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.imooc.com/"> <meta name="mobile-agent" content="format=xhtml"; url="https://m.imooc.com/"> <meta name="mobile-agent" content="format=html5"; url="https://m.imooc.com/"> <meta property="qc:admins" content="77103107776157736375" /> ......
2.2 get 有引數請求
下面我們給 get 請求加上引數,來看看返回結果:
import requests
r = requests.get('https://www.imooc.com/common/adver-getadverlistbymarking?marking=global_newcomer
', {marking: global_newcomer})
print(r.text)
請求結果如下,格式為 Json:
{"result":0,"data":{"global_newcomer":{"id":"2696","name":"\u65b0\u4eba\u6709\u793c","column_id" :"366","description":"","pic":"\/\/img3.mukewang.com\/5df2084b096514ff25600136.png","links":"https:\/\/www.imooc.com\/act\/newcomer","type":"99","type_id":"0","create_time":"1576142925","uid":"10001","is_open":"0","seqid":"0","status":"0","start_time":"0","end_time":"0","skillid_list":""}},"msg":"\u6210\u529f"}
2.3 無引數的post請求
import requests
r = requests.post('https://www.imooc.com/search/hotwords‘)
print(r.text)
請求結果如下,格式為Json:
{"result":0,"data":["Vue","Python","Java","flutter","springboot","docker","React","\u5c0f\u7a0b\u5e8f"],"msg":"\u6210\u529f"}
2. 4 有引數的post請求
import requests
r = requests.post('https://httpbin.org/post', data = {'key':'value'})
print(r.text)
請求結果如下,格式為Json:
{
"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.22.0",
"X-Amzn-Trace-Id": "Root=1-5e3bde61-bb0c787463f0852c81b7faa8"
},
"json": null,
"origin": "124.78.170.82",
"url": "https://httpbin.org/post"
}
除了 get,post 等基本請求,Request也支援其他的請求型別。以下羅列的是官方提供的其他請求方法:
r = requests.put('https://httpbin.org/put', data = {'key':'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')
3. requests 的響應
3.1 獲取二進位制響應內容
import requests
r = requests.post('https://www.imooc.com/')
print(r.content)
返回的二進位制文字如下所示:
b'\n\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<meta charset="utf-8">\r\n<title>\xe6\x85\x95\xe8\xaf\xbe\xe7\xbd\x91-\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98\xe7\x9a\x84\xe6\xa2\xa6\xe5\xb7\xa5\xe5\x8e\x82</'
......
某些情況下,我們需要獲取二進位制的內容,比如圖片或者一些視訊的資訊流。
3.2 獲取響應狀態碼和響應編碼
import requests
r = requests.post('https://www.imooc.com/')
print(r.status_code)
print(r.encoding)
請求成功後將會得到以下的狀態碼。另外,request 庫同時也提供了 requests.codes.ok
來表示請求成功。
通過響應碼,我們可以知道我們請求的是否傳送成功,是否被正確的解析,以及是否正確的返回。通過檢驗程式的編碼,來防止編碼不一致導致的亂碼問題。
4. 自定義請求頭
這裡,我們把程式的請求頭封裝在了字典裡,然後通過字典的形式傳給 requests 進行請求,這樣做,有助於我們程式碼的整潔性和可維護性。
url = 'https://www.imooc.com/'
headers = {'user-agent': 'app/1.0'}
r = requests.get(url, headers=headers)
print(r.request.headers) # 響應狀態碼
上述程式碼,我們仍然可以請求成功,只是更改了 user-agent
欄位而已,返回的結果如下所示:
{'user-agent': 'muke_app/1.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
5. 高階內容
上面的內容我們只是羅列了一些 requests 庫經常使用的功能,但是已經足夠我們進行爬蟲開發了。當然 requests 庫還有許多的高階功能比如設定請求時間,會話,代理,以及身份認證等。有興趣的同學可以參考去 Requests官網 學習。這裡我們就不一一贅述了。
6. 小結
這一個小節,我們講解了 Requests 第三方庫,介紹了安裝,以及請求和響應。Reqeusts 庫的設計非常的簡單方便,絕大多數的爬蟲程式都是使用Requests庫進行網頁的爬取。