Python 爬蟲基礎與實戰(zhàn) 課件 第2章 Python網(wǎng)頁下載技術(shù)_第1頁
Python 爬蟲基礎與實戰(zhàn) 課件 第2章 Python網(wǎng)頁下載技術(shù)_第2頁
Python 爬蟲基礎與實戰(zhàn) 課件 第2章 Python網(wǎng)頁下載技術(shù)_第3頁
Python 爬蟲基礎與實戰(zhàn) 課件 第2章 Python網(wǎng)頁下載技術(shù)_第4頁
Python 爬蟲基礎與實戰(zhàn) 課件 第2章 Python網(wǎng)頁下載技術(shù)_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章Python網(wǎng)頁下載技術(shù)

數(shù)1、http是超文本傳送協(xié)議,https是加密傳輸協(xié)議。瀏覽器默認使用HTTP協(xié)議。2、http請求是典型的請求-響應類型的的網(wǎng)絡協(xié)議:客戶端按照指定的格式開始向服務端發(fā)送HTTP請求;服務器讀取和分析請求信息,生成響應信息;最后返回一個HTTP的響應給客戶端2.1HTTP協(xié)議簡介1、格式:http://host[:post][abs_path]其中:(1)http:表示傳輸協(xié)議是http協(xié)議;(2)host:表示的是主機域名或IP地址;(3)port:指端口號;(4)abs_path:指要請求的資源的路徑。2.1.1HTTP協(xié)議簡介2、請求信息的內(nèi)容:(1)請求行:請求方法、http協(xié)議版本和URL;(2)請求頭部:用鍵值對表示,如Accept-Charst:utf-8,指定客戶端接收的字符集;(3)空行:通知請求頭部結(jié)束;(4)請求數(shù)據(jù):由數(shù)據(jù)頭部信息和數(shù)據(jù)內(nèi)容組成,數(shù)據(jù)頭部規(guī)定了數(shù)據(jù)的類型、長度、編碼等信息(post方法有請求數(shù)據(jù),get方法不能發(fā)送請求數(shù)據(jù))。2.1.1HTTP協(xié)議3、響應信息的內(nèi)容:(1)狀態(tài)行:協(xié)議版本、狀態(tài)碼(如常見的404,500,200)以及狀態(tài)碼文本描述;(2)響應頭部:用鍵值對表示;(3)空行:表示響應頭部結(jié)束;(4)響應數(shù)據(jù):服務器返回的數(shù)據(jù)內(nèi)容和數(shù)據(jù)頭部信息(head請求無響應數(shù)據(jù))。2.1.1HTTP協(xié)議4、HTTP請求/響應的步驟(1)建立連接;(2)發(fā)送HTTP請求;(3)服務器接受請求并返回HTTP響應;(4)釋放連接;(5)客戶端瀏覽器解析響應信息。2.1.1HTTP協(xié)議1、http請求消息是瀏覽器發(fā)送給web服務器的信息。2、一個完整的http請求消息,包含“請求行,請求頭部,空行(分隔行),請求數(shù)據(jù)”。其中空行表示請求頭部結(jié)束。(1)請求行:由三部分組成:請求方法,請求URL(不包括域名),HTTP協(xié)議版本。請求方法有GET、POST、HEAD、PUT、DELETE等,最常用的是GET和POST。2.1.2http請求消息2.1.2http請求消息(2)請求頭部:Accept:用于告訴服務器,客戶機支持的數(shù)據(jù)類型,如Accept:text/html,image/*;Accept-Encoding:用于告訴服務器,客戶機支持的數(shù)據(jù)壓縮格式;Accept-Language:客戶機語言環(huán)境;Connection:告訴服務器,請求完成后,是否保持連接;Cookie:客戶機將Coockie信息帶給服務器;Host:客戶機想訪問的主機名;Referer:客戶機通過這個信息告知服務器,客戶端訪問服務器的路徑;User-Agent:客戶機通過這個信息告知服務器,客戶機的軟件環(huán)境,如操作系統(tǒng),瀏覽器版本等。2.1.2http請求消息(3)請求數(shù)據(jù):指瀏覽器端通過http協(xié)議發(fā)送給服務器的數(shù)據(jù)。如“T=9008&rsv=80”。2.1.2http請求消息HTTP響應消息是服務器端向客戶端回送的數(shù)據(jù),它包括狀態(tài)行、響應頭部、空行和響應數(shù)據(jù)。其中空行表示響應頭部結(jié)束。1、狀態(tài)行:由三部分組成:服務器HTTP協(xié)議版本,響應狀態(tài)碼,狀態(tài)碼的文本描述。如“HTTP/1.1200OK”。狀態(tài)碼:由3位數(shù)字組成,第一個數(shù)字定義了響應的類別。2xx:表示請求已被成功接受,其中200OK:表示客戶端請求成功。3xx:重定向信息4xx:客戶端錯誤5xx:服務器端錯誤,服務器未能實現(xiàn)合法的請求。2.1.3http響應消息2、響應頭部(消息頭):Server:服務器通過這個頭,告訴瀏覽器服務器的類型;Content-Encoding:告知瀏覽器,服務器的數(shù)據(jù)壓縮格式;Content-Type:告知瀏覽器,回送數(shù)據(jù)的類型;Transfer-Encoding:告知瀏覽器,傳送數(shù)據(jù)的編碼格式;Expries:告知瀏覽器回送的資源緩存多長時間。如果是-1或者0,表示不緩存;Cache-Control:控制瀏覽器不要緩存數(shù)據(jù);Connection:響應完成后,是否斷開連接;Date:告訴瀏覽器,服務器響應時間。2.1.3http響應消息3、響應數(shù)據(jù)(響應體):響應數(shù)據(jù)包含瀏覽器能夠解析的靜態(tài)內(nèi)容,如:html,純文本,圖片信息等。2.1.3http響應消息2.2.1爬蟲的基本流程網(wǎng)絡爬蟲(又稱為網(wǎng)頁蜘蛛,網(wǎng)絡機器人),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。2.2爬蟲基礎1、爬蟲程序發(fā)起http請求:使用http請求方法向目標站點的web服務器發(fā)起請求,即發(fā)送一個Request,Request包含:請求頭、請求體等。2、接收響應信息:如果web服務器能正常響應,則會得到一個Response響應對象,Response包含:狀態(tài)碼、html、json、圖片、視頻等響應內(nèi)容。3、解析反饋的非結(jié)構(gòu)化數(shù)據(jù):如解析html數(shù)據(jù),可使用正則表達式、css選擇器、第三方解析庫如Beautifulsoup等;如需解析json數(shù)據(jù),可使用json模塊處理方法;如需解析二進制數(shù)據(jù),可以”wb”的方式寫入文件系統(tǒng),在進行相應的處理。4、保存數(shù)據(jù):將非結(jié)構(gòu)化數(shù)據(jù)進行清洗后,提取的有效數(shù)據(jù)保存在數(shù)據(jù)庫或txt、csv、json等數(shù)據(jù)庫或文件系統(tǒng)中。2.2.1爬蟲的基本流程1、通用網(wǎng)絡爬蟲:

通用網(wǎng)絡爬蟲又叫作全網(wǎng)爬蟲。搜索引擎中一般使用通用網(wǎng)絡爬蟲。2、聚焦網(wǎng)絡爬蟲:按照預先定義好的主題有選擇地進行網(wǎng)頁爬取的一種爬蟲,也叫主題網(wǎng)絡爬蟲。3、增量式網(wǎng)絡爬蟲:

爬取網(wǎng)頁的時候只爬取內(nèi)容發(fā)生變化的網(wǎng)頁或者新產(chǎn)生的網(wǎng)頁。4、深層網(wǎng)絡爬蟲:深層網(wǎng)絡爬蟲則可以抓取到深層網(wǎng)頁的數(shù)據(jù)。2.2.2爬蟲分類2.2.3爬蟲結(jié)構(gòu)爬蟲程序框架1、爬蟲調(diào)度器:用來啟動、執(zhí)行、停止爬蟲,或者監(jiān)視爬蟲中的運行情況。

首先根據(jù)需求從互聯(lián)網(wǎng)頁面中精心選擇種子URL,種子URL作為爬蟲的起始點放入待抓取URL隊列中,同時以種子URL啟動網(wǎng)頁下載器;調(diào)用網(wǎng)頁解析器將內(nèi)容解析,獲得價值數(shù)據(jù)和待爬取的URL鏈接,放入URL管理器中;直到所有的URL被爬取。2.2.3爬蟲結(jié)構(gòu)2.2.3爬蟲結(jié)構(gòu)爬蟲調(diào)度器和各模塊的運行流程2、URL管理器:

