- Python全棧開發(fā):數(shù)據(jù)分析
- 夏正東編著
- 2254字
- 2023-07-17 20:52:43
1.3.2 requests庫
requests庫是一個功能更加強大的網(wǎng)絡(luò)請求庫,其在模擬登錄、使用代理IP等方面均比urllib庫更加方便,進而可以節(jié)約大量的工作時間,幫助程序員更加方便地對所需要的網(wǎng)頁信息進行爬取。
由于requests庫屬于Python的第三方庫,所以需要進行安裝,只需在命令提示符中輸入命令pip install requests。
1.發(fā)送HTTP請求
可以通過requests庫中的get()函數(shù)和post()函數(shù)發(fā)送HTTP請求。
1)get()函數(shù)
該函數(shù)表示使用GET方法發(fā)起HTTP請求,并返回Response對象,其語法格式如下:
get(url,params,headers)
其中,參數(shù)url表示請求URL;參數(shù)params表示GET方法的請求參數(shù);參數(shù)headers表示請求頭的信息。
此外,通過Response對象的相關(guān)屬性和方法可以獲取所需的數(shù)據(jù),具體如表1-10所示。
表1-10 Response對象的相關(guān)屬性和方法

以下為get()函數(shù)的相關(guān)示例代碼。
(1)爬取百度首頁的源代碼,示例代碼如下:
#資源包\Code\chapter1\1.3\0124.py import requests url="http://www.baidu.com" response=requests.get(url=url) response.encoding="utf-8" print(response.url) print(response.status_code) print(response.headers) res=response.text with open("baidu.html","w",encoding="utf-8")as f: f.write(res)
(2)爬取老夏學(xué)院的Logo圖片,示例代碼如下:
#資源包\Code\chapter1\1.3\0125.py import requests url="http://www.oldxia.com/xzd/upload/static/image/common/logo.png" response=requests.get(url=url) #返回二進制的數(shù)據(jù) res=response.content with open("logo.png","wb")as f: f.write(res)
(3)爬取360搜索首頁的源代碼,示例代碼如下:
#資源包\Code\chapter1\1.3\0126.py import requests url="http://www.so.com" headers={ "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36", } response=requests.get(url=url,headers=headers) response.encoding="utf-8" res=response.text with open("360.html","w",encoding="utf-8")as f: f.write(res)
2)post()函數(shù)
該函數(shù)表示使用POST方法發(fā)起HTTP請求,并返回Response對象,其語法格式如下:
post(url,data,headers)
其中,參數(shù)url表示請求URL;參數(shù)data表示POST方法的請求參數(shù);參數(shù)headers表示請求頭的信息。
以下為post()函數(shù)的相關(guān)示例代碼。
(1)訪問老夏學(xué)院的HTTP請求測試頁面,示例代碼如下:
#資源包\Code\chapter1\1.3\0127.py import requests url="http://www.oldxia.com/http_test/post.php" data={'name':'夏正東','age':35} response=requests.post(url=url,data=data) res=response.text print(res)
(2)百度翻譯API,示例代碼如下:
#資源包\Code\chapter1\1.3\0128.py import requests url="https://fanyi.baidu.com/sug" name=input("請輸入要查詢的單詞:") headers={ "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36", } data={ "kw":name } response=requests.post(url=url,headers=headers,data=data) #響應(yīng)頭中的Content-Type為application/json res=response.json() print(res["data"][0]["v"])
2.模擬登錄
使用requests庫進行模擬登錄與urllib庫一樣,可以分為兩種方式,即手動添加Cookie和自動保存Cookie。
1)手動添加Cookie
該方式的應(yīng)用過程與urllib庫中手動添加Cookie的方式一致,示例代碼如下:
#資源包\Code\chapter1\1.3\0129.py import requests url="https://www.kuaidaili.com/usercenter/" headers={ "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36", "Cookie":"channelid=0;sid=1629544743008400;_gcl_au=1.1.1908873876.1629544864; _ga=GA1.2.810344698.1629544865;_gid= GA1.2.2144128861.1629544865;Hm_ lvt_ 7ed65b1cc4b810e9fd37959c9bb51b31 = 1629544865, 1629599040; Hm _ lpvt _ 7ed65b1cc4b810e9fd37959c9bb51b31 = 1629599043; sessionid = 5465c0121d88e755b9ecad8b82109136" } response=requests.get(url=url,headers=headers) response.encoding="utf-8" res=response.text with open("kuaidaili.html","w",encoding="utf-8")as f: f.write(res)
2)自動保存Cookie
該方式的應(yīng)用過程與urllib庫中自動保存Cookie的方式有所區(qū)別。在requests庫中,首先,需要通過Session類創(chuàng)建session對象,該對象可以自動保存Cookie,并且可以實現(xiàn)會話保持,然后,通過session對象的get()方法或post()方法發(fā)起HTTP請求即可,示例代碼如下:
#資源包\Code\chapter1\1.3\0130.py import requests #創(chuàng)建session對象,該對象會自動保存Cookie,并且可以實現(xiàn)會話保持 session=requests.Session() url="https://www.kuaidaili.com/login/" #POST方法的請求參數(shù) data={ "username":"13309861086", "passwd":"www.oldxia.com" } headers={ "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36", } #向登錄頁面發(fā)起HTTP請求,目的是獲取成功登錄后的Cookie,然后保存到session對象中 response=session.post(url=url,data=data,headers=headers) new_url="https://www.kuaidaili.com/usercenter/" #使用已經(jīng)自動保存Cookie的session對象向賬戶管理頁面發(fā)起HTTP請求 new_response=session.get(url=new_url,headers=headers) res=new_response.text with open("kuaidaili.html","w",encoding="utf-8")as f: f.write(res)
3.使用代理IP
在requests庫中,使用代理IP的應(yīng)用過程較urllib庫要簡單許多,只需在get()函數(shù)或post()函數(shù)中添加參數(shù)proxies,該參數(shù)表示代理IP,并且同樣可以分為兩種,即免費代理IP和收費代理IP,其格式與urllib庫中所使用的格式一致,示例代碼如下:
#資源包\Code\chapter1\1.3\0131.py import requests url='https://www.so.com/s?q=ip' #免費代理IP #proxy={ #"http":"http://42.56.238.40:3000", #"https":"http://42.56.238.40:3000" #} #收費代理IP proxy={ "http":"http://xiazhengdong:3p0h090r@110.85.202.232:18937", "https":"http://xiazhengdong:3p0h090r@110.85.202.232:18937" } headers={ "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36", } response=requests.get(url=url,headers=headers,proxies=proxy) res=response.text with open("so.html","w",encoding="utf-8")as f: f.write(res)
此時,運行so.html文件,其顯示的IP為“223.11.213.168中國山西省太原市中國電信”,如圖1-16所示,而筆者的真實IP為“113.234.106.225中國遼寧省大連市中國聯(lián)通”,如圖1-17所示。
4.驗證碼登錄
目前,互聯(lián)網(wǎng)上絕大多數(shù)的網(wǎng)站采取了各式各樣的措施來反網(wǎng)絡(luò)爬蟲技術(shù),其中一個常用的措施便是要求輸入驗證碼。早期的驗證碼是由純數(shù)字隨機組合而成的,后來加入了英文字母和混淆曲線等,并且隨著技術(shù)的不斷發(fā)展,驗證碼的種類也愈發(fā)繁多,包括有任意特殊字符的驗證碼、計算題類型的驗證碼、問答題類型的驗證碼和坐標(biāo)類型的驗證碼等。
Python網(wǎng)絡(luò)爬蟲實現(xiàn)驗證碼登錄的基本原理很簡單。首先,需要將網(wǎng)站登錄頁面中的驗證碼圖片保存下來,然后獲取該圖片中驗證碼的信息,并統(tǒng)一封裝,最后使用POST方法發(fā)送給服務(wù)器,進而實現(xiàn)驗證碼登錄。
雖然基本原理非常簡單,但是需要注意的是,在獲取驗證碼和登錄時,必須使用session對象來保持同一個會話,以保證獲取驗證碼和登錄時的Cookie一致,否則無法成功登錄。

