官术网_书友最值得收藏!

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ù)

主站蜘蛛池模板: 安溪县| 太湖县| 漳州市| 高要市| 昌邑市| 林甸县| 邻水| 乌拉特前旗| 新竹县| 巴东县| 娄烦县| 弋阳县| 吴忠市| 广灵县| 绍兴市| 蒙城县| 桂阳县| 平邑县| 大悟县| 阳山县| 勐海县| 伊通| 上栗县| 津市市| 武胜县| 长顺县| 蓝田县| 璧山县| 泸水县| 康定县| 光山县| 资兴市| 遂宁市| 洛浦县| 昌乐县| 保德县| 彭水| 志丹县| 莎车县| 新建县| 靖西县|