主要是管理待抓取URL和已抓取URL,其目的是為了防止重復抓取,循環(huán)抓取;URL管理器的實現(xiàn)方式一般采用Python的集合、列表或數(shù)據(jù)庫等方式。3、網(wǎng)頁下載器:

將互聯(lián)網(wǎng)上URL對應的網(wǎng)頁下載到本地的工具。Python中的網(wǎng)頁下載器,大致為requests是和urllib兩種。其中urllib是python的基礎模塊,requests是第三方庫。4、網(wǎng)頁解析器:

網(wǎng)頁解析器是從網(wǎng)頁中提取有價值數(shù)據(jù)的工具。Python的網(wǎng)頁解析器有兩大類:分別是通過DOM樹方式的結(jié)構(gòu)化解析器和通過字符串模糊查找的正則表達式匹配的方式。2.2.3爬蟲結(jié)構(gòu)一、robots協(xié)議是國際互聯(lián)網(wǎng)界通行的道德規(guī)范,基于以下原則建立:1、搜索技術(shù)應服務于人類,同時尊重信息提供者的意愿,并維護其隱私權(quán);2、網(wǎng)站有義務保護其使用者的個人信息和隱私不被侵犯。符合Robots協(xié)議規(guī)范的爬蟲才是一個合法的爬蟲。2.3robots協(xié)議二、robots協(xié)議也叫robots.txt(統(tǒng)一小寫)是一種存放于網(wǎng)站根目錄下的ASCII編碼的文本文件,它通常告訴網(wǎng)絡爬蟲,此網(wǎng)站中的哪些內(nèi)容是不應被獲取,哪些是可以被爬蟲獲取的。三、robots.txt是搜索引擎訪問網(wǎng)站時要查看的第一個文件。四、robots.txt文件常用的語法:User-agent:*這里的*代表的所有的搜索引擎種類,*是一個通配符Disallow:/htmlpage/這里定義是禁止爬取htmlpage目錄下面的目錄Allow:.htm$僅允許訪問以".htm"為后綴的URL。Allow:.gif$允許抓取網(wǎng)頁和gif格式圖片如:禁止所有搜索引擎訪問網(wǎng)站的任何內(nèi)容:User-agent:*Disallow:/2.3robots協(xié)議1、Requests是用python語言編寫的第三方庫;2、Python中還提供了urllib模塊,也可以實現(xiàn)網(wǎng)頁的提取和下載的功能。但urllib模塊使用相對復雜,3、擴展庫requests模塊是urllib3的下一代產(chǎn)品。4、requests模塊不是Python自帶的,所以必須先安裝。2.4網(wǎng)頁下載器Requests庫的應用打開cmd窗口,如圖進入到你的python安裝目錄:2.4.1安裝接下來,做一個簡單的測試,確保requests模塊已經(jīng)正確安裝。打開python,在IDLE交互式環(huán)境中輸入以下代碼:>>>importrequests如果沒有錯誤信息顯示,requests模塊就已經(jīng)安裝成功了。2.4.1安裝例2-1:第一個爬蟲程序--爬取首頁的代碼。importrequestsurl=""response=requests.get(url)#發(fā)出網(wǎng)頁請求print(response.text)#輸出相應信息的內(nèi)容在這個實例中,url為爬取的目標網(wǎng)頁的地址,requests.get(url)是網(wǎng)頁請求方法,response變量是網(wǎng)頁響應對象,response.text是響應對象的屬性。2.4.1安裝request對象:在爬蟲中我們將客戶端通過瀏覽器提交到web服務器的請求稱為request對象;在requests庫中通過提供對應于http協(xié)議中相應功能的請求方法實現(xiàn)自動請求。response對象:web服務器返回的響應信息稱為response對象。通過提供響應對象response的屬性和方法提取web服務器反饋的信息。2.4.2requests庫的一些常用方法2.4.2requests庫的一些常用方法requests.put()、requests.patch()、quests.delete(),這三個方法一般web服務器會禁止瀏覽器的訪問。requests.request()是其他六個方法的基礎方法,我們將重點介紹它的各個參數(shù)用法。requests.get()和requests.post()方法是網(wǎng)頁請求使用最多的兩個方法。2.4.2requests庫的一些常用方法1、requests.request(method,url,**kwargs):method:新建Request對象要使用的HTTP方法,包括:get,post,put,delete等。url:新建Request對象的URL鏈接。**kwargs:13個控制訪問的可選參數(shù)。params:字典或字節(jié)序列,作為參數(shù)增加到url中;data:作為Request對象body的內(nèi)容;json:JSON格式的數(shù)據(jù),作為Request對象body的內(nèi)容;headers:字典格式,HTTP請求頭,作為Request對象Header的內(nèi)容;cookies:字典類型,Request中的cookie信息;proxies:字典類型,用于將協(xié)議映射為代理的URL;verify:T認證SSL證書開關(guān);其他:Files、auth、timeout、allow_redirects、stream、cert2.4.2requests庫的一些常用方法2、requests.get(url,params=None,**kwargs):等價于requests.request('get',url,**kwargs)。這是最常用的請求方法。get()請求的查詢字符串以明碼的形式在url中發(fā)送。傳送的數(shù)據(jù)量有限,因為是明碼傳送,傳送數(shù)據(jù)的安全性較低。

