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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

post一般用于在請(qǐng)求中提供大量數(shù)據(jù)的請(qǐng)求,可以使用data參數(shù)、json參數(shù)進(jìn)行數(shù)據(jù)傳送;如果返回的是json數(shù)據(jù),可以使用response.json()來將json字符串轉(zhuǎn)換為字典或者列表。2.4.2requests庫(kù)的一些常用方法例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)

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

這個(gè)頭部信息對(duì)于禁止爬蟲的網(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爬蟲之定制請(qǐng)求頭在運(yùn)行程序,發(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)頁信息,返回的是一段錯(cuò)誤的代碼。爬蟲程序告知服務(wù)器的頭部信息為:User-Agent為“python-requests/2.20.1”這不是瀏覽器的信息。如果服務(wù)器設(shè)置了反爬蟲,會(huì)導(dǎo)致requests庫(kù)返回錯(cuò)誤,一般狀態(tài)碼為400。我們可以通過設(shè)置請(qǐng)求頭信息偽裝成瀏覽器訪問繞過web服務(wù)器對(duì)爬蟲程序的識(shí)別。1、查找請(qǐng)求頭Headers信息:在采用設(shè)置請(qǐng)求頭信息偽裝成瀏覽器訪問繞過web服務(wù)器對(duì)爬蟲程序的識(shí)別的方法時(shí),我們需要先找到我們?yōu)g覽器的http訪問的請(qǐng)求頭部信息。常用的有以下七個(gè)請(qǐng)求頭信息:Host、Connection、Accept、User-Agent、Referrer、Accept-Encoding和Accept-Language。這七個(gè)頭部信息的含義在前面html部分已做介紹。2.4.3requests爬蟲之定制請(qǐng)求頭以為例,從瀏覽器中打開網(wǎng)頁,用F12或右鍵–>檢查(或檢查元素),打開開發(fā)者工具,選擇“網(wǎng)絡(luò)(network)”選項(xiàng),在瀏覽器中“刷新”頁面,在開發(fā)者頁面中選取“名稱(name)”為的頁面,查看頁面中右側(cè)的頭部的請(qǐng)求標(biāo)頭(Requestheaders)信息。2.4.3requests爬蟲之定制請(qǐng)求頭2、Requests設(shè)置請(qǐng)求頭Headers:查找到請(qǐng)求頭的信息后,可以將Requestheaders的信息復(fù)制到程序中,我們可以在在程序中添加一段代碼:

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)#在請(qǐng)求時(shí),加上headers參數(shù)簡(jiǎn)化設(shè)置為:header={'User-Agent':'Mozilla/5.0',}2.4.3requests爬蟲之定制請(qǐng)求頭在程序中可能有的瀏覽器偽裝被封,可以尋找多個(gè)瀏覽器頭部信息存儲(chǔ)在列表中,采用隨機(jī)函數(shù)在requests庫(kù)請(qǐng)求時(shí)隨機(jī)產(chǎn)生一個(gè)頭部信息。例2-5:隨機(jī)獲取請(qǐng)求頭信息(各個(gè)瀏覽器的信息可以在網(wǎng)上查找)。importrandomdefget_ua():#定義一個(gè)函數(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é)中我們學(xué)習(xí)了使用requests庫(kù)中用于網(wǎng)頁請(qǐng)求的各個(gè)方法和參數(shù)。下面打開IDLE交互界面,我們來實(shí)時(shí)的觀察一下requests.get()方法下載一個(gè)網(wǎng)頁時(shí)web服務(wù)器返回的“響應(yīng)信息”:>>>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”是一個(gè)Response對(duì)象,其中包含了Web服務(wù)器對(duì)requests的請(qǐng)求做出的響應(yīng)。2.4.4requests庫(kù)的響應(yīng)信息屬性說明r.status_codeHTTP請(qǐng)求的返回狀態(tài),200表示鏈接成功,其他狀態(tài)碼表示失敗r.textHTTP響應(yīng)的url對(duì)應(yīng)的字符串形式的頁面內(nèi)容r.encoding從請(qǐng)求的url的頭部header中猜測(cè)的響應(yīng)內(nèi)容編碼方式r.apparent_encoding從內(nèi)容中分析出的響應(yīng)內(nèi)容的編碼方式r.contentHTTP響應(yīng)內(nèi)容的二進(jìn)制形式,一般用于圖形等內(nèi)容的下載。r.raw原始響應(yīng)體,也就urllibresponse對(duì)象,使用

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論