《Python編程案例教程》網(wǎng)絡(luò)爬蟲(chóng)_第1頁(yè)
《Python編程案例教程》網(wǎng)絡(luò)爬蟲(chóng)_第2頁(yè)
《Python編程案例教程》網(wǎng)絡(luò)爬蟲(chóng)_第3頁(yè)
《Python編程案例教程》網(wǎng)絡(luò)爬蟲(chóng)_第4頁(yè)
《Python編程案例教程》網(wǎng)絡(luò)爬蟲(chóng)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章導(dǎo)讀隨著網(wǎng)絡(luò)的迅速發(fā)展,如何有效地提取并利用信息已經(jīng)成為一個(gè)巨大的挑戰(zhàn)。為了更高效地獲取指定信息,需定向抓取并分析網(wǎng)頁(yè)資源,從而促進(jìn)了網(wǎng)絡(luò)爬蟲(chóng)的發(fā)展。本章將介紹使用Python編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)的方法。學(xué)習(xí)目標(biāo)理解網(wǎng)絡(luò)爬蟲(chóng)的基本操作流程掌握通過(guò)requests庫(kù)進(jìn)行數(shù)據(jù)抓取的方法掌握通過(guò)正則表達(dá)式進(jìn)行數(shù)據(jù)解析的方法掌握運(yùn)用beautifulsoup4庫(kù)解析和處理數(shù)據(jù)的方法概述12.1概述

網(wǎng)絡(luò)爬蟲(chóng)(WebSpider)又稱(chēng)網(wǎng)絡(luò)蜘蛛或網(wǎng)絡(luò)機(jī)器人,是一段用來(lái)實(shí)現(xiàn)自動(dòng)采集網(wǎng)站數(shù)據(jù)的程序。

網(wǎng)絡(luò)爬蟲(chóng)不僅能夠?yàn)樗阉饕娌杉W(wǎng)絡(luò)信息,而且還可以作為定向信息采集器,定向采集某些網(wǎng)站中的特定信息。

對(duì)于定向信息的爬取,網(wǎng)絡(luò)爬蟲(chóng)主要采取數(shù)據(jù)抓取、數(shù)據(jù)解析、數(shù)據(jù)入庫(kù)的操作流程。概述12.1概述

(1)數(shù)據(jù)抓?。喊l(fā)送構(gòu)造的HTTP請(qǐng)求,獲得包含所需數(shù)據(jù)的HTTP響應(yīng);

(2)數(shù)據(jù)解析:對(duì)HTTP響應(yīng)的原始數(shù)據(jù)進(jìn)行分析、清洗,以提取出所需要的數(shù)據(jù);

