版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程PythonWangluoPachongJishuAnliJiaochengCOMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目錄COMMITTED第1章網(wǎng)絡(luò)爬蟲入門
第2章爬蟲基礎(chǔ)第3章網(wǎng)頁(yè)解析基礎(chǔ)第4章爬取動(dòng)態(tài)加載數(shù)據(jù)第5章反爬蟲策略第6章模擬登錄和處理驗(yàn)證碼
第7章爬取App和PC客戶端第8章爬蟲框架Scrapy第9章分布式爬蟲第10章項(xiàng)目實(shí)戰(zhàn)COMMITTEDCOMMITTEDCOMMITTECOMMITTECOMMITTED掃碼下載文旌課堂APP掃碼簽到(202X.XX.XXXX:XX至202X.XX.XXXX:XX)簽到方式教師通過“文旌課堂APP”生成簽到二維碼,并設(shè)置簽到時(shí)間,學(xué)生通過“文旌課堂APP”掃描“簽到二維碼”進(jìn)行簽到。簽到.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲第2章
爬蟲基礎(chǔ)本章導(dǎo)讀網(wǎng)絡(luò)爬蟲工作流程中的第一步就是爬取網(wǎng)頁(yè),只有爬取網(wǎng)頁(yè)獲得了網(wǎng)頁(yè)的源代碼,才能提取其中的有效信息。而爬取網(wǎng)頁(yè)首先就需要向Web服務(wù)器發(fā)送構(gòu)造的HTTP請(qǐng)求,從而獲得包含所需數(shù)據(jù)的HTTP響應(yīng)。本章從HTTP基本原理入手,介紹網(wǎng)絡(luò)爬蟲爬取網(wǎng)頁(yè)的基礎(chǔ)知識(shí),包括HTTP請(qǐng)求和HTTP響應(yīng)、urllib庫(kù)、requests庫(kù)和字符編碼等內(nèi)容。學(xué)習(xí)目標(biāo)理解HTTP的基本原理。了解urllib庫(kù)的使用方法。掌握requests庫(kù)的使用方法。了解Python中的字符編碼。能使用urllib庫(kù)和requests庫(kù)構(gòu)造HTTP請(qǐng)求實(shí)現(xiàn)網(wǎng)頁(yè)的爬取。2.1HTTP基本原理2.2urllib庫(kù)2.3requests庫(kù)第2章爬蟲基礎(chǔ)2.4字符編碼.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.1HTTP基本原理2.1HTTP基本原理2.1HTTP基本原理在瀏覽器中輸入一個(gè)URL,按回車鍵后便會(huì)在瀏覽器中顯示網(wǎng)頁(yè)內(nèi)容。實(shí)際上,這個(gè)過程是瀏覽器向Web服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求;Web服務(wù)器接收到這個(gè)請(qǐng)求后進(jìn)行解析和處理,然后返回給瀏覽器對(duì)應(yīng)的HTTP響應(yīng);瀏覽器再對(duì)HTTP響應(yīng)進(jìn)行解析,從而將網(wǎng)頁(yè)呈現(xiàn)了出來。下面以使用GoogleChrome瀏覽器打開百度的搜索頁(yè)面為例來展示HTTP請(qǐng)求和響應(yīng)的過程。HTTP基本原理2.1HTTP基本原理打開GoogleChrome瀏覽器,右擊頁(yè)面空白處,在彈出的快捷菜單中選擇“檢查”選項(xiàng),打開瀏覽器的開發(fā)者工具窗口,然后選擇“Network”選項(xiàng)。訪問/,即可在開發(fā)者工具窗口中顯示請(qǐng)求記錄(見圖2-1),其中每一條記錄都代表一次發(fā)送請(qǐng)求和接收響應(yīng)的過程。2.1HTTP基本原理圖2-1GoogleChrome瀏覽器顯示HTTP請(qǐng)求記錄2.1HTTP基本原理圖2-2HTTP請(qǐng)求和響應(yīng)的詳細(xì)信息在記錄列表中,選擇“”選項(xiàng),然后在其右側(cè)打開的界面中選擇“Headers”選項(xiàng),即可顯示HTTP請(qǐng)求和響應(yīng)的詳細(xì)信息,如圖2-2所示。2.1HTTP基本原理2.1.1HTTP請(qǐng)求請(qǐng)求的網(wǎng)址(RequestURL)請(qǐng)求方法(RequestMethod)請(qǐng)求頭(RequestHeaders)請(qǐng)求體(RequestBody)2.1HTTP基本原理表2-2Content-Type和POST提交數(shù)據(jù)方式的關(guān)系1.請(qǐng)求的網(wǎng)址請(qǐng)求的網(wǎng)址即URL,它可以唯一確定請(qǐng)求的資源。圖2-2中的“RequestURL”部分即為請(qǐng)求的網(wǎng)址(/)。Content-Type提交數(shù)據(jù)的方式application/x-www-form-urlencoded表單數(shù)據(jù)multipart/form-data表單文件application/json序列化JSON數(shù)據(jù)text/xmlXML數(shù)據(jù)2.1HTTP基本原理常見的請(qǐng)求方法有兩種:GET方法和POST方法。(1)GET方法,請(qǐng)求指定的網(wǎng)頁(yè)信息,并返回網(wǎng)頁(yè)內(nèi)容,提交的數(shù)據(jù)最多只有1024字節(jié)。(2)POST方法,向指定資源提交數(shù)據(jù)并進(jìn)行請(qǐng)求處理(如提交表單或上傳文件)。數(shù)據(jù)都包含在請(qǐng)求體中,提交的數(shù)據(jù)沒有字節(jié)限制。2.請(qǐng)求方法2.1HTTP基本原理圖2-2中的“RequestMethod”部分即為請(qǐng)求方法(GET方法)??梢钥闯觯綍r(shí)打開網(wǎng)站一般使用的是GET方法,也就是請(qǐng)求頁(yè)面;如果是向網(wǎng)站提交數(shù)據(jù)(如登錄網(wǎng)站),就用到了POST方法。還有一些其他的請(qǐng)求方法,如HEAD、PUT、DELETE、CONNECT、OPTIONS和TRACE等,在實(shí)際編寫爬蟲程序時(shí)很少用到,此處不再介紹。2.1HTTP基本原理請(qǐng)求頭是請(qǐng)求的重要組成部分,在編寫爬蟲程序時(shí),大部分情況下都需要設(shè)定請(qǐng)求頭。不同請(qǐng)求的請(qǐng)求頭包含的內(nèi)容不同,應(yīng)用時(shí)應(yīng)根據(jù)實(shí)際需求設(shè)定。圖2-2中的“RequestHeaders”部分即為請(qǐng)求頭。常見的請(qǐng)求頭及其說明如表2-1所示。3.請(qǐng)求頭表5-2-4pstree命令中常用選項(xiàng)的含義請(qǐng)求頭說明Accept指定客戶端可識(shí)別的內(nèi)容類型Accpet-Encoding指定客戶端可識(shí)別的內(nèi)容編碼Accept-Language指定客戶端可識(shí)別的語(yǔ)言類型Cookie網(wǎng)站為了辨別用戶身份進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地的數(shù)據(jù),主要功能是維持當(dāng)前訪問會(huì)話Host指定請(qǐng)求的服務(wù)器的域名和端口號(hào)User-Agent使服務(wù)器識(shí)別客戶端使用的操作系統(tǒng)及版本、瀏覽器及版本等信息,實(shí)現(xiàn)爬蟲時(shí)加上此信息,可以偽裝為瀏覽器Content-Type請(qǐng)求的媒體類型信息Content-Length請(qǐng)求的內(nèi)容長(zhǎng)度Referer包含一個(gè)URL,用戶以該URL代表的頁(yè)面出發(fā)訪問當(dāng)前請(qǐng)求頁(yè)面2.1HTTP基本原理表2-1常見的請(qǐng)求頭及其說明2.1HTTP基本原理其中,“Content-Type”確定了POST請(qǐng)求提交數(shù)據(jù)的方式,如表2-2所示。Content-Type提交數(shù)據(jù)的方式application/x-www-form-urlencoded表單數(shù)據(jù)multipart/form-data表單文件application/json序列化JSON數(shù)據(jù)text/xmlXML數(shù)據(jù)表2-2Content-Type和POST提交數(shù)據(jù)方式的關(guān)系2.1HTTP基本原理請(qǐng)求體中的內(nèi)容一般是POST請(qǐng)求中的表單數(shù)據(jù),而GET請(qǐng)求的請(qǐng)求體為空。例如,使用賬戶登錄百度網(wǎng)站可看到POST請(qǐng)求中的請(qǐng)求體(“FormData”部分),如圖2-3所示。4.請(qǐng)求體圖2-3POST請(qǐng)求中的請(qǐng)求體2.1HTTP基本原理2.1.2HTTP響應(yīng)HTTP響應(yīng)可以分為三部分內(nèi)容:響應(yīng)狀態(tài)碼(ResponseStatusCode)響應(yīng)頭(ResponseHeaders)響應(yīng)體(ResponseBody)2.1HTTP基本原理狀態(tài)碼英文名稱說明100Continue服務(wù)器已收到請(qǐng)求的一部分,正在等待其余部分,應(yīng)繼續(xù)提出請(qǐng)求200OK服務(wù)器已成功處理了請(qǐng)求302MoveTemporarily服務(wù)器要求客戶端重新發(fā)送一個(gè)請(qǐng)求304NotModified此請(qǐng)求返回的網(wǎng)頁(yè)未修改,繼續(xù)使用上次的資源404NotFound服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)500InternalServerError服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求表2-3常見的響應(yīng)狀態(tài)碼1.響應(yīng)狀態(tài)碼響應(yīng)狀態(tài)碼表示服務(wù)器的響應(yīng)狀態(tài),常見的響應(yīng)狀態(tài)碼如表2-3所示。2.1HTTP基本原理圖2-2HTTP請(qǐng)求和響應(yīng)的詳細(xì)信息圖2-2中的“StatusCode”部分即為響應(yīng)狀態(tài)碼(200OK)。在爬取網(wǎng)頁(yè)時(shí),爬蟲程序可以根據(jù)狀態(tài)碼判斷服務(wù)器的響應(yīng)狀態(tài),如果狀態(tài)碼為200,則表明返回?cái)?shù)據(jù)成功,可以進(jìn)行下一步的處理。2.1HTTP基本原理響應(yīng)頭說明Content-EncodingWeb服務(wù)器支持的編碼類型Content-Language響應(yīng)體的語(yǔ)言Content-Length響應(yīng)體的長(zhǎng)度Content-Type返回內(nèi)容的媒體類型Date原始服務(wù)器消息發(fā)出的時(shí)間表2-4常見的響應(yīng)頭及其說明2.響應(yīng)頭響應(yīng)頭包含了服務(wù)器對(duì)請(qǐng)求的應(yīng)答信息,圖2-2中的“ResponseHeaders”部分即為響應(yīng)頭。常見的響應(yīng)頭及其說明如表2-4所示。響應(yīng)頭說明Expires響應(yīng)過期的日期和時(shí)間Last-Modified請(qǐng)求資源的最后修改時(shí)間Set-Cookie設(shè)置HTTPCookieLocation重定向接收到請(qǐng)求的URL位置2.1HTTP基本原理圖2-4響應(yīng)體3.響應(yīng)體響應(yīng)體包含響應(yīng)的正文數(shù)據(jù)。例如,請(qǐng)求網(wǎng)頁(yè)時(shí),響應(yīng)體是網(wǎng)頁(yè)的網(wǎng)頁(yè)源代碼;請(qǐng)求圖片時(shí),響應(yīng)體是圖片的二進(jìn)制數(shù)據(jù)。在圖2-2中選擇“Response”選項(xiàng),可顯示響應(yīng)體,如圖2-4所示。.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.2urllib庫(kù)2.2urllib庫(kù)2.2.1案例引入——爬取有道在線翻譯網(wǎng)站的數(shù)據(jù)【例2-1】爬取有道在線翻譯網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。【問題分析】
首先構(gòu)造HTTP請(qǐng)求,然后將HTTP響應(yīng)的各部分進(jìn)行輸出。2.2urllib庫(kù)【參考代碼】
importurllib.request #導(dǎo)入request模塊url='/' #定義url字符串#構(gòu)造HTTP請(qǐng)求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(url)print('響應(yīng)類型:',type(response)) #輸出響應(yīng)類型print('響應(yīng)狀態(tài)碼:',response.getcode()) #輸出響應(yīng)狀態(tài)碼#輸出編碼方式print('編碼方式:',response.getheader('Content-Type'))print('請(qǐng)求的URL:',response.geturl()) #輸出請(qǐng)求的URLresp=response.read().decode('utf-8') #讀取網(wǎng)頁(yè)內(nèi)容并解碼print('網(wǎng)頁(yè)內(nèi)容:\n',resp #輸出網(wǎng)頁(yè)內(nèi)容2.2urllib庫(kù)直接用urllib.request模塊的urlopen()函數(shù)獲取網(wǎng)頁(yè),返回的網(wǎng)頁(yè)內(nèi)容數(shù)據(jù)格式為bytes類型,需要利用decode()函數(shù)解碼,轉(zhuǎn)換成str類型。2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-5所示。圖2-5例2-1程序的運(yùn)行結(jié)果2.2urllib庫(kù)2.2.2urllib庫(kù)簡(jiǎn)介urllib庫(kù)是Python內(nèi)置的標(biāo)準(zhǔn)庫(kù),不需要額外安裝即可使用,它包含如下四個(gè)模塊。(1)request:模擬發(fā)送HTTP請(qǐng)求。(2)error:處理HTTP請(qǐng)求錯(cuò)誤時(shí)的異常。(3)parse:解析、拆分和合并URL。(4)robotparser:解析網(wǎng)站的robots.txt文件。2.2urllib庫(kù)2.2.3發(fā)送請(qǐng)求request模塊提供了基本的構(gòu)造HTTP請(qǐng)求的方法,同時(shí)它還可以處理授權(quán)驗(yàn)證(authentication)、重定向(redirection)、Cookie會(huì)話及其他內(nèi)容。本小節(jié)主要介紹通過urlopen()函數(shù)和Request()函數(shù)構(gòu)造HTTP請(qǐng)求的方法。2.2urllib庫(kù)2.2.3發(fā)送請(qǐng)求1.urlopen()函數(shù)urlopen()函數(shù)可以構(gòu)造基本的HTTP請(qǐng)求,其函數(shù)原型如下:urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)2.2urllib庫(kù)(1)url:請(qǐng)求的URL??梢允且粋€(gè)表示URL的字符串,也可以是一個(gè)Request類型的對(duì)象。這是必傳參數(shù),其他都是可選參數(shù)。(2)data:請(qǐng)求體信息(如在線翻譯,在線答題等提交的內(nèi)容)。data默認(rèn)值是None,表示以GET方式發(fā)送請(qǐng)求;當(dāng)用戶給出data參數(shù)時(shí),表示以POST方式發(fā)送請(qǐng)求。(3)timeout:設(shè)置網(wǎng)站的訪問超時(shí)時(shí)間,單位為秒。如果請(qǐng)求超出了設(shè)置的時(shí)間而沒有得到響應(yīng),就會(huì)拋出異常。如果不指定該參數(shù),就會(huì)使用全局默認(rèn)時(shí)間。(4)cafile、capath、cadefault:用于實(shí)現(xiàn)可信任CA證書的HTTP請(qǐng)求,基本很少使用。(5)context:實(shí)現(xiàn)SSL加密傳輸,基本很少使用。2.2urllib庫(kù)Request類型的對(duì)象是調(diào)用urllib.request.Request()函數(shù)返回的對(duì)象,見本小節(jié)的Request()函數(shù)部分。urlopen()函數(shù)的data參數(shù)必須是bytes(字節(jié)流)類型,如果是字典類型,可以先用urllib.parse模塊的urlencode()函數(shù)編碼,見2.2.5小節(jié)。2.2urllib庫(kù)調(diào)用函數(shù)后,返回一個(gè)HTTPResponse類型的對(duì)象,該對(duì)象提供的方法和屬性如表2-5所示。方法和屬性說明getcode()/status獲取響應(yīng)狀態(tài)碼get_url()獲取請(qǐng)求的URLgetheaders()獲取響應(yīng)頭信息,返回二元組列表getheader(name)獲取特定響應(yīng)頭信息info()獲取響應(yīng)頭信息,返回字符串read()/readline()讀取響應(yīng)體表2-5HTTPResponse類型對(duì)象提供的方法和屬性2.2urllib庫(kù)urlopen()函數(shù)既可以實(shí)現(xiàn)GET請(qǐng)求(見例2-1),又可以通過設(shè)置data參數(shù)實(shí)現(xiàn)POST請(qǐng)求。【例2-2】爬取有道在線翻譯網(wǎng)站,實(shí)現(xiàn)翻譯的過程,輸出爬取到的信息?!締栴}分析】首先,在GoogleChrome瀏覽器中訪問/;然后,打開瀏覽器的開發(fā)者工具窗口,選擇“Network”選項(xiàng);接著,在翻譯頁(yè)面中輸入需要翻譯的內(nèi)容,如“蘋果”,單擊“翻譯”按鈕;最后,在開發(fā)者工具窗口的請(qǐng)求記錄中選擇“translate_o?smartresult=dict&smartresult=rule”選項(xiàng),即可查看HTTP請(qǐng)求的URL和請(qǐng)求體(即為url和data參數(shù)),如圖2-6所示。2.2urllib庫(kù)圖2-6有道在線翻譯的POST請(qǐng)求信息2.2urllib庫(kù)【參考代碼】
importurllib.request #導(dǎo)入request模塊url='/translate?smartresult=dict&'\'smartresult=rule' #定義url字符串datavalue={'i':'蘋果','from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':'15924715113269','sign':'5c3a992ac57ed879b7678ff05bb3ec44','ts':'1592471511326',2.2urllib庫(kù)'bv':'c74c03c52496795b65595fdc27140f0f','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTlME'} #定義datavalue參數(shù)#編碼datavalue參數(shù)datavalue=urllib.parse.urlencode(datavalue).encode('utf-8')#構(gòu)造HTTP請(qǐng)求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(url,data=datavalue)resp=response.read().decode('utf-8') #讀取網(wǎng)頁(yè)內(nèi)容并解碼print(resp) #輸出網(wǎng)頁(yè)內(nèi)容2.2urllib庫(kù)有道在線翻譯網(wǎng)站存在反爬蟲機(jī)制,在編寫爬蟲程序時(shí)需要將url中的“_o”去掉。2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-7所示。返回的響應(yīng)體中包含了翻譯的內(nèi)容和結(jié)果,如果想要修改翻譯的內(nèi)容,只需要修改data參數(shù)中“i”的值。圖2-7例2-2程序的運(yùn)行結(jié)果2.2urllib庫(kù)2.Request()函數(shù)當(dāng)HTTP請(qǐng)求信息較復(fù)雜時(shí),可用Request()函數(shù)進(jìn)行設(shè)置,其函數(shù)原型如下:Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)2.2urllib庫(kù)(1)url:請(qǐng)求的URL。(2)data:請(qǐng)求體信息,其使用方法與urlopen()函數(shù)中的data參數(shù)相同。(3)headers:請(qǐng)求頭信息,如User_Agent、Cookie和Host等,是字典類型。(4)origin_req_host:客戶端的host名稱或者IP地址。(5)unverifiable:表示這個(gè)請(qǐng)求是無法驗(yàn)證的,在默認(rèn)情況下設(shè)置為False。(6)method:請(qǐng)求方法,如GET、POST等,是字符串類型。調(diào)用函數(shù)后,返回一個(gè)Request類型的對(duì)象,然后再通過urlopen()函數(shù)構(gòu)造完整的HTTP請(qǐng)求。當(dāng)服務(wù)器有反爬蟲機(jī)制時(shí),可通過設(shè)置headers參數(shù)偽裝成瀏覽器去訪問網(wǎng)站。2.2urllib庫(kù)【例2-2】
通過設(shè)置headers參數(shù)偽裝成瀏覽器爬取有道在線翻譯網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。importurllib.request #導(dǎo)入request模塊url='/' #定義url字符串#設(shè)置headersvalue參數(shù),偽裝成瀏覽器headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;''Win64;x64)AppleWebKit/537.36''(KHTML,likeGecko)Chrome/''83.0.4103.97Safari/537.36'}2.2urllib庫(kù)#創(chuàng)建Request對(duì)象,并將返回的結(jié)果賦值給requestrequest=urllib.request.Request(url,headers=headersvalue)#構(gòu)造HTTP請(qǐng)求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(request)resp=response.read().decode('utf-8') #讀取網(wǎng)頁(yè)內(nèi)容并解碼print(resp) #輸出網(wǎng)頁(yè)內(nèi)容2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-8所示。圖2-8例2-3程序的運(yùn)行結(jié)果2.2urllib庫(kù)2.2.4處理異常error模塊提供了request模塊產(chǎn)生的異常處理方法,它主要包含了URLError和HTTPError兩個(gè)類。(1)URLError類是error異常模塊的基類,可以捕獲request模塊產(chǎn)生的異常,它具有一個(gè)reason屬性(返回異常的原因)。(2)HTTPError類是URLError類的子類,專門處理HTTP請(qǐng)求的異常,它具有3個(gè)屬性,分別為reason(返回異常原因)、code(返回HTTP狀態(tài)碼)和headers(返回請(qǐng)求頭)。因?yàn)镠TTPError是URLError的子類,并不能處理父類支持的異常處理,所以一般對(duì)兩種異常分開捕獲,可先捕獲子類的異常,再捕獲父類的異常。2.2urllib庫(kù)【例2-3】
爬取不存在的網(wǎng)站內(nèi)容(如/api.htm),輸出異常原因?!締栴}分析】訪問一個(gè)不存在的網(wǎng)頁(yè)時(shí),會(huì)出現(xiàn)異?,F(xiàn)象,程序可以通過捕獲異常,輸出異常原因,從而避免程序因?yàn)楫惓=K止運(yùn)行。2.2urllib庫(kù)【參考代碼】
importurllib.request #導(dǎo)入request模塊importurllib.error #導(dǎo)入error模塊try: #處理異常#構(gòu)造HTTP請(qǐng)求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen('/api.htm')excepturllib.error.HTTPErrorase: #捕獲HTTP請(qǐng)求的異常#輸出HTTP請(qǐng)求的異常原因、狀態(tài)碼和請(qǐng)求頭print('異常原因:',e.reason)print('狀態(tài)碼:',e.code)print('請(qǐng)求頭:\n',e.headers)2.2urllib庫(kù)【參考代碼】
excepturllib.error.URLErrorase: #捕獲URL異常 print(e.reason) #輸出URL異常原因else: #如果沒有異常則輸出“RequestSuccessfully” print('RequestSuccessfully')2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-9所示。圖2-9例2-4程序的運(yùn)行結(jié)果2.2urllib庫(kù)2.2.5解析URLparse模塊提供了解析URL的方法,包括URL的拆分、合并和轉(zhuǎn)換,其方法如表2-6所示。功能函數(shù)說明拆分urlparse(urlstring)將URL拆分為六個(gè)部分,分別是scheme、netloc、path、params、query和fragmenturlsplit(urlstring)將URL拆分為五個(gè)部分,分別是scheme、netloc、path、query和fragment表2-6解析URL的方法2.2urllib庫(kù)功能函數(shù)說明合并urljoin(url1,url2)將基礎(chǔ)鏈接url1和新鏈接url2合并,分析url1的scheme、netloc、path內(nèi)容,并補(bǔ)充url2缺失的部分urlunparse(parts)將可迭代對(duì)象parts合并為URL,parts長(zhǎng)度為7urlunsplit(parts)將可迭代對(duì)象parts合并為URL,parts長(zhǎng)度為6轉(zhuǎn)換
urlencode(query)將字典形式的數(shù)據(jù)轉(zhuǎn)換為URL后面的查詢字符串parse_qs(qs)將URL后面的查詢字符串轉(zhuǎn)換為字典parse_qsl(qs)將URL后面的查詢字符串轉(zhuǎn)換為列表quote(str)將URL中的中文字符轉(zhuǎn)換為URL編碼unquote(str)將URL編碼轉(zhuǎn)換為中文字符,進(jìn)行解碼表2-6解析URL的方法(續(xù))2.2urllib庫(kù)【例2-5】解析“/?path=file&keyfrom=Nav-doc”,輸出返回結(jié)果。importurllib.parse #導(dǎo)入parse模塊#定義url字符串url='/?path=file&keyfrom=Nav-doc'print(urllib.parse.urlparse(url)) #拆分url并輸出結(jié)果#合并url并輸出結(jié)果print(urllib.parse.urljoin('/','?path=file&keyfrom=Nav-doc'))#定義params字符串params={'path':'file','keyfrom':'Nav-doc'}【參考代碼】
2.2urllib庫(kù)#編碼params參數(shù),合并url并輸出結(jié)果print('/?'+urllib.parse.urlencode(params))query='path=file&keyfrom=Nav-doc' #定義query字符串print(urllib.parse.parse_qs(query)) #將query字符串轉(zhuǎn)換成字典print(urllib.parse.parse_qsl(query)) #將query字符串轉(zhuǎn)換成列表keyword='網(wǎng)絡(luò)爬蟲' 定義keyword中文字符串#將中文字符轉(zhuǎn)換為URL編碼,合并后賦值給urlurl='/?wd='+urllib.parse.quote(keyword)print(url) #輸出URL編碼的url#將URL編碼轉(zhuǎn)換為中文字符并輸出結(jié)果print(urllib.parse.unquote(url))2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-10所示。圖2-10例2-5程序的運(yùn)行結(jié)果2.2urllib庫(kù)2.2.6分析Robots協(xié)議robotparser模塊提供了分析網(wǎng)站Robots協(xié)議的RobotFileParser類,它可以通過分析網(wǎng)站的robots.txt文件來判斷某網(wǎng)頁(yè)是否能被爬取。RobotFileParser類提供了多種方法,常用的方法如下。2.2urllib庫(kù)(1)set_url():設(shè)置robots.txt文件的URL。(2)read():讀取robots.txt文件并進(jìn)行分析。(3)can_fetch():第一個(gè)參數(shù)為User_Agent,第二個(gè)參數(shù)為要爬取網(wǎng)頁(yè)的URL,判斷該網(wǎng)頁(yè)是否能被爬取。(4)parse():解析robots.txt文件中某些行的內(nèi)容。(5)mtime():返回上次抓取和分析robots.txt文件的時(shí)間。(6)modified():將當(dāng)前時(shí)間設(shè)置為上次抓取和分析robots.txt文件的時(shí)間。2.2urllib庫(kù)【例2-3】解析有道在線翻譯的robots.txt文件(網(wǎng)址/robots.txt),判斷百度爬蟲是否可以爬取有道網(wǎng)頁(yè)翻譯(/web2/index.html)和有道人工翻譯網(wǎng)頁(yè)(/?path=fast&keyfrom=Nav-fast),輸出判斷結(jié)果?!締栴}分析】首先創(chuàng)建RobotFileParser類對(duì)象,然后通過set_url()方法設(shè)置robots.txt文件的URL,接著利用read()方法讀取robots.txt文件并進(jìn)行分析,最后利用can_fetch()方法判斷網(wǎng)頁(yè)是否可以爬取,返回結(jié)果(True或False)。2.2urllib庫(kù)importurllib.robotparser #導(dǎo)入robotparser模塊#創(chuàng)建RobotFileParser類對(duì)象rprp=urllib.robotparser.RobotFileParser()#設(shè)置robots.txt文件的URLrp.set_url('/robots.txt')rp.read() #讀取robots.txt文件并進(jìn)行分析user_agent='Baiduspider' #定義爬蟲名稱#定義有道網(wǎng)頁(yè)翻譯的urlurl='/web2/index.html'【參考代碼】
2.2urllib庫(kù)#判斷是否可以爬取有道網(wǎng)頁(yè)翻譯并輸出判斷結(jié)果print(rp.can_fetch(user_agent,url))#定義有道人工翻譯網(wǎng)頁(yè)的urlurl='/?path=fast&keyfrom=Nav-fast'#判斷是否可以爬取有道人工翻譯網(wǎng)頁(yè)并輸出判斷結(jié)果print(rp.can_fetch(user_agent,url))2.2urllib庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-11所示。圖2-11例2-6程序的運(yùn)行結(jié)果.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.3requests庫(kù)2.3requests庫(kù)2.3.1案例引入——爬取豆瓣網(wǎng)站的數(shù)據(jù)【例2-7】爬取豆瓣網(wǎng)的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。【問題分析】使用get()函數(shù)發(fā)送HTTP請(qǐng)求,然后將HTTP響應(yīng)的各部分進(jìn)行輸出。2.3requests庫(kù)importrequests #導(dǎo)入requests模塊#發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rr=requests.get('/')print('響應(yīng)類型:',type(r)) #輸出響應(yīng)類型print('請(qǐng)求的URL:',r.url) #輸出請(qǐng)求的URLprint('響應(yīng)狀態(tài)碼:',r.status_code) #輸出響應(yīng)狀態(tài)碼print('請(qǐng)求頭:',r.request.headers) #輸出請(qǐng)求頭【參考代碼】
2.3requests庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-12所示。圖2-12例2-7程序的運(yùn)行結(jié)果2.3requests庫(kù)2.3.2安裝requests庫(kù)上一小節(jié)學(xué)習(xí)了urllib庫(kù)的基本用法,使用起來比較煩瑣,而requests庫(kù)是對(duì)urllib庫(kù)的進(jìn)一步封裝,使用更加便捷。requests庫(kù)可以實(shí)現(xiàn)很多功能,包括URL獲取、HTTP長(zhǎng)連接和連接緩存、HTTP會(huì)話、瀏覽器式的SSL驗(yàn)證、身份認(rèn)證、Cookie會(huì)話、文件分塊上傳、流下載、HTTP(S)代理功能、連接超時(shí)處理等。requests庫(kù)不是Python內(nèi)置的標(biāo)準(zhǔn)庫(kù),使用之前需要安裝。安裝步驟如下。安裝requests庫(kù)2.3requests庫(kù)步驟一:?jiǎn)?dòng)PyCharm,在菜單欄中選擇“File”→“Settings”選項(xiàng),如圖2-13所示。圖2-13設(shè)置項(xiàng)目
2.3requests庫(kù)步驟二:
打開“Settings”對(duì)話框,選擇“Project:conda_Test”→“ProjectInterpreter”選項(xiàng),然后在顯示的列表框的右側(cè)單擊“+”按鈕,如圖2-14所示。圖2-14選擇安裝項(xiàng)目2.3requests庫(kù)步驟三:打開“AvailablePackages”對(duì)話框,在搜索欄中輸入“requests”,然后在顯示的列表中選擇“requests”選項(xiàng),單擊“InstallPackage”按鈕,如圖2-15所示。圖2-15選擇安裝庫(kù)2.3requests庫(kù)步驟四:等待安裝,安裝成功后,對(duì)話框中將顯示“Package'requests'installedsuccessfully”(見圖2-16),關(guān)閉“AvailablePackages”對(duì)話框,單擊“Settings”對(duì)話框的“OK”按鈕完成安裝。圖2-16顯示安裝成功提示2.3requests庫(kù)如果需要卸載庫(kù),可在“Settings”對(duì)話框的已安裝庫(kù)列表中選擇該庫(kù),然后單擊右側(cè)的“-”按鈕進(jìn)行卸載。2.3requests庫(kù)2.3.3請(qǐng)求方法requests庫(kù)提供了幾乎所有的HTTP請(qǐng)求方法,其中最常用的是GET方法和POST方法。請(qǐng)求方法2.3requests庫(kù)1.GET方法urlopen()函數(shù)可以構(gòu)造基本的HTTP請(qǐng)求,其函數(shù)原型如下:(1)url:請(qǐng)求的URL。這是必傳參數(shù),其他都是可選參數(shù)。(2)params:字典或字節(jié)序列,作為參數(shù)增加到url中。(3)**kwargs:控制訪問的參數(shù),如headers、cookies、timeout和proxies等。調(diào)用函數(shù)后,返回一個(gè)Response類型的對(duì)象,該對(duì)象提供的屬性和方法如表2-7所示。get(url,params=None,**kwargs)2.3requests庫(kù)具體例子參見例2-7。屬性/方法說明status_code獲取響應(yīng)狀態(tài)碼headers獲取響應(yīng)頭request.headers獲取請(qǐng)求頭url獲取請(qǐng)求的URLencoding獲取從HTTPheaders中猜測(cè)的響應(yīng)內(nèi)容編碼方式apparent_encoding獲取從響應(yīng)內(nèi)容分析出的編碼方式content獲取二進(jìn)制類型的響應(yīng)內(nèi)容,會(huì)自動(dòng)解碼gzip和deflate編碼的響應(yīng)內(nèi)容text獲取文本類型的響應(yīng)內(nèi)容json()返回JSON類型數(shù)據(jù)raise_for_status()若是status_code不是200,則會(huì)拋出異常表2-7Response類型對(duì)象提供的屬性和方法2.3requests庫(kù)2.POST方法POST方法通過post()函數(shù)實(shí)現(xiàn),其函數(shù)原型如下:(1)url:請(qǐng)求的URL。這是必傳參數(shù),其他都是可選參數(shù)。(2)data:字典、字節(jié)序列或文件對(duì)象,作為請(qǐng)求體的內(nèi)容。(3)json:JSON格式的數(shù)據(jù),作為請(qǐng)求體的內(nèi)容。(4)**kwargs:控制訪問的參數(shù),如params、headers、cookies、timeout和proxies等。post()函數(shù)同樣返回一個(gè)Response類型的對(duì)象。post(url,data=None,json=None,**kwargs)2.3requests庫(kù)【例2-8】模擬登錄豆瓣網(wǎng)站,輸出響應(yīng)對(duì)象的信息?!締栴}分析】首先,在GoogleChrome瀏覽器中訪問/,打開豆瓣網(wǎng)的登錄界面;然后,打開瀏覽器的開發(fā)者工具窗口,選擇“Network”選項(xiàng);接著,在豆瓣網(wǎng)的登錄界面輸入用戶名和密碼,登錄豆瓣網(wǎng);最后,在開發(fā)者工具窗口的請(qǐng)求記錄中選擇“basic”選項(xiàng),即可顯示HTTP請(qǐng)求的URL和請(qǐng)求體(即為url和data參數(shù)),如圖2-17所示。2.3requests庫(kù)圖2-17登錄豆瓣網(wǎng)的POST請(qǐng)求信息2.3requests庫(kù)FormData部分為提交的表單數(shù)據(jù),其中,name為賬戶名,password為密碼,remember為是否記住密碼,false表示不記住密碼。2.3requests庫(kù)importrequests #導(dǎo)入requests模塊datavalue={'name':'11111','password':'222222','remember':'false'} #定義datavalue參數(shù)#定義url字符串url='/j/mobile/login/basic'#發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rr=requests.post(url,data=datavalue)【參考代碼】
2.3requests庫(kù)print(type(r)) #輸出返回對(duì)象類型print(r.url) #輸出請(qǐng)求的URLprint(r.status_code)
#輸出返回狀態(tài)碼print(r.request.headers)
#輸出請(qǐng)求頭2.3requests庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-18所示。圖2-18例2-8程序的運(yùn)行結(jié)果2.3requests庫(kù)requests庫(kù)實(shí)現(xiàn)HTTP其他基本請(qǐng)求的方法如下:requests.put('/') #PUT請(qǐng)求requests.delete('/') #DELETE請(qǐng)求requests.head('/') #HEAD請(qǐng)求requests.options('/') #OPTIONS請(qǐng)求2.3requests庫(kù)2.3.4傳遞URL參數(shù)有時(shí)網(wǎng)站會(huì)通過URL來傳遞查詢參數(shù),這時(shí)可使用get()函數(shù)或post()函數(shù)的params參數(shù)進(jìn)行設(shè)置。傳遞URL參數(shù)2.3requests庫(kù)【例2-9】在豆瓣網(wǎng)中查詢與Python相關(guān)的內(nèi)容,輸出url值。【問題分析】
首先以字典形式定義params參數(shù),然后將其傳遞到“/search”中,最后獲取url(/search?q=Python)。importrequests #導(dǎo)入requests模塊paramsvalue={'q':'Python'} #定義字典形式的paramsvalue參數(shù)值#將paramsvalue作為參數(shù)增加到url中并發(fā)送請(qǐng)求,將返回結(jié)果賦值給rr=requests.get('/search',params=paramsvalue)print(r.url) #輸出url2.3requests庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-19所示。圖2-19例2-9程序的運(yùn)行結(jié)果2.3requests庫(kù)2.3.5定制請(qǐng)求頭在requests庫(kù)中,get()或post()函數(shù)可以直接傳遞字典形式的User_Agent信息給headers參數(shù)實(shí)現(xiàn)定制請(qǐng)求頭。定制請(qǐng)求頭【例2-9】
通過定制請(qǐng)求頭爬取豆瓣網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。2.3requests庫(kù)mportrequests #導(dǎo)入requests模塊url='/' #定義url字符串headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36'} #設(shè)置請(qǐng)求頭的User-Agent信息#不設(shè)置headers,發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rr=requests.get(url)【參考代碼】
2.3requests庫(kù)print(r.status_code) #輸出返回狀態(tài)print(r.request.headers) #輸出請(qǐng)求頭#設(shè)置headers,發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rr=requests.get(url,headers=headersvalue)print(r.status_code) #輸出返回狀態(tài)print(r.request.headers) #輸出請(qǐng)求頭2.3requests庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-20所示。圖2-20例2-10程序的運(yùn)行結(jié)果2.3requests庫(kù)從圖2-20可以看出,例2-10第一次發(fā)送HTTP請(qǐng)求時(shí),請(qǐng)求頭中的User_Agent信息為Python的requests庫(kù)的版本信息,表示爬蟲程序發(fā)送該請(qǐng)求,且返回狀態(tài)碼是418,表示禁止爬蟲程序爬取該網(wǎng)站;而第二次設(shè)置為瀏覽器信息,返回狀態(tài)碼為200,表示偽裝成瀏覽器后成功爬取網(wǎng)站。所以,設(shè)置請(qǐng)求頭參數(shù)是應(yīng)對(duì)反爬蟲機(jī)制的一種有效方法。2.3requests庫(kù)2.3.6設(shè)置Cookie例2-8中利用post()函數(shù)登錄了豆瓣網(wǎng)頁(yè),但是如果想要爬取豆瓣網(wǎng)站登錄后的內(nèi)容,還需要用到get()函數(shù)去請(qǐng)求頁(yè)面,這時(shí)候可直接利用Cookie來維持登錄狀態(tài)。設(shè)置Cookie2.3requests庫(kù)Cookie可以幫助用戶記錄訪問Web頁(yè)面時(shí)的個(gè)人信息,并保存在客戶端,當(dāng)用戶再次訪問同一Web頁(yè)面時(shí),Cookie可以提供上次用戶訪問信息。2.3requests庫(kù)【例2-11】
通過設(shè)置Cookie爬取用戶登錄狀態(tài)下豆瓣網(wǎng)站內(nèi)容(網(wǎng)址/),輸出爬取到的信息?!締栴}分析】
登錄豆瓣網(wǎng),在GoogleChrome瀏覽器的開發(fā)者工具窗口中復(fù)制“RequestHeaders”中“Cookie”信息(見圖2-21),將其設(shè)置到程序的headers參數(shù)中。2.3requests庫(kù)圖2-21用戶狀態(tài)下豆瓣網(wǎng)的“Cookie”信息2.3requests庫(kù)importrequests #導(dǎo)入requests模塊headersvalue={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36','Cookie':'ll="108288";bid=FU35Y0eS-KI;_vwo_uuid_v2=D18B3319C1E99BBB6569C2519D7E87F51|5e9046ac929cff3665e02f4d7f9f68d7;__yadk_uid=5fkfyCBRiZhR06ApyA4T6nfI7PZTE6nG;push_doumail_num=0;push_noty_num=0;__utmv=30149280.21804;gr_user_id=f6e3b102-811c-4a00-afc4-bbb5ee299526;viewed="35006240_34972174_34852472_30364330";douban-profile-remind=1;__gads=ID=26116add0658c95e-2222028b20c2008e:T=1592359146:RT=1592【參考代碼】
2.3requests庫(kù)359146:S=ALNI_MYKBe2T1D1KdY6ogX7t81hsybGcgw;douban-fav-remind=1;_pk_ses.100001.8cb4=*;_pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1593565363%2C%22https%3A%2F%2F%2Flink%3Furl%3DvSVBM9Y7T-Yy8vzFQq0LV5nGpKP5d6I3U243CpQX4pxJZH5ID5_PB9Wk-M164506%26wd%3D%26eqid%3Db5820ad1001638f7000000025efbe0b0%22%5D;__utma=30149280.1310555483.1590215237.1592894955.1593565364.25;__utmc=30149280;__utmz=30149280.1593565364.25.21.utmcsr=baidu|utmccn=(organic)|utmcmd=organic;__utmt=1;dbcl2="218046940:FNvUarDCBJw";ck=zTcB;_pk_id.100001.8cb4=02776c1057c8040d.1590215236.23.1593565372.1592894954.;ap_v=0,6.0;__utmb=301492593565364' 2.3requests庫(kù)} #定義headers的User-Agent和Cookie信息#設(shè)置headers,發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rr=requests.get('/',headers=headersvalue)print(r.text) #輸出文本類型的返回內(nèi)容2.3requests庫(kù)Cookie還可以通過get()函數(shù)或post()函數(shù)的cookies參數(shù)進(jìn)行設(shè)置。2.3requests庫(kù)【運(yùn)行結(jié)果】
返回的網(wǎng)頁(yè)內(nèi)容中包含了登錄后的個(gè)人信息,表明登錄成功,程序的運(yùn)行結(jié)果如圖2-22所示。圖2-22例2-11程序的運(yùn)行結(jié)果2.3requests庫(kù)2.3.7設(shè)置超時(shí)在爬取網(wǎng)頁(yè)的過程中,有時(shí)服務(wù)器沒有響應(yīng),程序可能會(huì)一直等待響應(yīng),requests庫(kù)可以在get()或post()函數(shù)中設(shè)置timeout參數(shù)來解決這個(gè)問題。程序在等待設(shè)置的秒數(shù)后會(huì)停止等待,拋出Timeout異常?!纠?-12】爬取豆瓣網(wǎng)站的內(nèi)容(網(wǎng)址/),并設(shè)置超時(shí)時(shí)間為0.001秒,輸出響應(yīng)狀態(tài)碼。2.3requests庫(kù)importrequests #導(dǎo)入requests#模塊#異常處理try: #設(shè)置timeout參數(shù),發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給r r=requests.get('/',timeout=0.001)exceptrequests.Timeout: #捕獲Timeout異常 print('Timeout!') #輸出“Timeout!”else: print(r.status_code) #輸出響應(yīng)狀態(tài)碼【參考代碼】
2.3requests庫(kù)【運(yùn)行結(jié)果】
程序的運(yùn)行結(jié)果如圖2-23所示。圖2-23例2-12程序的運(yùn)行結(jié)果2.3requests庫(kù)使用requests庫(kù)發(fā)出HTTP請(qǐng)求時(shí)可能會(huì)發(fā)生異常,如錯(cuò)誤異常(requests.HTTPError)、URL缺失異常(requests.URLRequired)和請(qǐng)求URL超時(shí)異常(requests.Timeout)等。Response類型的對(duì)象還提供了raise_for_status()方法來捕獲訪問網(wǎng)頁(yè)后的HTTP響應(yīng)狀態(tài)碼不是200時(shí)產(chǎn)生的requests.HTTPError。2.3requests庫(kù)2.3.8獲取二進(jìn)制文件圖片、音頻、視頻等文件本質(zhì)上是由二進(jìn)制碼組成的,有特定的保存格式和對(duì)應(yīng)的解碼方式,想要爬取這些文件,需要獲取它們的二進(jìn)制數(shù)據(jù)?!纠?-13】爬取豆瓣讀書網(wǎng)站上《在路上》圖書的封面圖片(地址/view/subject/s/public/s33643895.jpg),輸出爬取到的內(nèi)容,并將內(nèi)容保存為jpg文件。2.3requests庫(kù)importrequests #導(dǎo)入requests模塊r=requests.get('/view/subject/s/public/s33643895.jpg') #發(fā)送HTTP請(qǐng)求,并將返回結(jié)果賦值給rprint(r.content) #輸出二進(jìn)制類型返回內(nèi)容print(r.text) #輸出文本類型返回內(nèi)容#保存二進(jìn)制類型返回內(nèi)容為jpg文件withopen('fengmian.jpg','wb')asf:f.write(r.content)【參考代碼】
2.3requests庫(kù)【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-24所示。圖2-24例2-13程序的運(yùn)行結(jié)果2.3requests庫(kù)從圖2-24中可以看出,“content”輸出的結(jié)果前帶有一個(gè)“b”,表示數(shù)據(jù)是bytes類型;而“text”輸出的結(jié)果是亂碼,這是因?yàn)閳D片是二進(jìn)制數(shù)據(jù),不能直接將其轉(zhuǎn)化為字符串。代碼最后將圖片以二進(jìn)制形式保存了下來,程序運(yùn)行結(jié)束后,文件夾中將出現(xiàn)名為“fengmian.jpg”的圖片文件,打開的圖片如圖2-25所示。圖2-25《在路上》封面
2.3requests庫(kù)如果豆瓣讀書網(wǎng)站上沒有《在路上》此書,可以按照此方法爬取另外的圖片。.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.4字符編碼2.4字符編碼2.4.1Python的字符編碼在Python3中,字符串使用str或bytes類型。str類型默認(rèn)為Unicode編碼格式,該編碼格式不適合用來傳輸和存儲(chǔ),所以需要將str類型進(jìn)行編碼,轉(zhuǎn)換成bytes類型(如UTF-8、GBK等格式)。在做編碼轉(zhuǎn)換時(shí),通常需要以Unicode作為中間編碼,即先將其他編碼的字符串解碼(decode()方法)成Unicode,再?gòu)腢nicode編碼(encode()方法)成另一種編碼。如果要查看具體的編碼類型,可以使用chardet模塊中的detect()方法。【例2-14】使用encode()方法和decode()方法實(shí)現(xiàn)Unicode和UTF-8之間的編碼和解碼,輸出數(shù)據(jù)類型、編碼和解碼結(jié)果。2.4字符編碼importchardet #導(dǎo)入chardet模塊str2byte='網(wǎng)絡(luò)爬蟲'.encode('utf-8') #UTF-8編碼print(str2byte) #輸出編碼字符串print(type(str2byte)) #輸出編碼字符串類型print(chardet.detect(str2byte)) #檢測(cè)編碼類型byte2str=str2byte.decode('utf-8') #解碼print(byte2str) #輸出解碼字符串print(type(byte2str)) #輸出解碼字符串類型【參考代碼】
2.4字符編碼【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-26所示。圖2-26例2-14程序的運(yùn)行結(jié)果Unicode不能通過decode()方法再次進(jìn)行解碼,已經(jīng)編碼的內(nèi)容也不能通過encode()方法再次進(jìn)行編碼。2.4字符編碼2.4.2解決亂碼問題在使用Python編寫爬蟲程序時(shí),大多數(shù)網(wǎng)頁(yè)的編碼方式都是UTF-8,requests會(huì)自動(dòng)對(duì)來自服務(wù)器的內(nèi)容進(jìn)行解碼。但是有一些網(wǎng)頁(yè)采用的是GBK等其他編碼方式,或者使用gzip進(jìn)行了壓縮,返回的內(nèi)容中包含的中文會(huì)出現(xiàn)亂碼的情況。因此,在解析網(wǎng)頁(yè)之前,需要檢查請(qǐng)求返回內(nèi)容的編碼方式,并進(jìn)行解碼,獲取正確的網(wǎng)頁(yè)內(nèi)容?!纠?-15】爬取新浪網(wǎng)首頁(yè)的內(nèi)容(網(wǎng)址/),輸出爬取的網(wǎng)頁(yè)內(nèi)容。2.4字符編碼importchardet #導(dǎo)入chardet模塊importrequests #導(dǎo)入requests模塊#發(fā)送請(qǐng)求,并將返回結(jié)果賦值給rr=requests.get('/')print(r.encoding) #輸出返
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店服務(wù)質(zhì)量監(jiān)督制度
- 財(cái)務(wù)風(fēng)險(xiǎn)管理與內(nèi)部控制制度
- 秦皇島教育培訓(xùn)機(jī)構(gòu)哪家好
- 活動(dòng)策劃培訓(xùn)課件
- 2026年信息安全保密手冊(cè)網(wǎng)絡(luò)安全專業(yè)人員考試題集
- 2026年審計(jì)理論與實(shí)務(wù)操作考試題庫(kù)及答案
- 2026年中醫(yī)藥膳與現(xiàn)代營(yíng)養(yǎng)學(xué)結(jié)合的實(shí)踐試題
- 2026年職場(chǎng)精英必修課商業(yè)戰(zhàn)略分析實(shí)踐試題集及答案
- 2026年AI金融智能投顧與風(fēng)險(xiǎn)管理測(cè)試題
- 2026年財(cái)經(jīng)法規(guī)與會(huì)計(jì)實(shí)務(wù)綜合練習(xí)題集
- 農(nóng)村承包土地合同范本
- 吉利汽車開發(fā)流程
- 《醫(yī)療機(jī)構(gòu)靜脈用細(xì)胞毒性藥物調(diào)配操作質(zhì)量管理工作規(guī)范》
- 五年級(jí)數(shù)學(xué)下冊(cè) 分層訓(xùn)練 2.1 因數(shù)和倍數(shù) 同步練習(xí) (含答案)(人教版)
- 護(hù)理部主任年終述職
- 電力行業(yè)安全生產(chǎn)操作規(guī)程
- 螺桿壓縮機(jī)PSSR檢查表
- GB/T 4937.34-2024半導(dǎo)體器件機(jī)械和氣候試驗(yàn)方法第34部分:功率循環(huán)
- TCALC 003-2023 手術(shù)室患者人文關(guān)懷管理規(guī)范
- 中藥熱奄包在呼吸系統(tǒng)疾病中的應(yīng)用研究
- HACCP計(jì)劃年度評(píng)審報(bào)告
評(píng)論
0/150
提交評(píng)論