url:擬獲取頁面的url鏈接;

params:url中的額外參數(shù),字典或字節(jié)流格式,可選,默認為None; **kwargs:12個控制訪問的參數(shù)(除params)??蛇x。2.4.2requests庫的一些常用方法例2-2:requests中g(shù)et請求實現(xiàn)參數(shù)傳遞的方式。以百度搜索為例:百度的搜索關(guān)鍵字放在“wd”關(guān)鍵字中的,輸入一個關(guān)鍵字,可以通過觀察瀏覽器的url地址欄中的“wd關(guān)鍵字”確認。importrequestsurl='/'para={'wd':'get方法'}#將需要搜索的關(guān)鍵字定義為字典傳給paramsr1=requests.get(url,params=para,headers=header)print("r1.url=",r1.url)lists=['get','post','put']#多參數(shù)的訪問para1={'wd':''}#初始化參數(shù)鍵值對,值為空串forsinlists:para1['wd']=str(s)r=requests.get(url,params=para1,headers=header)print("r{}.url=".format({s}),r.url)2.4.2requests庫的一些常用方法3、requests.post(url,data=None,json=None,**kwargs):等價于requests.request('post',url,**kwargs)。Post()請求的查詢字符串是在請求的主體信息中發(fā)送的,可以發(fā)送大量的信息,同時安全性更高。url:擬更新頁面的url鏈接;data:字典、字節(jié)序列或文件,Request的內(nèi)容;json:JSON格式的數(shù)據(jù),Request的內(nèi)容;**kwargs:11個控制訪問的參數(shù)(除data,json)。

post一般用于在請求中提供大量數(shù)據(jù)的請求,可以使用data參數(shù)、json參數(shù)進行數(shù)據(jù)傳送;如果返回的是json數(shù)據(jù),可以使用response.json()來將json字符串轉(zhuǎn)換為字典或者列表。2.4.2requests庫的一些常用方法例2-3:post方法傳輸數(shù)據(jù)訪問百度翻譯并解析成JSON格式。importrequestsheader={'User-Agent':'Mozilla/5.0',}url='/sug'#sug是打開f12以后重新輸入需要翻譯的詞即可從Network中找到deffanyi(value):key={'kw':value}#key['kw']=value,也可以使用這種方法賦值

print('key=',key)r=requests.post(url,data=key,headers=header)result=r.json()returnresultif__name__=='__main__':word=input("輸入要翻譯的內(nèi)容:")res=fanyi(word)print(res)

問題提出:我們在IDLE中輸入下面的代碼:>>>importrequestsasreqr=req.get("")>>>r.request.header:{'User-Agent':'python-requests/2.20.1','Connection':'keep-alive','Accept-Encoding':'gzip,deflate','Accept':'*/*'}。請求頭中的User-Agent為“python-requests/2.20.1”這是爬蟲程序的頭部,不是瀏覽器的頭部信息。2.4.3requests爬蟲之定制請求頭

