《Python網(wǎng)絡爬蟲基礎教程》 課件-第3章 抓取靜態(tài)網(wǎng)頁數(shù)據(jù)_第1頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第3章 抓取靜態(tài)網(wǎng)頁數(shù)據(jù)_第2頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第3章 抓取靜態(tài)網(wǎng)頁數(shù)據(jù)_第3頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第3章 抓取靜態(tài)網(wǎng)頁數(shù)據(jù)_第4頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第3章 抓取靜態(tài)網(wǎng)頁數(shù)據(jù)_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第3章抓取靜態(tài)網(wǎng)頁數(shù)據(jù)《Python網(wǎng)絡爬蟲基礎教程》學習目標/Target了解抓取靜態(tài)網(wǎng)頁的實現(xiàn)技術(shù),能夠說出每種實現(xiàn)技術(shù)的特點掌握Requests中基本請求的發(fā)送方式,能夠向服務器發(fā)送GET請求和POST請求掌握Requests中響應內(nèi)容的處理方式,能夠根據(jù)需要獲取響應內(nèi)容學習目標/Target掌握Requests中請求頭的定制方式,能夠為GET請求和POST請求定制請求頭掌握Requests中代理服務器的設置方式,能夠為請求設置代理服務器掌握Requests中異常的處理方式,能夠處理請求超時異常章節(jié)概述/Summary靜態(tài)網(wǎng)頁是早期網(wǎng)站中經(jīng)常用到的頁面,這類網(wǎng)頁的特點是所有數(shù)據(jù)都直接呈現(xiàn)在網(wǎng)頁源代碼中,對于網(wǎng)絡爬蟲來說,只要獲取了靜態(tài)網(wǎng)頁的源代碼,就相當于抓取了靜態(tài)網(wǎng)頁的數(shù)據(jù)。本章將針對抓取靜態(tài)網(wǎng)頁數(shù)據(jù)的相關內(nèi)容進行詳細地講解。目錄/Contents3.13.23.3抓取靜態(tài)網(wǎng)頁的實現(xiàn)技術(shù)發(fā)送基本請求處理復雜請求目錄/Contents3.43.53.6設置代理服務器處理異常實踐項目:抓取黑馬程序員論壇的數(shù)據(jù)抓取靜態(tài)網(wǎng)頁的技術(shù)3.1了解抓取靜態(tài)網(wǎng)頁的實現(xiàn)技術(shù),能夠說出每種實現(xiàn)技術(shù)的特點學習目標3.1抓取靜態(tài)網(wǎng)頁的技術(shù)靜態(tài)網(wǎng)頁是HTML格式的網(wǎng)頁,這種網(wǎng)頁在瀏覽器中呈現(xiàn)的內(nèi)容都會體現(xiàn)在源代碼中,此時我們?nèi)粢ト§o態(tài)網(wǎng)頁的數(shù)據(jù),只需要獲得網(wǎng)頁的源代碼即可。網(wǎng)絡爬蟲抓取靜態(tài)網(wǎng)頁數(shù)據(jù)的過程就是獲得網(wǎng)頁源代碼的過程,這個過程模仿用戶通過瀏覽器訪問網(wǎng)頁的過程,包括向Web服務器發(fā)送HTTP請求、服務器對HTTP請求做出響應并返回網(wǎng)頁源代碼。3.1抓取靜態(tài)網(wǎng)頁的技術(shù)為幫助開發(fā)人員抓取靜態(tài)網(wǎng)頁數(shù)據(jù),減少開發(fā)人員的開發(fā)時間,Python提供了一些功能齊全的庫,包括urllib、urllib3和Requests,其中urllib是Python內(nèi)置庫,無須安裝便可以直接在程序中使用;urllib3和Requests都是第三方庫,需要另行安裝后才可以在程序中使用。urlliburllib是Python最早內(nèi)置的HTTP客戶端庫,它涵蓋了基礎的網(wǎng)絡請求功能。urllib3urllib3是一個強大的、用戶友好的Python的HTTP客戶端庫,包括線程安全、連接池、客戶端TLS/SSL驗證、壓縮編碼等功能。RequestsRequests基于urllib3編寫,該庫會在請求完后重復使用Socket套接字,不會與服務器斷開連接,而urllib庫會在請求完之后與服務器斷開連接。3.1抓取靜態(tài)網(wǎng)頁的技術(shù)本書后續(xù)選擇用Requests庫進行開發(fā),截至2021年9月,Requests庫的最新版本是2.25.1。值得一提的是,Requests庫是第三方庫,它可以通過pip工具進行安裝,如此便可以在導入程序后直接使用。Requests庫的安裝命令如下。pipinstallrequests3.1抓取靜態(tài)網(wǎng)頁的技術(shù)發(fā)送基本請求3.2掌握Requests中基本請求的發(fā)送方式,能夠向服務器發(fā)送GET請求學習目標3.2.1發(fā)送GET請求在Requests庫中,GET請求通過調(diào)用get()函數(shù)發(fā)送,該函數(shù)會根據(jù)傳入的URL構(gòu)建一個請求(每個請求都是Request類的對象),將該請求發(fā)送給服務器。get()函數(shù)的聲明如下:3.2.1發(fā)送GET請求get(url,params=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,**kwargs)url:必選參數(shù),表示請求的URL。params:可選參數(shù),表示請求的查詢字符串。headers:可選參數(shù),表示請求的請求頭,該參數(shù)只支持字典類型的值。cookies:可選參數(shù),表示請求的Cookie信息,該參數(shù)支持字典或CookieJar類對象。verify:可選參數(shù),表示是否啟用SSL證書,默認值為True。proxies:可選參數(shù),用于設置代理服務器,該參數(shù)只支持字典類型的值。timeout:可選參數(shù),表示請求網(wǎng)頁時設定的超時時長,以秒為單位。3.2.1發(fā)送GET請求