(3)數(shù)據(jù)入庫(kù):將數(shù)據(jù)進(jìn)一步保存到數(shù)據(jù)庫(kù)(或文本文件)中,用于構(gòu)建知識(shí)庫(kù)。爬蟲(chóng)客戶(hù)端目標(biāo)網(wǎng)站數(shù)據(jù)庫(kù)(1)發(fā)送HTTP請(qǐng)求(2)獲取響應(yīng)內(nèi)容(3)解析、清洗、入庫(kù)Python提供了許多與網(wǎng)絡(luò)爬蟲(chóng)相關(guān)的庫(kù)。其中,在數(shù)據(jù)抓取方面requests;在數(shù)據(jù)解析方面包括re(正則表達(dá)式),beautifulsoup4。12.2.1requests庫(kù)概述12.2.2使用requests庫(kù)12.2.3簡(jiǎn)單應(yīng)用數(shù)據(jù)抓取12.2.1requests庫(kù)概述requests庫(kù)提供了很多功能特性,幾乎涵蓋了所有Web服務(wù)的需求,包括URL獲取、HTTP長(zhǎng)連接和連接緩存、HTTP會(huì)話(huà)、瀏覽器式的SSL驗(yàn)證、身份認(rèn)證、Cookie會(huì)話(huà)、文件分塊上傳、流下載、HTTP(S)代理功能、連接超時(shí)處理等。由于requests庫(kù)是第三方庫(kù),因此,需要通過(guò)pip3指令進(jìn)行安裝,pip3安裝命令如下:C:\>pip3installrequests安裝完requests庫(kù)后,在Python交互模式下輸入導(dǎo)入requests庫(kù)的語(yǔ)句:>>>importrequests如果沒(méi)有提示錯(cuò)誤,則說(shuō)明安裝成功。數(shù)據(jù)抓取12.2.2使用requests庫(kù)網(wǎng)絡(luò)爬蟲(chóng)工作流程的第一步是數(shù)據(jù)的抓取,也就是使用requests庫(kù)實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求和獲取HTTP響應(yīng)的內(nèi)容。1.發(fā)送HTTP請(qǐng)求requests庫(kù)提供了幾乎所有的HTTP請(qǐng)求方法:函數(shù)描述對(duì)應(yīng)于HTTP的GET方法,請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體;是獲取網(wǎng)頁(yè)最常用的方法,可通過(guò)timeout=n設(shè)置每次請(qǐng)求超時(shí)時(shí)間為n秒get(url[,timeout=n])head(url)對(duì)應(yīng)于HTTP的HEAD方法,類(lèi)似于get請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭post(url,data={'key':'value'})對(duì)應(yīng)于HTTP的POST方法,向指定資源提交數(shù)據(jù),并處理請(qǐng)求(如提交表單或者上傳文件);其中字典用于傳遞客戶(hù)數(shù)據(jù)對(duì)應(yīng)于HTTP的DELETE方法,請(qǐng)求服務(wù)器刪除指定的頁(yè)面delete(url)options(url)對(duì)應(yīng)于HTTP的OPTIONS方法,允許客戶(hù)端查看服務(wù)器的性能對(duì)應(yīng)于HTTP的PUT方法,從客戶(hù)端向服務(wù)器傳送的數(shù)據(jù)取代指定put(url,data={'key':'value'})的文檔內(nèi)容。其中字典用于傳遞客戶(hù)數(shù)據(jù)數(shù)據(jù)抓取12.2.2使用requests庫(kù)調(diào)用get()函數(shù)是獲取網(wǎng)頁(yè)最常用的方式,在調(diào)用requests.get()函數(shù)后,返回的網(wǎng)頁(yè)內(nèi)容會(huì)保存為一個(gè)Response對(duì)象。>>>importrequests>>>r=requests.get('')>>>type(r)<class'requests.models.Response'>#導(dǎo)入requests庫(kù)#使用get函數(shù)打開(kāi)百度鏈接#查看返回值r的類(lèi)型數(shù)據(jù)抓取12.2.2使用requests庫(kù)有時(shí)我們需要在URL中傳遞參數(shù)。例如:在采集百度搜索結(jié)果時(shí),需要傳遞wd參數(shù)(搜索詞)。requests允許使用params關(guān)鍵字參數(shù),以一個(gè)字符串字典來(lái)提供這些參數(shù)。>>>importrequests>>>payload={'wd':'Python'}>>>r=requests.get("/s",params=payload)#傳入U(xiǎn)RL參數(shù)>>>r.url'/s?wd=Python'#導(dǎo)入requests庫(kù)#定義字典#輸出URL的值用瀏覽器打開(kāi)被編碼的URL得到百度搜索關(guān)鍵字“Python”的結(jié)果。數(shù)據(jù)抓取12.2.2使用requests庫(kù)2.獲取HTTP響應(yīng)的內(nèi)容和瀏覽器的交互過(guò)程一樣,requests.get()代表發(fā)送HTTP請(qǐng)求的過(guò)程,它返回的Response對(duì)象代表HTTP響應(yīng)。我們可以通過(guò)Response對(duì)象的不同屬性來(lái)獲取不同內(nèi)容,其語(yǔ)法格式如下:對(duì)象名.屬性名Response對(duì)象的常用屬性:屬性描述textHTTP響應(yīng)內(nèi)容的字符串形式,即URL對(duì)應(yīng)的頁(yè)面內(nèi)容contentHTTP響應(yīng)內(nèi)容的二進(jìn)制形式encodingHTTP響應(yīng)內(nèi)容的編碼方式status_codeHTTP請(qǐng)求的返回狀態(tài),為整數(shù),如200表示連接成功、404表示連接失敗演示一下吧!數(shù)據(jù)抓取12.2.2使用requests庫(kù)除了屬性,Response對(duì)象還提供了兩個(gè)常用的方法:(1)json()方法:如果HTTP響應(yīng)內(nèi)容包含JSON格式數(shù)據(jù),則該方法解析JSON數(shù)據(jù)。提示JSON的全稱(chēng)是“JavaScriptObjectNotation”,即JavaScript對(duì)象表示法,是一種基于文本又獨(dú)立于語(yǔ)言的輕量級(jí)數(shù)據(jù)交換格式,易于閱讀和理解。>>>importrequests#導(dǎo)入requests庫(kù)例如:>>>r=requests.get('/service/getIpInfo.php?ip=8')>>>r.json(){'code':0,'data':{'ip':'8','country':'中國(guó)','area':'','region':'江蘇','city':'南京','county':'XX','isp':'鐵通','country_id':'CN','area_id':'','region_id':'320000','city_id':'320100','county_id':'xx','isp_id':'100020'}}#調(diào)用json()方法數(shù)據(jù)抓取12.2.2使用requests庫(kù)(2)raise_for_status()方法:該方法能在非成功響應(yīng)后產(chǎn)生異常,即只要返回的請(qǐng)求狀態(tài)status_code不是200,該方法就會(huì)產(chǎn)生一個(gè)異常,可用try-except異常處理結(jié)果進(jìn)行處理。提示一般情況下,需要在發(fā)送HTTP請(qǐng)求之后,調(diào)用raise_for_status()方法判斷有無(wú)發(fā)生異常,如果沒(méi)有發(fā)生異常,則進(jìn)行數(shù)據(jù)的處理,否則不進(jìn)行數(shù)據(jù)處理。數(shù)據(jù)抓取12.2.3簡(jiǎn)單應(yīng)用例:爬取“”網(wǎng)站的內(nèi)容,并將爬取到的內(nèi)容輸出。importrequests#導(dǎo)入requests庫(kù)#異常處理try:r=requests.get('')#使用get函數(shù)打開(kāi)指定的urlr.raise_for_status()r.encoding='utf-8'print(r.text)#如果狀態(tài)不是200,則引發(fā)異常#更改編碼方式#用字符串的形式顯示頁(yè)面內(nèi)容except:print("網(wǎng)站連接失?。?)#發(fā)生異常則輸出“網(wǎng)站連接失??!”程序運(yùn)行效果12.3.1正則表達(dá)式12.3.2beautifulsoup4庫(kù)數(shù)據(jù)解析元字符和語(yǔ)法12.3.1正則表達(dá)式說(shuō)明表達(dá)式實(shí)例1.正則表達(dá)式基礎(chǔ)字符一般字符.\[][^]匹配自身匹配除換行符外的任意單個(gè)字符python匹配pythona.c匹配abc,acc等正則表達(dá)式是用于轉(zhuǎn)義字符處理字符串的強(qiáng)大工具,它使用預(yù)定義的特定模式a\.c去匹配匹配a.c;一類(lèi)具有共同特征的a\\c匹配a\c字符串,主要不在用于快速、準(zhǔn)確地完成復(fù)雜字符串的查找、替換[]中的字符等。[^abc]匹配除a,b,c之外的字符用來(lái)表示一組字符a[bcd]e(同a[b-d]e)匹配abe,ace和ade預(yù)定義字符集(可用在字符集[]中)\d\D\s\S\w\W匹配任意數(shù)字,等價(jià)于[0-9]匹配任意非數(shù)字匹配任意空白字符,等價(jià)于[\t\n\r\f]匹配任意非空字符匹配數(shù)字、字母、下劃線(xiàn)匹配非數(shù)字、字母、下劃線(xiàn)a\dc匹配a1c,a2c等a\Dc匹配abc,asc等a\sc匹配aca\Sc匹配abc等a\wc匹配a1c,abc等a\Wc匹配ac數(shù)量詞(可用在字符或()之后)*+匹配位于*之前的字符0次或多次匹配位于+之前的字符1次或多次匹配位于?之前的字符0次或1次,當(dāng)此字符緊隨任何其他限定符abc*匹配ab,abccc等abc+匹配abc,abccc等?{m}abc?匹配ab和abcab{2}c匹配abbc(*、+、?、{m}、{m,n})之后時(shí),匹配模式為“非貪婪”匹配前一個(gè)字符m次匹配前一個(gè)字符m至n次,省略m則匹配0至n次;省略n則匹配m至{m,n}ab{1,2}c匹配abc和abbc無(wú)限次邊界匹配^$匹配行首匹配行尾^abc匹配以abc開(kāi)始的行abc$匹配以abc結(jié)尾的行邏輯、分組|()匹配位于|之前或之后的字符將位于()內(nèi)的內(nèi)容作為一個(gè)整體a|b匹配a或b(abc){2}匹配abcabc數(shù)據(jù)解析12.3.1正則表達(dá)式具體應(yīng)用時(shí),可以單獨(dú)使用某種類(lèi)型的元字符,但處理復(fù)雜字符串時(shí),經(jīng)常需要將多個(gè)正則表達(dá)式元字符進(jìn)行組合。下面給出了幾個(gè)示例。