這個頭部信息對于禁止爬蟲的網(wǎng)頁來說,將爬取不到網(wǎng)頁的內(nèi)容。例2-4:下載知乎首頁,并輸出網(wǎng)頁信息importrequestsurl=='/'r=requests.get(url)print("r=",r.url)print("type(r)=",type(r.url))r.encoding=r.apparent_encodingprint("r.內(nèi)容=",r.text)2.4.3requests爬蟲之定制請求頭在運行程序,發(fā)現(xiàn)輸出的結(jié)果是:>>>r=/type(r)=<class'str'>r.內(nèi)容=<html><head><title>400BadRequest</title></head><bodybgcolor="white"><center><h1>400BadRequest</h1></center><hr><center>openresty</center></body></html>>>>輸出結(jié)果中有一段信息:“400BadReques”,表明“r=requests.get(url)”方法沒有能夠爬取到正確的網(wǎng)頁信息,返回的是一段錯誤的代碼。爬蟲程序告知服務器的頭部信息為:User-Agent為“python-requests/2.20.1”這不是瀏覽器的信息。如果服務器設置了反爬蟲,會導致requests庫返回錯誤,一般狀態(tài)碼為400。我們可以通過設置請求頭信息偽裝成瀏覽器訪問繞過web服務器對爬蟲程序的識別。1、查找請求頭Headers信息:在采用設置請求頭信息偽裝成瀏覽器訪問繞過web服務器對爬蟲程序的識別的方法時,我們需要先找到我們?yōu)g覽器的http訪問的請求頭部信息。常用的有以下七個請求頭信息:Host、Connection、Accept、User-Agent、Referrer、Accept-Encoding和Accept-Language。這七個頭部信息的含義在前面html部分已做介紹。2.4.3requests爬蟲之定制請求頭以為例,從瀏覽器中打開網(wǎng)頁,用F12或右鍵–>檢查(或檢查元素),打開開發(fā)者工具,選擇“網(wǎng)絡(network)”選項,在瀏覽器中“刷新”頁面,在開發(fā)者頁面中選取“名稱(name)”為的頁面,查看頁面中右側(cè)的頭部的請求標頭(Requestheaders)信息。2.4.3requests爬蟲之定制請求頭2、Requests設置請求頭Headers:查找到請求頭的信息后,可以將Requestheaders的信息復制到程序中,我們可以在在程序中添加一段代碼:

header={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/61.0.3163.100Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","accept-language":"zh-CN,zh;q=0.9"}r=requests.get(url,headers=header)#在請求時,加上headers參數(shù)簡化設置為:header={'User-Agent':'Mozilla/5.0',}2.4.3requests爬蟲之定制請求頭在程序中可能有的瀏覽器偽裝被封,可以尋找多個瀏覽器頭部信息存儲在列表中,采用隨機函數(shù)在requests庫請求時隨機產(chǎn)生一個頭部信息。例2-5:隨機獲取請求頭信息(各個瀏覽器的信息可以在網(wǎng)上查找)。importrandomdefget_ua():#定義一個函數(shù),可以在程序中調(diào)用

ua=["Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/61.0.3163.100Safari/537.36","Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50","Mozilla/5.0(WindowsNT10.0;WOW64;rv:38.0)Gecko/20100101Firefox/38.0","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)","Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1","Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1","Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11","Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11","Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)","Opera/9.80(Android2.3.4;Linux;OperaMobi/build-1107180945;U;en-GB)Presto/2.8.149Version/11.10","Mozilla/5.0(Linux;U;Android3.0;en-us;XoomBuild/HRI39)AppleWebKit/534.13(KHTML,likeGecko)Version/4.0Safari/534.13","Mozilla/5.0(BlackBerry;U;BlackBerry9800;en)AppleWebKit/534.1+(KHTML,likeGecko)Version/37MobileSafari/534.1+"]returnrandom.choice(ua)#返回頭信息header={'user-agent':get_ua()}print(header)前面的章節(jié)中我們學習了使用requests庫中用于網(wǎng)頁請求的各個方法和參數(shù)。下面打開IDLE交互界面,我們來實時的觀察一下requests.get()方法下載一個網(wǎng)頁時web服務器返回的“響應信息”:>>>importrequests>>>requests.get('')<Response[200]>>>>r=requests.get('')>>>type(r)<class'requests.models.Response'>>>>通過在requests.get()的返回值“r”上調(diào)用python的查看數(shù)據(jù)類型的函數(shù)type(),可以看到返回值“r”是一個Response對象,其中包含了Web服務器對requests的請求做出的響應。2.4.4requests庫的響應信息屬性說明r.status_codeHTTP請求的返回狀態(tài),200表示鏈接成功,其他狀態(tài)碼表示失敗r.textHTTP響應的url對應的字符串形式的頁面內(nèi)容r.encoding從請求的url的頭部header中猜測的響應內(nèi)容編碼方式r.apparent_encoding從內(nèi)容中分析出的響應內(nèi)容的編碼方式r.contentHTTP響應內(nèi)容的二進制形式,一般用于圖形等內(nèi)容的下載。r.raw原始響應體,也就urllibresponse對象,使用

r.raw.read()讀取r.headers以字典對象存儲服務器響應頭,字典鍵不區(qū)分大小寫,若鍵不存在則返回Noner.url獲取請求的url信息r.cookies獲取請求后的cookies信息r.historyr.history是一個

Response對象的列表,這個對象列表記錄從最開始到最近的請求。方法說明r.json()requests中內(nèi)置的json解碼器,以json數(shù)據(jù)格式解析r.raise_for_status()請求失敗,即狀態(tài)碼非200,拋出requests.HTTPError異常2.4.4requests庫的響應信息表2-3Response對象的屬性和方法1、r.headers與r.request.headersr.Headers:服務器返回的響應頭部信息。r.request.headers:發(fā)送到服務器的請求的頭部信息。例如:>>>importrequestsasreq>>>r=req.get("")>>>r.headers#百度服務器的響應頭部>>>r.request.headers#請求頭部2.4.4requests庫的響應信息2、r.status_code與r.raise_for_status()方法r.status_code:狀態(tài)碼,狀態(tài)碼200或requests.codes.ok表示鏈接成功,其他狀態(tài)碼表示失敗。在程序中用于判定請求是否成功。>>>r.status_code200>>>r.status_code==requests.codes.ok(或r.status_code==200)True>>>r.raise_for_status()方法:拋出異常的方式判定爬取程序是否正常運行??梢杂胻ry和except語句將raise_for_status()代碼行包裹起來,處理網(wǎng)頁下載中的錯誤,不讓程序崩潰,保障程序的健壯性。2.4.4requests庫的響應信息例2-6:網(wǎng)頁下載的健壯程序。importrequestsheader={'User-Agent':'Mozilla/5.0',}url='/'try:r=requests.get(url,headers=header)r.raise_for_status()print(r.status_code)except:print('下載出錯')2.4.4requests庫的響應信息3、Requests庫的異常信息Requests庫在發(fā)出請求后,可能請求會產(chǎn)生錯誤,拋出異常。Requests庫的異常如表2-4所示。2.4.4requests庫的響應信息異常名稱異常說明requests.ConnectionError網(wǎng)絡連接異常錯誤requests.HTTPErrorHTTP錯誤異常,r.raise_for_status()如返回的不是200,即返回requests.HTTPErrorrequests.URLRequiredURL缺失異常requests.TooManyRedirects超出最大重定向異常requests.ConnectTimeout鏈接遠程服務器超時異常requests.Timeout請求URL超時異常4、r.encoding和r.apparent_encoding響應信息的編碼方式r.encoding:從HTTP的頭信息headers中猜測的響應內(nèi)容編碼方式,如果headers中存在charset字段,說明訪問的服務器對它的資源的編碼方式是有要求的,可以使用r.encoding來獲取。r.apparent_encoding:根據(jù)網(wǎng)頁內(nèi)容分析出的編碼方式。如果headers中不存在charset字段,則認為默認編碼為ISO-8859-1,但是這個編碼不能解析中文,可以用r.apparent_encoding來解碼。r.apparent_encoding是根據(jù)網(wǎng)頁內(nèi)容分析出的編碼方式,比r.encoding更為準確。2.4.4requests庫的響應信息5、r.text與r.content響應信息的內(nèi)容r.text:是提取響應網(wǎng)頁的HTML字符串形式,r.content:是HTTP響應內(nèi)容的二進制形式,一般圖形等響應信息采用該屬性提取。r.text方式提取出來的文檔有時會出現(xiàn)亂碼情況,可以使用下列的方法正確的解碼:(1)r.encoding='utf-8'#修改返回的頭部編碼信息(2)r.encoding=r.r.apparent_encoding#用正文中的編碼代替頭部的編碼信息(3)r_str=r.content.decode('utf-8')#把相應的二進制字節(jié)流用'utf-8'解碼為str類型爬取網(wǎng)頁的通用代碼框架一般為例2-6,我們可以將正確解碼的html響應信息直接輸出也可以寫入文件中:改寫的例2-6-1:

importrequestsdefget_text(url):try:r=requests.get(url,timeout=10)r.raise_for_status#如果狀態(tài)不是200,引發(fā)HTTPError異常

r.encoding=r.apparent_encodingreturnr.textexcept:returnurl='/'print(get_text(url)[:250])withopen('baiduhtml.txt','w')asf:f.write(get_text(url))2.4.4requests庫的響應信息例2-6-2:下載圖片寫入文件。importrequestsdefget_pic(url):try:r=requests.get(url,tim

溫馨提示

  • 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

提交評論