不攜帶url參數(shù)的GET請求importrequests#準備URLbase_url='/'#根據(jù)URL構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應信息response=requests.get(url=base_url)#查看響應碼print(response.status_code)使用get()函數(shù)可以發(fā)送不攜帶url參數(shù)和攜帶url參數(shù)的GET請求。若GET請求的URL中不攜帶參數(shù),我們在調(diào)用get()函數(shù)發(fā)送GET請求時只需要給url參數(shù)傳入指定的URL即可。3.2.1發(fā)送GET請求

攜帶url參數(shù)的GET請求使用get()函數(shù)可以發(fā)送不攜帶url參數(shù)和攜帶url參數(shù)的GET請求。若GET請求的URL中攜帶參數(shù),在調(diào)用get()函數(shù)發(fā)送GET請求時只需要給url參數(shù)傳入指定的URL即可。importrequestsbase_url='/s'param='wd=python'full_url=base_url+'?'+param#拼接完整的URL#根據(jù)URL構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應信息response=requests.get(full_url)#查看響應碼print(response.status_code)方式一3.2.1發(fā)送GET請求

攜帶url參數(shù)的GET請求importrequestsbase_url='/s'wd_params={'wd':'python'}#根據(jù)URL構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應response=requests.get(base_url,params=wd_params)#查看響應碼print(response.status_code)使用get()函數(shù)可以發(fā)送不攜帶url參數(shù)和攜帶url參數(shù)的GET請求。方式二若GET請求的URL中攜帶參數(shù),在調(diào)用get()函數(shù)發(fā)送GET請求時只需要給url參數(shù)傳入指定的URL即可。掌握Requests中基本請求的發(fā)送方式,能夠向服務器發(fā)送POST請求學習目標3.2.2發(fā)送POST請求3.2.2發(fā)送POST請求如果網(wǎng)頁上form表單的method屬性的值設為POST,那么當用戶提交表單時,瀏覽器將使用POST方法提交表單內(nèi)容,并將各個表單元素及數(shù)據(jù)作為HTTP請求信息中的請求數(shù)據(jù)發(fā)送給服務器。例如,登錄美多商城時發(fā)送的請求是POST請求。此時,我們使用Fiddler工具捕獲該請求后,可以看到發(fā)送該請求時的請求數(shù)據(jù)。在Requests中,POST請求可以通過調(diào)用post()函數(shù)發(fā)送,post()函數(shù)會根據(jù)傳入的URL構(gòu)建一個請求,將該請求發(fā)送給服務器,并接收服務器成功響應后返回的響應信息。post()函數(shù)的聲明如下:post(url,data=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,json=None,**kwargs)3.2.2發(fā)送POST請求data:可選參數(shù),表示請求數(shù)據(jù)。該參數(shù)可以接收3種類型的值,分別為字典、字節(jié)序列和文件對象。當參數(shù)值是一個字典時,字典的鍵為請求數(shù)據(jù)的字段,字典的值為請求數(shù)據(jù)中該字段對應的值,例如{"ie":"utf-8","wd":"python"}。json:可選參數(shù),表示請求數(shù)據(jù)中的JSON數(shù)據(jù)。以美多商城網(wǎng)站為例,為大家演示如何使用post()函數(shù)請求美多商城網(wǎng)站首頁,具體代碼如下。importrequestsbase_url='/login/'#準備請求數(shù)據(jù)form_data={'csrfmiddlewaretoken':'FDb8DNVnlcFGsjIONtwiQoi6PtmCLeBsRgyjx2o2nsZ4MXDEGDeM2dUImEkj9O7t','username':'admin','pwd':'admin','remembered':'on'}response=requests.post(base_url,data=form_data)#根據(jù)URL構(gòu)造請求,發(fā)送POST請求print(response.status_code)#查看響應信息的狀態(tài)碼3.2.2發(fā)送POST請求在Requests庫中,Response類的對象中封裝了服務器返回的響應信息,包括響應頭和響應內(nèi)容等。除了前面介紹的status_code屬性之外,Response類中還提供了一些其他屬性。3.2.3處理響應屬性說明status_code獲取服務器返回的狀態(tài)碼text獲取字符串形式的響應內(nèi)容content獲取二進制形式的響應內(nèi)容url獲取響應的最終URLrequest獲取請求方式headers獲取響應頭encoding設置或獲取響應內(nèi)容的編碼格式,與text屬性搭配使用cookies獲取服務器返回的Cookie通過訪問Response類對象的text屬性可以獲取字符串形式的網(wǎng)頁源代碼。3.2.3處理響應importrequestsbase_url='/'#根據(jù)URL構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應信息response=requests.get(url=base_url)#查看響應內(nèi)容print(response.text)