(1)'[a-zA-Z0-9]'可以匹配一個(gè)任意大小寫(xiě)字母或數(shù)字。

(2)'^(\w){6,15}$'匹配長(zhǎng)度為6~15的字符串,可以包含數(shù)字、字母和下劃線(xiàn)。

(3)'^\w+@(\w+\.)+\w+$'檢查給定字符串是否為合法電子郵件地址。

(4)'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'檢查給定字符串是否為合法IP地址。數(shù)據(jù)解析12.3.1正則表達(dá)式2.re模塊在Python中,主要使用re模塊來(lái)實(shí)現(xiàn)正則表達(dá)式的操作,該模塊的常用方法下表所示。方法描述pile(pattern[,flags])re.search(pattern,string[,flags])或用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式(Pattern)對(duì)象掃描整個(gè)字符串并返回第一個(gè)成功的匹配search(string[,pos[,endpos]])re.match(pattern,string[,flags])或嘗試從字符串的起始位置匹配一個(gè)模式,返回match(string[,pos[,endpos]])match()對(duì)象或nonere.findall(pattern,string[,flags])或findall(string[,pos[,endpos]])re.sub(pattern,repl,string[,count=0])或在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒(méi)有找到匹配的,則返回空列表用于替換字符串中的匹配項(xiàng)sub(repl,string[,count])re.split(pattern,string[,maxsplit=0])或按照能夠匹配的子串將字符串分割后返回列表split(string[,maxsplit])數(shù)據(jù)解析12.3.1正則表達(dá)式1)直接使用re模塊方法例如:>>>importre>>>text='Python.C.Java...PHP'#定義text字符串>>>re.split('[\.]+',text)['Python','C','Java','PHP']>>>re.findall('[a-zA-Z]+',text)['Python','C','Java','PHP']#導(dǎo)入re模塊#調(diào)用split()函數(shù)對(duì)text進(jìn)行分割#調(diào)用findall()函數(shù)查找由大小寫(xiě)字母組成的字符串?dāng)?shù)據(jù)解析12.3.1正則表達(dá)式2)使用正則表達(dá)式對(duì)象編譯后的正則表達(dá)式對(duì)象不僅可以提高字符串的處理速度,還提供了更加強(qiáng)大的字符串處理功能。此處,我們首先使用re模塊的compile()方法將正則表達(dá)式編譯成正則表達(dá)式對(duì)象,然后使用正則表達(dá)式對(duì)象提供的方法進(jìn)行字符串處理。例如:>>>importre>>>p=pile(r'\d+')>>>print(p.findall('one1two2three3four4'))#調(diào)用findall()方法查找數(shù)字['1','2','3','4']#導(dǎo)入re模塊#將正則表達(dá)式編譯成正則表達(dá)式對(duì)象數(shù)據(jù)解析12.3.1正則表達(dá)式例:爬取“”網(wǎng)站的內(nèi)容,解析數(shù)據(jù),將該網(wǎng)站上的“.jpg“圖片下載到本地。爬取網(wǎng)站內(nèi)容在正則表達(dá)式中包含子組下載圖片?可用正則表達(dá)式?r'src="(.+?\.jpg)"'?將獲取到的每條路徑加到r'src=".+?\.jpg"'來(lái)匹配字符串“”后面構(gòu)成完整的鏈接地址?使用requests.get()函數(shù)獲取內(nèi)容,并將獲取到的內(nèi)容以二進(jìn)制形式寫(xiě)入到文件中進(jìn)行保存。數(shù)據(jù)解析12.3.1正則表達(dá)式importrequests#導(dǎo)入requests庫(kù)importre#定義一個(gè)getHtml()函數(shù),根據(jù)填寫(xiě)的url參數(shù)獲取數(shù)據(jù)defgetHtml(url):#導(dǎo)入re模塊#異常處理try:r=requests.get(url)r.raise_for_status()r.encoding='utf-8'returnr.text#使用get函數(shù)打開(kāi)指定的url#如果狀態(tài)不是200,則引發(fā)異常#更改編碼方式#返回頁(yè)面內(nèi)容except:return""#發(fā)生異常返回空字符數(shù)據(jù)解析12.3.1正則表達(dá)式#定義一個(gè)getImg()函數(shù),根據(jù)填寫(xiě)的html參數(shù)獲取圖片并存儲(chǔ)defgetImg(html):reg=r'src="(.+?\.jpg)"'imglist=re.findall(reg,html)print(imglist)i=0forurlinimglist:#定義正則表達(dá)式#查找頁(yè)面中所有符合條件的字符串#輸出列表結(jié)果#定義i用于給下載的圖片命名#遍歷#以寫(xiě)入方式打開(kāi)二進(jìn)制文件withopen(str(i)+".jpg","wb")asfd:#路徑前加上“”response=requests.get("/"+url)#獲取內(nèi)容fd.write(response.content)print('圖片',i,"保存成功\n")i+=1#寫(xiě)入文件#輸出提示信息#i加1html=getHtml("/")#調(diào)用獲取頁(yè)面內(nèi)容函數(shù)getImg(html)#調(diào)用獲取圖片并存儲(chǔ)函數(shù)數(shù)據(jù)解析12.3.1正則表達(dá)式程序運(yùn)行效果數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)beautifulsoup4庫(kù)也稱(chēng)為BeautifulSoup庫(kù)或bs4庫(kù),用于解析和處理HTML和XML文件,其最大優(yōu)點(diǎn)是能夠根據(jù)HTML和XML語(yǔ)法建立解析樹(shù),進(jìn)而提高解析效率。例如:有以下HTML文件:<html><head></head><body>head<a>first</a><a>second</a>htmlabody</body>a</html>數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)由于beautifulsoup4庫(kù)是第三方庫(kù),因此,需要通過(guò)pip3指令進(jìn)行安裝,pip3安裝命令如下:>>>C:\>pip3installbeautifulsoup4

