新聞中心
網(wǎng)絡(luò)庫requests
其實(shí),我們有專門的網(wǎng)絡(luò)庫進(jìn)行直接的網(wǎng)絡(luò)請求與處理,它就是requests庫。在我們開始講解與使用之前,需要通過如下命令進(jìn)行安裝:

- pip install requests
首先,我們先來看看requests庫可以進(jìn)行哪些操作:
1.發(fā)送HTTP請求2.上傳文件3.處理Cookie4.支持Session會(huì)話5.使用代理6.身份驗(yàn)證7.打包請求8.SSL證書驗(yàn)證
下面,我們來一一介紹這些操作具體是如何實(shí)現(xiàn)的。
發(fā)送HTTP請求
與urllib與urllib3一樣,HTTP請求常用的是GET請求與POST請求。
GET請求
其中,GET請求使用的方式是requests.get()。它可以設(shè)置參數(shù)params,也可以設(shè)置超時(shí)timeout,同時(shí)也可以設(shè)置請求頭headers。
示例如下:
- import requests
- url = "https://www.csdn.net/"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- }
- result = requests.get(url=url, timeout=1, headers=headers)
- #打印網(wǎng)頁源代碼
- print(result.text)
- #打印響應(yīng)狀態(tài)碼
- print(result.status_code)
- #打印Cookie
- print(result.cookies)
- #打印result類型
- print(type(result))
運(yùn)行之后,輸出如下:
POST請求
接著,我們來介紹POST請求。這里,我們同樣使用測試網(wǎng)站http://httpbin.org/post,向它發(fā)送一些數(shù)據(jù)。示例如下:
- import requests
- url = "http://httpbin.org/post"
- data = {
- "name": "liyuanjing",
- "age": "29"
- }
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- }
- result = requests.post(url=url, timeout=1, headers=headers, data=data)
- # 打印網(wǎng)頁源代碼
- print(result.text)
- # 將其轉(zhuǎn)換為json
- print(result.json())
運(yùn)行之后,效果如下:
抓取二進(jìn)制圖片
對于文本文件的獲取,我們很簡單地通過text進(jìn)行處理分析。但是假如我們是獲取的一張圖片顯然text是無法還原真實(shí)內(nèi)容。
不僅如此,圖片的text是亂碼。所以,我們需要將獲取到的圖片二進(jìn)制數(shù)據(jù)通過相應(yīng)的API保存為文件。示例代碼如下:
- import requests
- url = "https://img1.baidu.com/it/u=954496120,1621506021&fm=26&fmt=auto&gp=0.jpg"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- }
- result = requests.get(url=url, timeout=1, headers=headers)
- with open('requests.png', 'wb') as f:
- f.write(result.content)
運(yùn)行之后,就會(huì)在程序目錄的統(tǒng)計(jì)目錄下生成一張圖片,當(dāng)然圖片鏈接讀者可以自己去找。這里的鏈接暫時(shí)有效。
需要注意的是,response.text是Unicode編碼,而response.content是原始二進(jìn)制字節(jié)流,這一點(diǎn)要額外注意,如果網(wǎng)頁出現(xiàn)亂碼,可以使用response.encoding=”gbk”進(jìn)行設(shè)置解析。
上傳文件
與講解urllib3一樣,我們這里上傳文件的服務(wù)器端口,由flask編寫。我們先來看看服務(wù)器端的代碼:
- import flask
- import os
- UPLOAD_FILE = 'uploads'
- app = flask.Flask(__name__)
- @app.route('/', methods=['POST'])
- def upload_file():
- file = flask.request.files['file']
- if file:
- file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))
- return '文件上傳成功'
- else:
- return '文件上傳失敗'
- if __name__ == '__main__':
- app.run()
運(yùn)行此段代碼,默認(rèn)會(huì)一直運(yùn)行等待下去。
而使用requests進(jìn)行文件的上傳,也非常的簡單,因?yàn)槲募蟼魇荘ost請求,我們只需要設(shè)置file參數(shù)。示例如下:
- import requests
- url = "http://127.0.0.1:5000"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- }
- files = {
- "file": open('123.png', 'rb')
- }
- result = requests.post(url=url, files=files)
- print(result.text)
運(yùn)行之后,會(huì)在項(xiàng)目文件uploads文件夾下多一個(gè)123.png圖片,當(dāng)然123上傳時(shí)的文件必須存在。同時(shí)也要事先創(chuàng)建uploads文件夾。
處理Cookie
一般來說,爬蟲分為2個(gè)部分:首先是登錄,然后才是爬取。而在登錄時(shí),我們一般使用selenium,進(jìn)行cookie的返回。
接著使用requests進(jìn)行爬取網(wǎng)頁的源代碼,因?yàn)閟elenium是一個(gè)專門的庫,后面我們會(huì)介紹,這里我們先假設(shè)我們獲取到了cookie。
直接將Cookie設(shè)置到請求頭
為了更有意思,我們在chrome按F12之后,用瀏覽器評(píng)論一個(gè)CSDN帖子,會(huì)捕捉到如下圖所示的請求數(shù)據(jù):
這里,我們可以復(fù)制cookie數(shù)據(jù)到我們的headers之中。
同時(shí)下面有一個(gè)提交表單,其中,content是我們評(píng)論CSDN的內(nèi)容,articleId是我們評(píng)論CSDN的帖子,讀者可以自己看看CSDN帖子是否有一串?dāng)?shù)字。
通過請求頭,評(píng)論CSDN
那么,我們可以仿照這個(gè)請求連接,通過requests完成CSDN的評(píng)論操作,示例代碼如下所示:
- import requests
- url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- 'cookie': 'CSDN登錄后返回的cookie',
- }
- data = {
- "commentId": "",
- "content": "最近正在學(xué)習(xí)剛好能用上",
- "articleId": "118750834",
- }
- result = requests.post(url=url, data=data, headers=headers)
- print(result.status_code)
運(yùn)行之后,控制臺(tái)會(huì)輸出200,同時(shí)評(píng)論帖子下面會(huì)多出一條評(píng)論數(shù)據(jù),如下圖所示:
RequestsCookieJar()
除了通過請求頭設(shè)置Cookie進(jìn)行訪問之外,其實(shí)我們的post()方法還有一個(gè)專門的cookies參數(shù),它用于接收RequestsCookieJar對象。
示例如下:
- import requests
- url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- }
- cookieStr = 'CSDN登錄后返回的cookie'
- data = {
- "commentId": "",
- "content": "最近正在學(xué)習(xí)剛好能用上",
- "articleId": "118517922",
- }
- jar = requests.cookies.RequestsCookieJar()
- for cookie in cookieStr.split(";"):
- key, value = cookie.split('=', 1)
- jar.set(key, value)
- result = requests.post(url=url, data=data, headers=headers, cookies=jar)
- print(result.status_code)
這段代碼與前文運(yùn)行效果一樣,這里不再輸出運(yùn)行結(jié)果,僅僅只是cookie使用方式的不同形式。
Session會(huì)話
cookie數(shù)據(jù)保存在客戶端,session數(shù)據(jù)保存在服務(wù)器端,一個(gè)Session代表一個(gè)特定的客戶端。那么如何在特定的客戶端與服務(wù)器端的Session對象之間建立聯(lián)系呢?
通常就是不斷在客戶端與服務(wù)器端之間來回傳遞一個(gè)ID,通過這個(gè)ID,客戶端就能在服務(wù)器端找到對應(yīng)的Session對象。
在實(shí)際的爬蟲項(xiàng)目中,有時(shí)候需要使用同一個(gè)客戶端來多次抓取頁面,就可以用到Session。示例代碼如下:
- result = requests.post(url=url, data=data, headers=headers, cookies=jar)
- session = requests.Session()
- r2 = session.post(url=url, data=data, headers=headers, cookies=jar)
- print(r2.status_code)
這里,我們將上面的Cookie代碼改一改即可。
使用代理
對于requests庫來說,使用代理非常簡單,因?yàn)間et與post函數(shù)都有一個(gè)proxies參數(shù),用于設(shè)置代理即可。示例如下:
- import requests
- url = "https://www.csdn.net/"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- }
- proxies = {
- 'http': 'http://183.47.138.80:8888',
- 'http': 'http://125.78.226.217:8888'
- }
- result = requests.post(url=url, proxies=proxies)
需要注意的是,這里的代理IP博主測試的時(shí)候是有效的,但讀者可能讀到的時(shí)候已經(jīng)失效,讀者可以自己去網(wǎng)絡(luò)搜尋免費(fèi)的代理測試。
除了基本的HTTP代理,Request還支持SOCKS協(xié)議的代理。這是一個(gè)可選的功能,若要使用,需要使用下面的命令安裝第三方庫。
- pip install requests[socks]
安裝完成之后,替換proxies即可。
- proxies = {
- 'http': 'socks5://user:pass@host:port',
- 'https': 'socks5://user:pass@host:port'
- }
身份驗(yàn)證
requests庫還提供了身份驗(yàn)證功能,其中,get與post方法有一個(gè)auth參數(shù)專門用于身份驗(yàn)證,傳入的參數(shù)是HTTPBasicAuth,示例代碼如下:
- import requests
- from requests.auth import HTTPBasicAuth
- url = "https://www.csdn.net/"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- }
- result = requests.post(url=url, auth=HTTPBasicAuth('name', 'password'))
- print(result.status_code)
這里,只是給讀者展示如何通過代碼進(jìn)行身份驗(yàn)證,如果你自己編寫服務(wù)器,可以通過如上代碼進(jìn)行操作,這里就不編寫了。
打包請求
不管是上面的get請求還是post請求,我們都是通過requests.get或者requests.post進(jìn)行操作的,但其實(shí)我們可以將請求參數(shù)單獨(dú)列出來打包。
也就是,俗稱的封裝。示例代碼如下所示:
- import requests
- url = "https://www.csdn.net/"
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- }
- req = requests.Request('get', url=url, headers=headers)
- session = requests.Session()
- prepared = session.prepare_request(req)
- result = session.send(prepared)
- print(result.text)
這里,通過Request進(jìn)行封裝請求數(shù)據(jù),然后調(diào)用Session的prepare_request方法處理Request對象,并返回一個(gè)requests.models.Response對象。
最后,通過Session.send方法發(fā)送Response對象。
SLL證書驗(yàn)證
在requests請求中,有一個(gè)verify的參數(shù)。訪問HTTPS時(shí),如果需要驗(yàn)證SSL證書,可以不設(shè)置該數(shù)據(jù),它默認(rèn)為True表示驗(yàn)證證書。
如果不需要驗(yàn)證證書,可以設(shè)置verify等于False,那么就不會(huì)進(jìn)行驗(yàn)證。驗(yàn)證的代碼很簡單,就是什么也不用做即可,代碼如下:
- import requests
- try:
- url = "https://www.csdn.net/"
- result = requests.get(url)
- print(result.status_code)
- except requests.exceptions.SSLError as e:
- print(e.args[0])
如果你的網(wǎng)站沒有SLL證書,或者證書未經(jīng)過權(quán)威機(jī)構(gòu)認(rèn)證,則會(huì)拋出SSLError異常。
如果你的網(wǎng)站有SLL證書,且經(jīng)過了權(quán)威的認(rèn)證,那么就不會(huì)拋出異常。
而如果你不想驗(yàn)證證書的話,可以將代碼修改為如下代碼:
- import requests
- try:
- urllib3.disable_warnings()
- url = "https://www.csdn.net/"
- result = requests.get(url, verify=False)
- print(result.status_code)
- except requests.exceptions.SSLError as e:
- print(e.args[0])
不過,它會(huì)報(bào)InsecureRequestWarning警告信息,如果需要禁止輸出警告信息,可以使用urllib3.disable_warnings()進(jìn)行屏蔽。
文章名稱:自動(dòng)評(píng)論何須學(xué)完爬蟲,只需要掌握Requests庫即可
標(biāo)題路徑:http://m.5511xx.com/article/cdcogps.html


咨詢
建站咨詢