獲取網(wǎng)頁源代碼為了保證獲取的源代碼中能夠正常顯示中文,這里需要通過Response對象的encoding屬性將編碼格式設置為UTF-8。3.2.3處理響應importrequestsbase_url='/'#根據(jù)URL構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應信息response=requests.get(url=base_url)#設置響應內(nèi)容的編碼格式response.encoding='utf-8'#查看響應內(nèi)容print(response.text)

獲取網(wǎng)頁源代碼百度首頁上除了文字信息之外,還包含一個百度Logo圖片。若希望獲取百度Logo的圖片,我們需要先根據(jù)該圖片對應的請求URL發(fā)送請求,再使用content屬性獲取該圖片對應的二進制數(shù)據(jù),并將數(shù)據(jù)寫入到本地文件中。3.2.3處理響應importrequestsbase_url='/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'response=requests.get(base_url)#獲取百度Logo圖片對應的二進制數(shù)據(jù)print(response.content)#將二進制數(shù)據(jù)寫入程序所在目錄下的baidu_logo.png文件中withopen('baidu_logo.png','wb')asfile:file.write(response.content)

獲取圖片處理復雜請求3.33.3處理復雜請求在互聯(lián)網(wǎng)中,網(wǎng)頁中的內(nèi)容是千變?nèi)f化的,如果只根據(jù)請求URL發(fā)送基本請求有可能無法獲取網(wǎng)站的響應,此時需要根據(jù)網(wǎng)站接收請求的要求完善請求。例如,在訪問登錄后的頁面時需要給請求頭帶上Cookies,在遇到403錯誤時需要給請求頭添加User-Agent。掌握Requests中請求頭的定制方式,能夠為GET請求和POST請求定制請求頭學習目標3.3.1定制請求頭打開Fiddler工具,在Chrome瀏覽器中加載知乎網(wǎng)登錄頁面,加載完成后切換至Fiddler工具,在窗口左側(cè)選中剛剛發(fā)送的HTTP請求,并在窗口右側(cè)查看該請求對應的請求頭信息。3.3.1定制請求頭定制請求頭分為兩步,分別是查看請求頭和設置請求頭。查看請求頭importrequestsbase_url='/signin'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64''AppleWebKit/537.36(KHTML,likeGecko)Chrome/92.0.4515.131Safari/537.36'}#根據(jù)URL和請求頭構(gòu)造請求,發(fā)送GET請求,接收服務器返回的響應response=requests.get(base_url,headers=header)response.encoding='utf-8'#查看響應內(nèi)容print(response.text)3.3.1定制請求頭在requests中,設置請求頭的方式非常簡單,只需要在調(diào)用請求函數(shù)時為headers參數(shù)傳入定制好的請求頭即可,一般是將請求頭中的字段與值分別作為字典的鍵與值,以字典的形式傳給headers參數(shù)。設置請求頭掌握Requests中請求頭的定制方式,能夠為GET請求和POST設置Cookie學習目標3.3.2驗證CookieCookie(有時也用其復數(shù)形式Cookies)是指某些網(wǎng)站為了辨別用戶身份、進行會話跟蹤,而暫時存儲在客戶端的一段文本數(shù)據(jù)(通常經(jīng)過加密)。在Requests庫中,發(fā)送請求時可以通過兩種方式攜帶Cookie,一種方式直接將包含Cookie信息的請求頭傳入請求函數(shù)的headers參數(shù);另一種方式是將Cookie信息傳入請求函數(shù)的cookies參數(shù)。不過,cookies參數(shù)需要接收一個RequestsCookieJar類的對象,該對象類似一個字典,它會以名稱(Name)與值(Value)的形式存儲Cookie。3.3.2驗證Cookieimportrequestsheaders={'Cookie':'此處填寫登錄百度網(wǎng)站后查看的Cookie信息',#設置字段Cookie'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_4)''AppleWebKit/537.36(KHTML,likeGecko)''Chrome/53.0.2785.116Safari/537.36',}#設置字段User-Agentresponse=requests.get('/',headers=headers)print(response.text)3.3.2驗證Cookie以登錄后的百度首頁為例,使用兩種方式演示如何使用Requests實現(xiàn)Cookie登錄。方式一importrequestsheader={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_4)''AppleWebKit/537.36(KHTML,likeGecko)Chrome/53.0.2785.116Safari/537.36'}cookie='此處填寫登錄百度網(wǎng)站后查看的Cookie信息‘#準備Cookiejar_obj=requests.cookies.RequestsCookieJar()#創(chuàng)建RequestsCookieJar類對象fortempincookie.split(';'):#以逗號為分隔符分割cookie,并將獲得的鍵和值保存至jar_obj中key,value=temp.split('=',1)jar_obj.set(key,value)response=requests.get('/',headers=header,cookies=jar_obj)print(response.text)3.3.2驗證Cookie方式二以登錄后的百度首頁為例,使用兩種方式演示如何使用Requests實現(xiàn)Cookie登錄。掌握Requests中的保持會話,能夠通過Session類管理會話學習目標3.3.3保持會話importrequests#創(chuàng)建會話sess_obj=requests.Session()sess_obj.get('/cookies/set/sessioncookie/123456789')response=sess_obj.get("/cookies")print(response.text)在Requests中,Session類負責管理會話,通過Session類的對象不僅可以實現(xiàn)在同一會話內(nèi)發(fā)送多次請求的功能,還可以在跨請求時保持Cookie信息。使用Session類的對象先在請求一個測試網(wǎng)站時設置Cookie信息,然后在請求另一個網(wǎng)站時獲取Cookie信息,具體代碼如下。3.3.3保持會話{"cookies":{"sessioncookie":"123456789"}}在上頁代碼中,首先創(chuàng)建了一個Session類對象sess_obj,然后基于sess_obj對象發(fā)送了一個GET請求到測試網(wǎng)站,并且在請求該測試網(wǎng)站時設置了Cookie信息,其中Cookie的名稱設置為sessioncookie,內(nèi)容為123456789,最后基于sess_obj對象請求另一個網(wǎng)站,獲取上次請求時設置的Cookie信息。3.3.3保持會話importrequestsrequests.get('/cookies/set/sessioncookie/123456789')response=requests.get("/cookies")print(response.text)若不使用Session類對象請求測試網(wǎng)站,而是直接使用Requests庫請求測試網(wǎng)站。3.3.3保持會話運行程序,結(jié)果如下所示。{"cookies":{}}掌握SSL證書驗證,能夠通過Requests實現(xiàn)SSL證書驗證學習目標3.3.4SSL證書驗證SSL證書是一種數(shù)字證書,類似于駕駛證、護照和營業(yè)執(zhí)照的電子副本,由受信任的數(shù)字證書頒發(fā)機構(gòu)CA在驗證服務器身份后頒發(fā),具有服務器身份驗證和數(shù)據(jù)傳輸加密功能。3.3.4SSL證書驗證當使用Requests調(diào)用請求函數(shù)發(fā)送請求時,由于請求函數(shù)的verify參數(shù)的默認值為True,所以每次請求網(wǎng)站時默認都會進行SSL證書的驗證。不過,有些網(wǎng)站可能沒有購買SSL證書,或者SSL證書失效,當程序訪問這類網(wǎng)站時會因為找不到SSL證書而拋出SSLError異常。例如,使用Requests請求國家數(shù)據(jù)網(wǎng)站,具體代碼如下。3.3.4SSL證書驗證importrequestsbase_url='/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64''AppleWebKit/537.36(KHTML,likeGecko)''Chrome/90.0.4430.212Safari/537.36'}response=requests.get(base_url,headers=header)print(response.status_code)運行上頁代碼,程序拋出SSLError異常,具體如下所示。3.3.4SSL證書驗證requests.exceptions.SSLError:HTTPSConnectionPool(host='',port=443):Maxretriesexceededwithurl:/(CausedbySSLError(SSLCertVerificationError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]certificateverifyfailed:selfsignedcertificateincertificatechain(_ssl.c:1108)')))這時需要主動關閉SSL驗證,即在調(diào)用get()函數(shù)時將verify參數(shù)設置為False,代碼如下所示。response=requests.get(base_url,headers=header,verify=False)再次運行代碼,控制臺沒有輸出SSLError異常,而是輸出了如下警告信息:3.3.4SSL證書驗證C:\Users\admin\AppData\Roaming\Python\Python38\site-packages\urllib3\connectionpool.py:981:InsecureRequestWarning:UnverifiedHTTPSrequestisbeingmadetohost''.Addingcertificateverificationisstronglyadvised.See:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings這時,如果不希望收到警告信息,可以采用如下方式消除警告信息。importurllib3urllib3.disable_warnings()設置代理服務器3.4了解代理服務器,能夠代理服務器的工作原理以及代理服務器的分類學習目標3.4.1代理服務器簡介設置代理服務器是網(wǎng)絡爬蟲應對防爬蟲的策略之一,這種策略會為網(wǎng)絡爬蟲指定一個代理服務器,借用代理服務器IP地址訪問網(wǎng)站,掩蓋網(wǎng)絡爬蟲所在主機的真實IP地址,從而達到偽裝IP地址的目的。3.4.1代理服務器簡介網(wǎng)絡爬蟲在抓取網(wǎng)頁的數(shù)據(jù)時,可能會出現(xiàn)這樣的情況:起初可以正常抓取網(wǎng)頁的數(shù)據(jù),一段時間后便不能繼續(xù)抓取了,可能會收到403錯誤及提示信息“您的IP訪問頻率過高”。之所以出現(xiàn)這種現(xiàn)象是因為網(wǎng)站采取了防爬蟲措施,該網(wǎng)站會檢測某個IP地址在單位時間內(nèi)訪問的次數(shù),如果超過其設定的閾值,就會直接拒絕為擁有該IP地址的客戶端服務,這種情況稱為封IP。3.4.1代理服務器簡介為避免網(wǎng)絡爬蟲被封IP,我們可以利用某種技術(shù)偽裝IP地址,讓服務器識別不出由哪臺設備發(fā)起的請求,這種技術(shù)就是代理服務器,代理服務器(ProxyServer)用于代理客戶端用戶去服務器端獲得網(wǎng)絡信息。3.4.1代理服務器簡介代理服務器介于客戶端和服務器之間。沒有代理服務器之前,客戶端會直接將請求發(fā)送給Web服務器,然后Web服務器將響應信息返回給客戶端;有了代理服務器之后,客戶端不再直接向Web服務器發(fā)送請求,而是先將這個請求發(fā)送到代理服務器,由代理服務器轉(zhuǎn)發(fā)給Web服務器,之后由代理服務器將收到的響應信息返回給客戶端。并非所有的代理服務器都適合網(wǎng)絡爬蟲,我們在使用代理服務器時,主要考慮代理服務器的匿名程度。根據(jù)代理服務器的匿名程度,代理服務器可以分為3類,分別是高度匿名代理、普通匿名代理和透明代理。3.4.1代理服務器簡介會將數(shù)據(jù)包原封不動地轉(zhuǎn)發(fā)給服務器,讓服務器認為當前訪問的用戶只是一個普通客戶端,而不是代理服務器,并記錄代理服務器的IP地址。會對數(shù)據(jù)包進行一些改動,這時服務器可能會發(fā)現(xiàn)當前訪問的用戶是代理服務器,也可能會追查到客戶端的真實IP地址。不僅會改動數(shù)據(jù)包,還會暴露當前訪問客戶端的真實IP地址。代理服務器高度匿名代理服務器普通匿名代理服務器透明代理服務器使用高度匿名代理服務器,對方服務器完全不知道客戶端使用了代理,更不知道客戶端的真實IP地址,代理的信息完全替代了客戶端的所有信息;使用普通匿名代理服務器,雖然對方服務器可以知道客戶端使用了代理,但并不知道客戶端的真實IP地址;使用透明代理服務器,對方服務器可以知道客戶端使用了代理,并且也知道客戶端的真實IP地址。因此,高度匿名代理服務器是最理想的選擇。3.4.1代理服務器簡介掌握設置代理服務器,能夠在requests中設置代理服務器學習目標3.4.2設置代理服務器設置代理服務器一般分為兩步,分別是獲取代理IP和設置代理IP。3.4.2設置代理服務器獲取免費代理IP免費代理IP基本沒有成本,我們可以從免費代理網(wǎng)站上?;ヂ?lián)網(wǎng)上存在許多代理商,用戶付費后便可以獲得一些高質(zhì)量的代理IP。ADSL撥號ADSL通過撥號的方式上網(wǎng),需要輸入ADSL賬號和密碼,每次撥號都會更換一個新的IP地址。獲取付費代理IP