圖1-16 使用代理IP后所查詢到的IP

圖1-17 真實IP
而關(guān)于獲取驗證碼中信息的方法,本書推薦讀者使用第三方識別平臺,如超級鷹等,因為個人開發(fā)的驗證碼識別API,其所能識別的驗證碼種類較少,并且識別率不高,相比來講,雖然第三方平臺需要付費使用,但是費用相對較低,并且識別驗證碼的種類非常全面,識別成功率也極高,可以幫助讀者極大地節(jié)省開發(fā)時間。
下面就以登錄超級鷹的用戶中心頁面為例,講解一下如何使用驗證碼登錄。
在本例中,推薦讀者使用第三方驗證碼識別平臺超級鷹,其驗證碼識別API提供了一個模塊chaojiying,通過該模塊中的Chaojiying_Client類可以完成識別驗證碼的任務(wù),其語法格式如下:
Chaojiying_Client(username,password,soft_id)
其中,參數(shù)username表示登錄賬號;參數(shù)password表示登錄密碼;參數(shù)soft_id表示驗證碼類型,具體類型可查閱http://www.chaojiying.com/price.html,示例代碼如下:
#資源包\Code\chapter1\1.3\01\0132.py from chaojiying import Chaojiying_Client import requests session=requests.Session() headers={ "User-Agent":"Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400", } #超級鷹登錄頁面的URL url="http://www.chaojiying.com/user/login" #保持會話,以保證獲取驗證碼和登錄用戶中心頁面時的Cookie一致 response=session.get(url=url,headers=headers) #驗證碼的URL,如圖1-18所示 url_img="http://www.chaojiying.com/include/code/code.php?u=1" url_response=session.get(url_img) img=url_response.content #獲取驗證碼圖片 with open("code.jpg",'wb')as f: f.write(img) #使用超級鷹識別驗證碼 chaojiying2=Chaojiying_Client(username='13309861086',password='www.oldxia.com',soft_id ='920310') im=open("code.jpg",'rb').read() code=chaojiying2.PostPic(im,1902)["pic_str"] #獲取驗證碼圖片中的信息 print(code) #POST方法的請求參數(shù),如圖1-19所示 data={ "user":"13309861086", "pass":"www.oldxia.com", "imgtxt":code, "act":1 } new_resposne=session.post(url=url,data=data,headers=headers) #登錄超級鷹的用戶中心頁面 new_url="http://www.chaojiying.com/user/" final_response=session.get(url=new_url,headers=headers) res=final_response.text with open("chaojiying.html","w",encoding="utf-8")as f: f.write(res)

圖1-18 驗證碼的URL

圖1-19 POST方法的請求參數(shù)
- Vue.js快跑:構(gòu)建觸手可及的高性能Web應(yīng)用
- 區(qū)塊鏈架構(gòu)與實現(xiàn):Cosmos詳解
- Web Application Development with R Using Shiny(Second Edition)
- Data Analysis with Stata
- 利用Python進行數(shù)據(jù)分析(原書第3版)
- UML 基礎(chǔ)與 Rose 建模案例(第3版)
- Terraform:多云、混合云環(huán)境下實現(xiàn)基礎(chǔ)設(shè)施即代碼(第2版)
- Node.js開發(fā)指南
- Python程序設(shè)計開發(fā)寶典
- Django Design Patterns and Best Practices
- IPython Interactive Computing and Visualization Cookbook
- Improving your Penetration Testing Skills
- 計算機常用算法與程序設(shè)計教程(第2版)
- KnockoutJS Blueprints
- Python AI游戲編程入門:基于Pygame和PyTorch