beautifulsoup4庫(kù)中最重要的類(lèi)是BeautifulSoup,它的實(shí)例化對(duì)象相當(dāng)于一個(gè)頁(yè)面。

可采用from-import語(yǔ)句導(dǎo)入庫(kù)中的BeautifulSoup類(lèi),然后使用BeautifulSoup()創(chuàng)建一個(gè)BeautifulSoup對(duì)象。例如:>>>importrequests#導(dǎo)入requests庫(kù)>>>frombs4importBeautifulSoup>>>r=requests.get('')>>>r.encoding='utf-8'>>>soup=BeautifulSoup(r.text)>>>type(soup)<class'bs4.BeautifulSoup'>#從bs4庫(kù)中導(dǎo)入BeautifulSoup類(lèi)#使用get函數(shù)打開(kāi)百度鏈接#更改編碼方式#創(chuàng)建BeautifulSoup對(duì)象#查看soup類(lèi)型數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)創(chuàng)建的BeautifulSoup對(duì)象是一個(gè)樹(shù)形結(jié)構(gòu),它包含HTML頁(yè)面中的標(biāo)簽元素,如<head>、<body>等。也就是說(shuō),HTML中的主要結(jié)構(gòu)都變成了BeautifulSoup對(duì)象的一個(gè)屬性,可通過(guò)“對(duì)象名.屬性名”形式獲取屬性值。屬性描述headHTML頁(yè)面的<head>內(nèi)容titleHTML頁(yè)面標(biāo)題,在<head>中,由<title>標(biāo)記bodypaHTML頁(yè)面的<body>內(nèi)容HTML頁(yè)面中第一個(gè)<p>內(nèi)容HTML頁(yè)面中第一個(gè)<a>內(nèi)容stringsHTML頁(yè)面所有呈現(xiàn)在Web上的字符串,即標(biāo)簽的內(nèi)容stripped_stringsHTML頁(yè)面所有呈現(xiàn)在Web上的非空格字符串演示一下吧!數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)每一個(gè)標(biāo)簽在beautifulsoup4庫(kù)中又是一個(gè)對(duì)象,稱(chēng)為T(mén)ag對(duì)象。例如:查看“soup.p”的類(lèi)型可以看出“soup.p”是一個(gè)Tag對(duì)象:>>>type(soup.p)#查看“soup.p”類(lèi)型<class'bs4.element.Tag'>Tag對(duì)象有4個(gè)常用屬性屬性描述name字符串,標(biāo)簽的名字,如head,title等attrs字典,包含了頁(yè)面標(biāo)簽的所有屬性(尖括號(hào)內(nèi)的其他項(xiàng)),如hrefcontents列表,這個(gè)標(biāo)簽下所有子標(biāo)簽的內(nèi)容string字符串,標(biāo)簽所包圍的文字,網(wǎng)頁(yè)中真實(shí)的文字(尖括號(hào)之間的內(nèi)容)演示一下吧!find_all('div',{'class':'bk_show_info'})find_all(name,attrs,recursive,string,limit)掌握通過(guò)正則表達(dá)式進(jìn)行數(shù)據(jù)解析的方法match(pattern,string[,flags])或1)直接使用re模塊方法用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式調(diào)用get()函數(shù)是獲取網(wǎng)頁(yè)最常用的方式,在調(diào)用requests.#調(diào)用json()方法python匹配python除了屬性,Response對(duì)象還提供了兩個(gè)常用的方法:reg=r'src="(.2beautifulsoup4庫(kù)txt','w')asfd:本章將介紹使用Python編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)的方法。get(url,timeout=30)#使用get函數(shù)打開(kāi)指定的url數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)當(dāng)需要列出對(duì)應(yīng)標(biāo)簽的所有內(nèi)容或找到非第一個(gè)標(biāo)簽時(shí),可以使用BeautifulSoup對(duì)象的find_all()方法。該方法會(huì)遍歷整個(gè)HTML文件,按照條件返回標(biāo)簽內(nèi)容(列表類(lèi)型)。其語(yǔ)法格式如下:對(duì)象名.find_all(name,attrs,recursive,string,limit)