獲取代理IP設置代理服務器一般分為兩步,分別是獲取代理IP和設置代理IP。3.4.2設置代理服務器

設置代理IP在Requests中,設置代理IP的方式非常簡單,我們只需要在調(diào)用請求函數(shù)時為proxies參數(shù)傳入一個字典,該字典中包含了所需要的代理IP,其中字典的鍵為代理類型(http或https),字典的值為“代理類型://IP地址:端口號”格式的字符串。proxies={'http':'0:3128','https':'0:1080',}通過一個示例來演示如何從IP地址列表中隨機選擇一個IP地址,將該IP地址設置為代理IP,基于該代理IP請求小兔鮮兒網(wǎng)首頁。3.4.2設置代理服務器importrequests,randomproxy_list=[{"http":"49:3129"},{"http":":3256"},{"http":"6:3000"},{"http":"02:3256"},{"http":"63:3256"}]base_url='/#/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.212Safari/537.36'}#發(fā)送GET請求,將proxy_list中任意一個IP地址設為代理response=requests.get(base_url,headers=header,proxies=random.choice(proxy_list))print(response.status_code)程序中使用的代理IP是免費的,由于這些代理IP的使用時間不固定,一旦超出使用時間范圍就會失效,此時再運行上述程序會出現(xiàn)ProxyError異常。因此,這里建議大家換成自己查找的代理IP。3.4.2設置代理服務器掌握檢測代理IP,能夠通過Requests檢測代理IP是否有效學習目標3.4.3檢測代理IP的有效性互聯(lián)網(wǎng)上有很多免費的代理IP,這些IP地址并不都是有效的,為此我們需要對獲取的免費IP地址進行檢測,確定這個IP地址是否有效。檢測代理IP的過程比較簡單,我們需要先遍歷收集的所有代理IP,分別將取出來的每個代理IP依次設為代理,再通過該IP地址向網(wǎng)站發(fā)送請求,如果請求成功,則說明該IP地址是有效的;如果請求失敗,則說明該IP地址是無效的,需將該IP地址進行剔除。3.4.3檢測代理IP的有效性3.4.3檢測代理IP的有效性importrequestsproxy_list=[{"http":"49:3129"},{"http":":3256"},{"http":"6:3000"},{"http":"02:3256"},{"http":"63:3256"}]base_url='/#/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64AppleWebKit/537.36(KHTML,likeGecko)''Chrome/90.0.4430.212Safari/537.36'}forper_ipinproxy_list.copy():try:#發(fā)送GET請求,將獲取的每個IP地址設置為代理

response=requests.get(base_url,headers=header,proxies=per_ip,timeout=3)except:#失敗則輸出IP地址無效,并將該IP地址從proxy_list列表中移除

print(f'IP地址:{per_ip.get("http")}無效')proxy_list.remove(per_ip)else:

print(f'IP地址:{per_ip.get("http")}有效')#成功則輸出IP地址有效下面演示如何檢測代理IP的有效性,具體代碼如下。處理異常3.5掌握Requests中異常的處理方式,能夠處理請求超時異常學習目標3.5處理異常3.5處理異常每個程序在運行過程中可能會遇到各種各樣的問題,網(wǎng)絡爬蟲自然也不例外。網(wǎng)絡爬蟲訪問網(wǎng)站離不開網(wǎng)絡的支撐。由于網(wǎng)絡環(huán)境十分復雜,具有一定的不可控性,所以每次訪問網(wǎng)站后不一定能夠成功地獲得從服務器返回的數(shù)據(jù)。網(wǎng)絡爬蟲一旦在訪問過程中遇到一些網(wǎng)絡問題(如DNS故障、拒絕連接等),就會導致程序引發(fā)異常并停止運行。3.5處理異常requests.exceptions模塊中定義了很多異常類型,常見的異常類型如下表。異常類型說明RequestException請求異常ConnectionError連接錯誤HTTPError發(fā)生HTTP錯誤URLRequired發(fā)出請求需要有效的URLTooManyRedirects請求超過配置的最大重定向數(shù)ConnectTimeout嘗試連接到遠程服務器時請求超時ReadTimeout服務器在規(guī)定的時間內(nèi)沒有發(fā)送任何數(shù)據(jù)Timeout請求超時Timeout繼承自RequestException,而ConnectTimeout和ReadTimeout又繼承自Timeout。3.5處理異常為保證程序能夠正常終止,我們可以使用try-except語句捕獲相應的異常,并對異常進行相應的處理。由于谷歌網(wǎng)站服務器的原因,訪問該網(wǎng)站必定會出現(xiàn)連接超時的問題。下面以訪問谷歌網(wǎng)站為例,為大家演示如何使用try-except語句捕獲RequestException異常。importtime,requestsprint(time.strftime('開始時間:%Y-%m-%d%H:%M:%S'))#記錄請求的發(fā)起時間try:#捕獲RequestException異常html_str=requests.get('').textprint('訪問成功')exceptrequests.exceptions.RequestExceptionaserror:print(error)#記錄請求的終止時間print(time.strftime('結(jié)束時間:%Y-%m-%d%H:%M:%S'))3.5處理異常為了減少無意義的等待,我們在發(fā)送HTTP請求時可以設置超時時長,即調(diào)用get()函數(shù)時傳入timeout參數(shù),并給該參數(shù)指定代表超時時長的值,如果超過該時長,服務器仍然沒有返回任何響應內(nèi)容,就讓程序立即引發(fā)一個超時異常。在以上示例中,為請求設置超時時長為5秒。html_str=requests.get('',timeout=5).text#發(fā)送GET請求,設置超時時長實踐項目:抓取黑馬程序員論壇的數(shù)據(jù)3.6掌握抓取黑馬程序員論壇網(wǎng)的數(shù)據(jù),能夠通過Requests抓取網(wǎng)站指定頁面數(shù)據(jù)學習目標3.6抓取黑馬程序員論壇網(wǎng)的數(shù)據(jù)黑馬程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論