name表示標(biāo)簽名;

attrs表示按照標(biāo)簽屬性值檢索(需列出屬性名和值);

recursive表示查找層次(BeautifulSoup默認(rèn)檢索當(dāng)前標(biāo)簽的所有子孫節(jié)點(diǎn),如果只搜索標(biāo)簽的直接子節(jié)點(diǎn),可以使用參數(shù)recursive=False);

string表示按照關(guān)鍵字檢索string屬性?xún)?nèi)容(采用string=開(kāi)始);

limit表示返回結(jié)果的個(gè)數(shù),默認(rèn)返回全部結(jié)果。演示一下吧!數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)例:爬取“”網(wǎng)站的內(nèi)容,解析數(shù)據(jù),輸出該網(wǎng)站中的圖書(shū)信息。importrequests#導(dǎo)入requests庫(kù)importrefrombs4importBeautifulSoup#定義一個(gè)getHtml()函數(shù),根據(jù)填寫(xiě)的url參數(shù)獲取數(shù)據(jù)defgetHtml(url):#導(dǎo)入re模塊#導(dǎo)入BeautifulSoup#異常處理try:r=requests.get(url)r.raise_for_status()r.encoding='utf-8'returnr.text#使用get函數(shù)打開(kāi)指定的url#如果狀態(tài)不是200,則引發(fā)異常#更改編碼方式#返回頁(yè)面內(nèi)容except:return""#發(fā)生異常返回空字符數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)#定義數(shù)據(jù)解析函數(shù),用于找到符合條件的數(shù)據(jù)并輸出defgetcon(html):bsObj=BeautifulSoup(html)#找到所有class為bk_show_info的div,只獲取圖書(shū)信息divList=bsObj.find_all('div',{'class':'bk_show_info'})allbook=[]fordivsindivList:#將html對(duì)象轉(zhuǎn)化為BeautifulSoup對(duì)象#存儲(chǔ)全部數(shù)據(jù),二維列表book_info=[]book_name=divs.h4['data-name']book_info.append(book_name)p_list=divs.find_all('p')forp_contentinp_list:#存儲(chǔ)單本圖書(shū)信息,一維列表#獲取圖書(shū)名稱(chēng)#將圖書(shū)名稱(chēng)存儲(chǔ)到book_info#查找單本圖書(shū)的其他信息(在標(biāo)簽p中)book_info.append(p_content.string)#將p標(biāo)簽中的信息存入book_infoallbook.append(book_info)#將單本圖書(shū)的信息存入allbook#輸出獲取到的圖書(shū)信息forbookinallbook:print(book)html=getHtml("/")getcon(html)#調(diào)用獲取頁(yè)面內(nèi)容函數(shù)#調(diào)用解析數(shù)據(jù)函數(shù)數(shù)據(jù)解析12.3.2beautifulsoup4庫(kù)程序運(yùn)行效果典型案例12.4采集百度搜索結(jié)果例:爬取百度搜索“Python程序設(shè)計(jì)教程”的結(jié)果,并將搜索結(jié)果保存到“12-4.txt”文件中。(1)通過(guò)requests庫(kù)的get()函數(shù)提交查詢(xún),響應(yīng)結(jié)果即為百度的搜索結(jié)果。(2)人工分析百度搜索結(jié)果頁(yè)面HTML代碼,<div…data-tools='{"title":"…","url":"…"}'>…</div>(3)利用beautifulsoup4庫(kù)找到名為div的標(biāo)簽,并找到data-tools的屬性值,然后提取帶有title的字符串,可以看到data-tools內(nèi)部由{}括起來(lái)的數(shù)據(jù)是典型的JSON格式,可以利用json庫(kù)將其轉(zhuǎn)換為字典,以便于操作。(4)將獲取到的數(shù)據(jù)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論