數(shù)據(jù)科學(xué)基礎(chǔ) 課件 第5章 網(wǎng)絡(luò)爬蟲(chóng)與信息提取_第1頁(yè)
數(shù)據(jù)科學(xué)基礎(chǔ) 課件 第5章 網(wǎng)絡(luò)爬蟲(chóng)與信息提取_第2頁(yè)
數(shù)據(jù)科學(xué)基礎(chǔ) 課件 第5章 網(wǎng)絡(luò)爬蟲(chóng)與信息提取_第3頁(yè)
數(shù)據(jù)科學(xué)基礎(chǔ) 課件 第5章 網(wǎng)絡(luò)爬蟲(chóng)與信息提取_第4頁(yè)
數(shù)據(jù)科學(xué)基礎(chǔ) 課件 第5章 網(wǎng)絡(luò)爬蟲(chóng)與信息提取_第5頁(yè)
已閱讀5頁(yè),還剩190頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

網(wǎng)絡(luò)同濟(jì)大學(xué)計(jì)算機(jī)基礎(chǔ)教研室第5章網(wǎng)絡(luò)爬蟲(chóng)與信息提取

5.1爬蟲(chóng)基本原理及獲取數(shù)據(jù)數(shù)據(jù)表示計(jì)算可視化特征分析1.爬蟲(chóng)原理及網(wǎng)頁(yè)構(gòu)造2.引例及Requests庫(kù)3.問(wèn)題及限制4.實(shí)例網(wǎng)絡(luò)連接自助售貨機(jī):選擇商品

投入硬幣/紙幣/掃碼

彈出相應(yīng)的商品瀏覽網(wǎng)頁(yè):在瀏覽器中輸入一個(gè)網(wǎng)址后敲擊回車,看到網(wǎng)站的頁(yè)面信息。即:瀏覽器請(qǐng)求了網(wǎng)站的服務(wù)器,獲取到網(wǎng)絡(luò)資源。爬蟲(chóng):模擬瀏覽器發(fā)送請(qǐng)求,獲得html代碼。html包括標(biāo)簽和文字,再?gòu)闹刑崛∠胍男畔?。電腦服務(wù)器request(請(qǐng)求頭和消息體)response(HTML文件)(2)相應(yīng)的服務(wù)器(自助售貨機(jī))會(huì)返回相應(yīng)的HTML文件(相應(yīng)的商品)作為Response(1)本機(jī)電腦(購(gòu)買者)帶著請(qǐng)求頭和消息體(硬幣和商品需求)向服務(wù)器(自助售貨機(jī))發(fā)起一次Request請(qǐng)求(購(gòu)買)爬蟲(chóng)原理網(wǎng)絡(luò)爬蟲(chóng)(WebSpider)如果把互聯(lián)網(wǎng)看作一張大網(wǎng),那么爬蟲(chóng)就是在大網(wǎng)上爬來(lái)爬去的蜘蛛,碰到想要的食物就把他抓取出來(lái)。爬蟲(chóng)原理網(wǎng)絡(luò)爬蟲(chóng)就是一種按照一定的規(guī)則,根據(jù)網(wǎng)頁(yè)的地址(即URL)自動(dòng)地抓取網(wǎng)頁(yè)信息的程序或者腳本。網(wǎng)絡(luò)連接需要:爬蟲(chóng)需要:(1)電腦的Request請(qǐng)求(2)服務(wù)器端的Response回應(yīng)(1)模擬電腦對(duì)服務(wù)器發(fā)起Request請(qǐng)求(2)接收服務(wù)器端的Response的內(nèi)容,并且解析提取所需信息引例1——爬取百度新聞頁(yè)面

()#引入Requests庫(kù)importrequests#發(fā)起GET請(qǐng)求response=requests.get('/')#輸出響應(yīng)內(nèi)容print(response.text)URL地址網(wǎng)頁(yè)html代碼Chrome瀏覽器輸入U(xiǎn)RL地址“”打開(kāi)頁(yè)面在網(wǎng)頁(yè)處單擊右鍵,選擇“檢查”,打開(kāi)開(kāi)發(fā)者工具Elements選項(xiàng)卡包含了網(wǎng)頁(yè)經(jīng)JavaScript處理的最終HTML代碼。Network選項(xiàng)卡中包含了瀏覽器收到的網(wǎng)頁(yè)源代碼。(IE中“查看源文件”或Firefox中“查看頁(yè)面源代碼”)HTML代碼超文本標(biāo)記語(yǔ)言JavaScript語(yǔ)言交互和動(dòng)畫效果經(jīng)js處理的HTML代碼CSS樣式層疊樣式表<pclass="title"></p>html源代碼由很多尖括號(hào)構(gòu)成的標(biāo)簽組織而成標(biāo)簽樹(shù)標(biāo)簽之間存在上下游關(guān)系文件CSS樣式層疊樣式表經(jīng)js處理的HTML代碼Tips:Chrome中審查元素與網(wǎng)頁(yè)源代碼區(qū)別審查元素看到實(shí)時(shí)性的內(nèi)容(經(jīng)過(guò)js的修改),即最終的html代碼定位網(wǎng)頁(yè)元素、及時(shí)調(diào)試、修改、定位、追蹤檢查、查看嵌套、修改樣式和查看js動(dòng)態(tài)輸出信息。網(wǎng)頁(yè)源代碼看到最開(kāi)始瀏覽器收到HTTP響應(yīng)內(nèi)容,查看源代碼只是把網(wǎng)頁(yè)輸出的源代碼直接打開(kāi),既不能動(dòng)態(tài)變化,也不能修改。引例2-爬取頁(yè)面的新聞標(biāo)題和鏈接爬蟲(chóng)基本流程網(wǎng)絡(luò)爬蟲(chóng)就是要模擬用戶使用瀏覽器訪問(wèn)網(wǎng)頁(yè)的過(guò)程,即先模擬電腦對(duì)服務(wù)器發(fā)起Request請(qǐng)求,再接受服務(wù)器端的Response響應(yīng)內(nèi)容,根據(jù)需要進(jìn)行解析和提取,并保存所需的信息。發(fā)起請(qǐng)求獲取響應(yīng)內(nèi)容解析內(nèi)容保存數(shù)據(jù)電腦服務(wù)器request(請(qǐng)求頭和消息體)response(HTML文件)爬蟲(chóng)基本流程1.發(fā)起請(qǐng)求:向目標(biāo)站點(diǎn)發(fā)送一個(gè)Request(可以包含額外的headers等信息),即發(fā)起請(qǐng)求,然后等待服務(wù)器響應(yīng)。相當(dāng)于瀏覽器作為一個(gè)瀏覽的客戶端,向服務(wù)器端發(fā)送了一次請(qǐng)求(我們打開(kāi)瀏覽器并輸入網(wǎng)址,然后點(diǎn)擊回車)。電腦服務(wù)器Request(請(qǐng)求頭和消息體)爬蟲(chóng)基本流程2.獲取響應(yīng)內(nèi)容:如果服務(wù)器能正常響應(yīng),我們會(huì)得到一個(gè)Response,即獲取到的內(nèi)容,類型可能有HTML、Json字符串、二進(jìn)制數(shù)據(jù)(圖片,視頻等)等。相當(dāng)于服務(wù)器接收客戶端的請(qǐng)求,進(jìn)而將網(wǎng)頁(yè)HTML文件發(fā)送給瀏覽器。電腦服務(wù)器Response爬蟲(chóng)基本流程3.解析內(nèi)容:得到的內(nèi)容也許是HTML,可使用正則表達(dá)式,網(wǎng)頁(yè)解析庫(kù)(如BeautifulSoup)進(jìn)行解析也許是Json,可直接轉(zhuǎn)為Json對(duì)象解析也許是二進(jìn)制數(shù)據(jù),可進(jìn)行保存或者進(jìn)一步處理相當(dāng)于瀏覽器把服務(wù)器端的文件獲取到本地,再進(jìn)行解釋并且展現(xiàn)出來(lái)。爬蟲(chóng)基本流程4.保存數(shù)據(jù):保存的方式把數(shù)據(jù)存為文本把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)把數(shù)據(jù)保存為jpg、mp4等格式…相當(dāng)于瀏覽網(wǎng)頁(yè)時(shí),下載網(wǎng)頁(yè)上的圖片或者視頻爬蟲(chóng)基本流程爬蟲(chóng)就是獲取網(wǎng)頁(yè)并提取和保存信息的自動(dòng)化程序在快速獲取大量數(shù)據(jù)時(shí),通過(guò)爬蟲(chóng)程序來(lái)自動(dòng)抓取并進(jìn)行異常處理、錯(cuò)誤重試等等操作,確保爬蟲(chóng)保持高效運(yùn)行。Urllib.Request/Requests庫(kù)Python3中可使用urllib.request和requests進(jìn)行網(wǎng)頁(yè)爬取urllib庫(kù):python內(nèi)置,無(wú)需額外安裝,但使用不夠方便。requests庫(kù):第三方庫(kù),需安裝?;趗rllib3,采用Apache2Licensed開(kāi)源協(xié)議的HTTP庫(kù)。requests庫(kù)簡(jiǎn)單易用,比urllib更加方便。課內(nèi)使用requests庫(kù)獲取網(wǎng)頁(yè)的HTML信息,安裝方法:IDLE:在cmd命令行中

pipinstallrequestsAnaconda:在prompt中condainstallrequests檢測(cè):在交互式環(huán)境(IDLE、Spyder等)中輸入importrequests不報(bào)錯(cuò),說(shuō)明requests模塊成功安裝引例擴(kuò)展(1).為了使用requests,需要首先引入requests庫(kù):(2).使用requests來(lái)發(fā)送http請(qǐng)求,如get請(qǐng)求:(3).獲得的Response對(duì)象r,即http請(qǐng)求的響應(yīng)結(jié)果。

顯示Response對(duì)象r的一些屬性,如:importrequestsr=requests.get('/')#檢測(cè)r的類型print(type(r))#獲取請(qǐng)求信息的urlprint(r.url)#請(qǐng)求的狀態(tài)碼print(r.status_code)Responseresponse對(duì)象包含了三部分主要信息響應(yīng)狀態(tài)響應(yīng)頭(ResponseHeader)包括內(nèi)容類型,長(zhǎng)度,服務(wù)器信息,設(shè)置Cookie等信息。響應(yīng)體(Responsebody)主要包含請(qǐng)求資源的內(nèi)容,如網(wǎng)頁(yè)的HTML代碼、圖片的二進(jìn)制數(shù)據(jù)等。200404502301成功找不到頁(yè)面服務(wù)器錯(cuò)誤跳轉(zhuǎn)頁(yè)面r.status_coder.headersr.textresponsestatus_codeheadersbodyISO-8859-1UTF-8亂碼?#顯示Response對(duì)象的編碼方式print(r.encoding)#顯示Response對(duì)象的文本編碼print(r.apparent_encoding)#修改編碼方式后重新顯示r.encoding=r.apparent_encodingprint(r.text)從headers猜測(cè)response對(duì)象的編碼方式。若header中不存在charset,則認(rèn)為是ISO-8859-1r.text根據(jù)r.encoding顯示網(wǎng)頁(yè)內(nèi)容根據(jù)網(wǎng)頁(yè)內(nèi)容分析出的編碼方式。原則來(lái)說(shuō)更加準(zhǔn)確。Response對(duì)象的主要屬性屬

性說(shuō)

明r.status_codehttp請(qǐng)求的返回狀態(tài),200表示成功,其他(如404)表示失敗r.texthttp響應(yīng)內(nèi)容的字符串形式,即url對(duì)應(yīng)的頁(yè)面內(nèi)容r.contenthttp響應(yīng)內(nèi)容的二進(jìn)制形式,即url對(duì)應(yīng)內(nèi)容的二進(jìn)制形式r.encoding從httpheader中猜測(cè)的響應(yīng)內(nèi)容編碼方式r.apparent_encoding從內(nèi)容中分析出的響應(yīng)內(nèi)容編碼方式,備選編碼方式bytes型的原始二進(jìn)制數(shù)據(jù)處理過(guò)的Unicode型的數(shù)據(jù)得到的內(nèi)容網(wǎng)頁(yè)文本HTML文檔、Json格式文本等圖片、音頻、視頻二進(jìn)制文件,保存為相應(yīng)的格式其他r=requests.get('/img/baidu_jgylogo3.gif')print(r.content)

#二進(jìn)制文件使用content#保存圖片withopen('logo.gif','wb')asf:f.write(r.content)print('Ok')Requests庫(kù)的異常類型異常說(shuō)明ConnectionError網(wǎng)絡(luò)連接出現(xiàn)錯(cuò)誤,如DNS查詢失敗、拒絕連接HTTPErrorHTTP協(xié)議層面出現(xiàn)錯(cuò)誤URLRequiredURL缺失造成的異常TooManyRedirects超過(guò)最大重定向次數(shù)產(chǎn)生異常ConnectTimeout連接遠(yuǎn)程服務(wù)器超時(shí)異常Timeout請(qǐng)求URL超時(shí),產(chǎn)生超時(shí)錯(cuò)誤超時(shí)設(shè)置利用timeout變量來(lái)配置最大請(qǐng)求時(shí)間,如果在timeout時(shí)間內(nèi)請(qǐng)求內(nèi)容沒(méi)有返回,將產(chǎn)生一個(gè)timeout的異常。importrequestsresp=requests.get('',timeout=0.5)print(resp.status_code)如果在指定時(shí)間內(nèi)沒(méi)有返回,就會(huì)拋出timeout異常。如果遠(yuǎn)端服務(wù)器很慢,可以傳入一個(gè)None作為timeout值,使得requests永遠(yuǎn)等待。timeout僅對(duì)連接過(guò)程有效:只限制請(qǐng)求的時(shí)間,與響應(yīng)體的下載無(wú)關(guān)。即:當(dāng)返回的response包含很大內(nèi)容,下載需要一定時(shí)間,與timeout沒(méi)有關(guān)系。連接、讀取超時(shí)requests.get('http://',timeout=(6.005,0.01))分別指定連接和讀取的超時(shí)時(shí)間,服務(wù)器在指定時(shí)間沒(méi)有應(yīng)答,拋出requests.exceptions.ConnectTimeout/ReadTimeout-timeout=([連接超時(shí)時(shí)間],[讀取超時(shí)時(shí)間])-連接:客戶端連接服務(wù)器并發(fā)送http請(qǐng)求-讀?。嚎蛻舳说却?wù)器發(fā)送第一個(gè)字節(jié)之前的時(shí)間請(qǐng)求不成功(狀態(tài)碼)bad_r=requests.get('/status/404')bad_r.raise_for_status()如果HTTP請(qǐng)求返回了不成功的狀態(tài)碼(4XX客戶端錯(cuò)誤,或者5XX服務(wù)端錯(cuò)誤),Response.raise_for_status()拋出

requests.exceptions.HTTPError

Requests庫(kù)的異常處理importrequestsfromrequests.exceptionsimportConnectTimeout,RequestExceptiontry:response=requests.get('',timeout=0.005)print(response.status_code)exceptConnectTimeout: #超時(shí)異常print('timeout')exceptRequestException: #請(qǐng)求異常print('reqerror')異常處理當(dāng)你不確定會(huì)發(fā)生什么錯(cuò)誤時(shí),盡量使用try...except來(lái)捕獲異常攜程爬取importrequestsurl="/tour/detail/p12906212s2.html#ctm_ref=va_youxue_s2_lst_p1_l2_1_txt"try:r=requests.get(url,timeout=0.5)

r.raise_for_status()

print(r.text[:500])except:print("爬取失敗")爬取網(wǎng)頁(yè)的通用代碼框架通用代碼框架可以有效處理和避免訪問(wèn)和爬取網(wǎng)頁(yè)過(guò)程中可能出現(xiàn)的錯(cuò)誤,提高訪問(wèn)和爬取的效率。importrequests #加載Requests庫(kù)defget_html(url): #定義get_html函數(shù)

try:r=requests.get(url,timeout=40) #設(shè)定get函數(shù)參數(shù),超時(shí)限制40sr.raise_for_status()#有效判斷網(wǎng)絡(luò)連接狀態(tài),錯(cuò)誤將捕獲異常

r.encoding=r.apparent_encoding#設(shè)置編碼格式

returnr.text #返回網(wǎng)頁(yè)文本內(nèi)容

except:return"產(chǎn)生異常" #返回異常提示if__name__==“_main_”: #直接運(yùn)行時(shí)(非以模塊導(dǎo)入)

url="" #給url賦值

print(get_html(url)) #打印函數(shù)內(nèi)容HTTP基本知識(shí)URL:統(tǒng)一資源定位符。HTTP協(xié)議一般采用url作為定位網(wǎng)絡(luò)資源的標(biāo)識(shí)超文本:HyperTexthttp://[host]:[port]/[path]

/info/1032/22142.htm合法的internet主機(jī),域名或ip地址端口號(hào),省略時(shí)默認(rèn)端口號(hào)為80資源在該主機(jī)或ip地址服務(wù)器上所包含的內(nèi)部路徑HTTP基本知識(shí)HTTP(HyperTextTransferProtocol)超文本傳輸協(xié)議。用于將超文本數(shù)據(jù)從網(wǎng)絡(luò)傳輸?shù)奖镜貫g覽器而制定的傳送協(xié)議保證高效而準(zhǔn)確地傳送超文本文檔基于請(qǐng)求與響應(yīng)模式的無(wú)狀態(tài)的應(yīng)用層協(xié)議。HTTPS(HyperTextTransferProtocoloverSecureSocketLayer)以SSL為安全基礎(chǔ)的HTTP協(xié)議用戶發(fā)起請(qǐng)求,服務(wù)器做相關(guān)響應(yīng)第一次請(qǐng)求跟第二次請(qǐng)求之間,并沒(méi)有相關(guān)的關(guān)聯(lián)協(xié)議工作在TCP協(xié)議之上爬蟲(chóng)基本流程1.發(fā)起請(qǐng)求2.獲取響應(yīng)內(nèi)容電腦服務(wù)器Request(請(qǐng)求頭和消息體)Response(HTML文件)NetworkNameMethodStatusTypeInitiatorSizeTimeWaterfallNetworkNameMethodStatusTypeInitiatorSizeTimeWaterfallGeneralResponseHeadersRequestHeadersRequestURLRequestMethodStatusCodeRemoteAddressReferrerPolicy請(qǐng)求請(qǐng)求是由客戶端向服務(wù)端發(fā)出的,包括:requestmethod請(qǐng)求方式;requestURL請(qǐng)求網(wǎng)址;requestheader請(qǐng)求頭;requestBody請(qǐng)求體瀏覽器發(fā)信息給該網(wǎng)址所在服務(wù)器,即向服務(wù)器提出請(qǐng)求。請(qǐng)求方式主要有GET、POST、HEAD、PUT、DELETE。GET請(qǐng)求的請(qǐng)求參數(shù)會(huì)顯示在URL鏈接的后面。如用百度搜索“同濟(jì)”,請(qǐng)求的URL鏈接變?yōu)椋?s?wd=同濟(jì)POST請(qǐng)求的請(qǐng)求參數(shù)會(huì)存放在Request內(nèi),并不會(huì)出現(xiàn)在URL鏈接的后面。如登錄信息。請(qǐng)求請(qǐng)求URL統(tǒng)一資源定位符,即網(wǎng)址。URL可以確定一張網(wǎng)絡(luò)圖片、一個(gè)音頻、一個(gè)網(wǎng)頁(yè)文檔等,其包含的信息指出了文件的位置以及瀏覽器如何處理它。請(qǐng)求頭(Headers)包含請(qǐng)求時(shí)的頭部信息,例如User-Agent(指定瀏覽器的請(qǐng)求頭),Cookies、Host等。請(qǐng)求體額外攜帶的數(shù)據(jù),例如登錄表單提交的登錄信息HTTP操作方法方法說(shuō)明GET向特定資源發(fā)起請(qǐng)求,請(qǐng)求頁(yè)面,返回頁(yè)面內(nèi)容HEAD獲取html網(wǎng)頁(yè)頭(類似于GET,但不返回網(wǎng)頁(yè)具體內(nèi)容)POST向html提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(如提交表單或上傳文件),數(shù)據(jù)包含在請(qǐng)求體中PUT從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定文檔中的內(nèi)容PATCH提交局部修改請(qǐng)求DELETE請(qǐng)求服務(wù)器刪除指定的頁(yè)面OPTIONS允許客戶端查看服務(wù)器的性能HTTP協(xié)議,通過(guò)URL對(duì)資源做定位,通過(guò)常用的方法,對(duì)資源進(jìn)行管理,每一次操作都是獨(dú)立無(wú)狀態(tài)的。在HTTP協(xié)議的世界里,網(wǎng)絡(luò)通道跟服務(wù)器都是黑盒子,能看到的就是url鏈接以及對(duì)url鏈接的相關(guān)操作。Requests對(duì)象的方法方

法解

釋requests.request()構(gòu)造一個(gè)請(qǐng)求,支持以下各種方法requests.get()獲取html的主要方法,對(duì)應(yīng)http協(xié)議getrequests.head()獲取html頭部信息requests.post()向html網(wǎng)頁(yè)提交post請(qǐng)求requests.put()向html網(wǎng)頁(yè)提交put請(qǐng)求requests.patch()向html提交局部修改的請(qǐng)求requests.delete()向html提交刪除請(qǐng)求GET和POST是表單提交數(shù)據(jù)的兩種基本方式GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)GET請(qǐng)求數(shù)據(jù)通過(guò)域名后綴url傳送,用戶可見(jiàn),不安全POST請(qǐng)求數(shù)據(jù)通過(guò)在請(qǐng)求報(bào)文正文里傳輸,相對(duì)比較安全Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種:GET,POST,PUT,DELETE。一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源。而HTTP中的GET,POST,PUT,DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查,改,增,刪4個(gè)操作。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。request方法requests.request(method,url,**kwargs)請(qǐng)求方式,分別對(duì)應(yīng)get等7種方法頁(yè)面鏈接控制訪問(wèn)參數(shù)(13個(gè))params:增加到url中的參數(shù)data:向服務(wù)器提供或提交資源時(shí)使用json:作為內(nèi)容部分向服務(wù)器提交json數(shù)據(jù)headers:向某url訪問(wèn)時(shí)發(fā)起的http的頭字段cookies:從http協(xié)議中解析cookieauth:支持http認(rèn)證功能files:向服務(wù)器傳輸文件使用timeout:設(shè)定的超時(shí)時(shí)間proxies:設(shè)定訪問(wèn)代理服務(wù)器allow_redirects:是否允許對(duì)url進(jìn)行重定向stream:對(duì)獲取的內(nèi)容是否進(jìn)行立即下載verify:認(rèn)證ssl證書(shū)

cert:本地ssl證書(shū)路徑'GET''HEAD''POST''PUT''PATCH''DELETE''OPTIONS'其他方法的具體形式requests.get(url,params=None,**kwargs)requests.head(url,**kwargs)requests.post(url,data=None,json=None,**kwargs)requests.put(url,data=None,**kwargs)requests.patch(url,data=None,**kwargs)requests.delete(url,**kwargs)r=requests.get("/get?name=Sharon&age=10")Get方法基本GET請(qǐng)求importrequestsr=requests.get('/get')print(r.text)requests.get(url,params=None,**kwargs)獲取html網(wǎng)頁(yè)內(nèi)容,返回一個(gè)response對(duì)象擬爬取的網(wǎng)站地址url中的額外參數(shù),字典或者字節(jié)序列,作為參數(shù)增加到url中控制訪問(wèn)參數(shù)(12個(gè))在get請(qǐng)求中,經(jīng)常使用params關(guān)鍵字,以一個(gè)字典來(lái)傳遞這些參數(shù)。將一些鍵值對(duì)以?key1=value1&key2=value2的模式增加到url中。Get方法帶參數(shù)的GET請(qǐng)求importrequestsdata={'name':'Sharon','age':10}r=requests.get('/get',params=data)print(r.url)requests.get(url,params=None,**kwargs)獲取html網(wǎng)頁(yè)內(nèi)容,返回一個(gè)response對(duì)象等價(jià)于:r=requests.get("/get?name=Sharon&age=10")#通過(guò)params,將data鍵值對(duì)增加到url添加headers以防有些網(wǎng)站禁止爬蟲(chóng)訪問(wèn),添加瀏覽器的User-Agent信息importrequestsheaders={'User-Agent':"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/74.0.3729.108Safari/537.36"}r=requests.get('',headers=headers)print(r.text)瀏覽器

檢查/審查元素network點(diǎn)擊鏈接Headers信息importrequestsr=requests.get("/get")print(r.request.headers['User-Agent'])headers={'User-Agent':'Sharon'}r=requests.get("/get",headers=headers)print(r.request.headers)在請(qǐng)求中指定請(qǐng)求代理:User-Agent:向訪問(wèn)網(wǎng)站提供你所使用的瀏覽器類型及版本、操作系統(tǒng)及版本、瀏覽器內(nèi)核、等信息的標(biāo)識(shí)。知乎頁(yè)面importrequestsr=requests.get("/explore")print(r.text)importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/81.0.4044.122Safari/537.36'}r=requests.get("/explore",headers=headers)print(r.text)/robots.txt傳遞關(guān)鍵字爬取百度新聞搜索keyword=input("inputkeyword:")url="/ns"kv={"word":keyword}headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36"}r=requests.get(url,timeout=30,params=kv,headers=headers)print(r.text)print(r.url)POST方法基本post請(qǐng)求在requests中,以form表單形式發(fā)送post請(qǐng)求,只需將請(qǐng)求的參數(shù)構(gòu)造成一個(gè)字典,然后傳給data參數(shù)requests.post(url,data=None,json=None,**kwargs)importrequestsdata={"name":"yiqing","age":18}response=requests.post("/post",data=data)print(response.text)擬爬取的網(wǎng)站地址字典,字節(jié)序列或文件對(duì)象與params不同的是,data提交的數(shù)據(jù)并不接在url鏈接里,而是放在url對(duì)應(yīng)位置的地方(例如form里)作為數(shù)據(jù)來(lái)存儲(chǔ)。JSON格式的數(shù)據(jù)向服務(wù)器傳送數(shù)據(jù)POST方法帶參數(shù)post請(qǐng)求在requests中,以form表單形式發(fā)送post請(qǐng)求,只需將請(qǐng)求的參數(shù)構(gòu)造成一個(gè)字典,然后傳給data參數(shù)requests.post(url,data=None,json=None,**kwargs)importrequestsdata={"name":"Sharon","age":10}headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36"}response=requests.post("/post",data=data,headers=headers)print(response.text)文件上傳importrequestsfs={'file':open(‘logo.gif','rb')}resp=requests.post('/post',files=fs)print(resp.text)importrequestsurl='/post'fs={'file':open(‘G:/test.txt','rb')}r=requests.post(url,files=fs)print(r.text)建立Utf-8格式的txt文件:

test.txt并上傳上傳圖片文件logo.gif直接用files參數(shù)文件上傳:用open方式打開(kāi)文件,與file形成鍵值對(duì),定義成字典,并將其與files做關(guān)聯(lián),同時(shí)對(duì)應(yīng)到相關(guān)url。以之向鏈接提交文件。網(wǎng)絡(luò)爬蟲(chóng)按尺寸分類全internet網(wǎng)站網(wǎng)頁(yè)規(guī)模很小,獲取網(wǎng)絡(luò)的數(shù)據(jù)量也很小,對(duì)爬取速度要求不高。通常使用requests庫(kù)實(shí)現(xiàn)。針對(duì)特定或者一系列網(wǎng)頁(yè)能夠發(fā)揮很大的作用,最為常見(jiàn)。網(wǎng)站上內(nèi)容很多,對(duì)應(yīng)的數(shù)據(jù)規(guī)模較大,爬取速度必須足夠趕上網(wǎng)站本身數(shù)據(jù)更新的速度。通常使用例如Scrapy之類更為專業(yè)的庫(kù)。如Google、百度,作用是建立全依賴的搜索引擎,規(guī)模很大。需要一個(gè)能夠爬取全internet所有資源的爬蟲(chóng),對(duì)爬取速度要求非常高,必須定制開(kāi)發(fā)。網(wǎng)絡(luò)爬蟲(chóng)引發(fā)的問(wèn)題對(duì)服務(wù)器性能的騷擾內(nèi)容層面的法律風(fēng)險(xiǎn)個(gè)人隱私泄露服務(wù)器默認(rèn)按照人數(shù)來(lái)約定訪問(wèn)能力網(wǎng)絡(luò)爬蟲(chóng)用計(jì)算機(jī)快速運(yùn)算能力(十萬(wàn)/s~幾十萬(wàn)/s)去爬取網(wǎng)站內(nèi)容以獲取相關(guān)資源,對(duì)網(wǎng)站來(lái)說(shuō)形成騷擾,為服務(wù)器帶來(lái)巨大資源開(kāi)銷網(wǎng)站服務(wù)器上的數(shù)據(jù)往往有產(chǎn)權(quán)歸屬如果爬蟲(chóng)爬取網(wǎng)站提供的數(shù)據(jù)以進(jìn)行牟利,有可能會(huì)帶來(lái)法律上的風(fēng)險(xiǎn)網(wǎng)絡(luò)爬蟲(chóng)具備一定的突破能力如果爬取網(wǎng)站上受保護(hù)的個(gè)人隱私數(shù)據(jù),將給個(gè)人帶來(lái)很大的隱私泄露風(fēng)險(xiǎn)。對(duì)網(wǎng)絡(luò)爬蟲(chóng)的限制服務(wù)器或者網(wǎng)站的所有者可通過(guò)來(lái)源審查限制網(wǎng)絡(luò)爬蟲(chóng)。判斷所有請(qǐng)求網(wǎng)絡(luò)鏈接HTTP頭部的user-agent字段,對(duì)于不是預(yù)定的瀏覽器可以限制其訪問(wèn)。發(fā)布Robots協(xié)議,通知所有的爬蟲(chóng)本網(wǎng)站可爬取的策略和規(guī)則。但是,Robots協(xié)議僅僅是通過(guò)發(fā)布來(lái)體現(xiàn),至于是否遵守仍是由網(wǎng)絡(luò)爬蟲(chóng)自身決定。Robots協(xié)議

(RobotsExclusionProtocol

網(wǎng)絡(luò)爬蟲(chóng)排除標(biāo)準(zhǔn))作用:通知網(wǎng)絡(luò)爬蟲(chóng)本網(wǎng)站可爬取的策略和規(guī)則,哪些頁(yè)面可以抓取,哪些不允許訪問(wèn)網(wǎng)站時(shí)首先將檢查協(xié)議文件,以確定訪問(wèn)的范圍User-agent

表明的是爬蟲(chóng)來(lái)源,如果是*代表所有的爬蟲(chóng);Disallow

代表不允許這個(gè)爬蟲(chóng)訪問(wèn)的資源目錄或網(wǎng)址;Allow代表允許該爬蟲(chóng)訪問(wèn)的資源目錄或網(wǎng)址。User-agent:EtaoSpiderDisallow:/User-Agent:*Disallow:/pop/*.htmlDisallow:/?*針對(duì)EtaoSpider禁止訪問(wèn)任何部分針對(duì)所有爬蟲(chóng)禁止訪問(wèn)pop目錄下所有html網(wǎng)址禁止訪問(wèn)網(wǎng)站中所有包含問(wèn)號(hào)開(kāi)頭(?)的網(wǎng)址/robots.txt優(yōu)化異常處理?文件夾或路徑存在?文件沒(méi)有關(guān)閉?不能用原始文件名保存圖片?importrequestsimportosurl="/imgextra/i2/2895983329/O1CN011aSiyVIqb4ya7wU_!!2895983329.jpg"root="e://"path=root+url.split('/')[-1]try: ifnotos.path.exists(root): os.mkdir(root) ifnotos.path.exists(path): r=requests.get(url) withopen(path,'wb')asf: f.write(r.content) print("文件保存成功") else: print("文件已存在")except: print("爬取失敗")課后實(shí)驗(yàn)爬取百度/必應(yīng)首頁(yè)html代碼,顯示response對(duì)象的text內(nèi)容觀察response對(duì)象的狀態(tài)碼、編碼方式和httpheader修改header,并傳遞參數(shù)到url通過(guò)傳遞關(guān)鍵字”同濟(jì)大學(xué)”,爬取搜索的結(jié)果選取一張結(jié)果圖片,將其保存到本地對(duì)于用戶輸入的任意關(guān)鍵詞,獲取360搜索網(wǎng)站(/)任意搜索一個(gè)關(guān)鍵詞KeyWord,然后觀察其url地址。根據(jù)用戶輸入的關(guān)鍵詞,設(shè)置好當(dāng)前url,使用requests庫(kù)的get()方法實(shí)現(xiàn)對(duì)指定url的請(qǐng)求,并觀察response響應(yīng)對(duì)象的url鏈接和text內(nèi)容。拓展:政府工作報(bào)告-詞云繪制圖1.引入第三方庫(kù)2.爬取網(wǎng)頁(yè)文件3.詞云繪制#引入第三方庫(kù)importrequestsfrombs4importBeautifulSoupfromwordcloudimportWordCloud,STOPWORDSimportmatplotlib.pyplotaspltimportnumpyasnpimportPIL.ImageasImage#圖像處理#爬取網(wǎng)頁(yè)文件url="/premier/2022-03/12/content_5678750.htm"r=requests.get(url)r.encoding=r.apparent_encodingsoup=BeautifulSoup(r.text,"html.parser")content=soup.find("div",class_="pages_content").textprint(content)#詞云圖繪制mask=np.array(Image.open(r'五角星.png'))#通過(guò)generate(content)方法,將文本content生成一個(gè)WordCloud對(duì)象w=WordCloud(#設(shè)置字體格式font_path='C:/Windows/Fonts/simhei.ttf',background_color='white',#默認(rèn)為黑色stopwords=STOPWORDS.add(“各位代表”),#過(guò)濾詞匯mask=mask,#設(shè)置遮罩圖片max_words=1000,#最多顯示詞數(shù)max_font_size=40)#字體最大值c=w.generate(content)c.to_file("pic1.png")#將詞云輸出為圖像文件plt.subplot(111)plt.imshow(c)#顯示詞云圖plt.axis('off')#不顯示坐標(biāo)軸plt.show()#顯示圖像同濟(jì)大學(xué)計(jì)算機(jī)基礎(chǔ)教研室第五章網(wǎng)絡(luò)爬蟲(chóng)與信息提取

5.2信息解析三大解析方法使用Requests獲取到網(wǎng)頁(yè)的HTML代碼信息后,怎樣分析得到我們想要的信息?BeautifulSoup是一個(gè)HTML或XML解析庫(kù),用于格式化和組織復(fù)雜的網(wǎng)頁(yè)信息,是解析、遍歷、維護(hù)“標(biāo)簽樹(shù)”的功能庫(kù)。方法效率難度BeautifulSoup慢最簡(jiǎn)單正則表達(dá)式最快困難Xpath快正常引例:豆瓣電影名稱提取代碼importrequestsfrombs4importBeautifulSoupurl="/cinema/nowplaying/shanghai/"headers={'User-Agent':"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/74.0.3729.108Safari/537.36"}r=requests.get(url,headers=headers)#獲取頁(yè)面信息soup=BeautifulSoup(r.text,'html.parser')#分析頁(yè)面#找到所有的電影信息對(duì)應(yīng)的li標(biāo)簽movie_list=soup.find_all('li',class_='list-item')#遍歷所有l(wèi)i標(biāo)簽,分別獲取電影名稱foriteminmovie_list:print(item['data-title'])<pclass="title"></p>html源代碼由很多尖括號(hào)構(gòu)成的標(biāo)簽組織而成標(biāo)簽樹(shù)標(biāo)簽之間存在上下游關(guān)系文件BeautifulSoup庫(kù)BeautifulSoup是解析、遍歷、維護(hù)“標(biāo)簽樹(shù)”的功能庫(kù)BeautifulSoup庫(kù)支持多種解析器,可方便地提取HTML或XML標(biāo)簽中的內(nèi)容。BeautifulSoup提供一些簡(jiǎn)單的、python式的函數(shù)用來(lái)處理導(dǎo)航、搜索、修改分析樹(shù)等功能。BeautifulSoup使用編碼自動(dòng)檢測(cè)庫(kù)識(shí)別輸入文檔編碼并轉(zhuǎn)換為Unicode編碼,輸出文檔均轉(zhuǎn)換為utf-8編碼。BeautifulSoup可以對(duì)任何標(biāo)簽類型的文件進(jìn)行頁(yè)面內(nèi)容解析安裝和引用在Windows平臺(tái)以管理員身份運(yùn)行cmd,運(yùn)行下列語(yǔ)句進(jìn)行庫(kù)的安裝:pipinstallbeautifulsoup4在AnacondaPrompt下安裝:condainstallbeautifulsoup4引用方式frombs4importBeautifulSoupimportbs4HTML網(wǎng)頁(yè)結(jié)構(gòu)<html></html><head></head><title>頁(yè)面標(biāo)題</title><body></body><h1>這是一個(gè)標(biāo)題</h1><p>這是一個(gè)段落。</p>只有<body>區(qū)域才會(huì)在瀏覽器中顯示HTML元素以開(kāi)始標(biāo)簽起始、以結(jié)束標(biāo)簽終止,元素內(nèi)容是開(kāi)始標(biāo)簽與結(jié)束標(biāo)簽之間的內(nèi)容HTML文檔中的一個(gè)段落HTML文檔的主體整個(gè)HTML文檔嵌套的HTML元素超文本標(biāo)記語(yǔ)言HyperText

Markup

Language使用標(biāo)簽描述文檔結(jié)構(gòu)和表現(xiàn)形式<標(biāo)簽>內(nèi)容</標(biāo)簽>htmlheadtitlebodyph1創(chuàng)建beautifulsoup對(duì)象在瀏覽器中,右擊“檢查”,比較幾種結(jié)果importrequestsfrombs4importBeautifulSoup#導(dǎo)入bs4庫(kù)r=requests.get('/')soup=BeautifulSoup(r.text,"html.parser")#html解析print(soup.prettify())#格式化輸出,增加換行符,分行顯示soup=BeautifulSoup(html,"html.parser")BeautifulSoup解析器BeautifulSoup可以解析多種格式的文檔soup=BeautifulSoup(r.text,“html.parser”)#response對(duì)象的text解析器使用方法使用前提特點(diǎn)bs4的html解析器html.parserpipinstallbeautifulsoup4執(zhí)行速度適中;文檔容錯(cuò)力強(qiáng)lxml的html解析器lxmlpipinstalllxml速度快;文檔容錯(cuò)能力強(qiáng)lxml的xml解析器xmlpipinstallxml速度快;唯一支持XML的解析器html5lib的解析器html5libpipinstallhtml5lib更好的容錯(cuò)性;以瀏覽器的方式解析文檔soup=BeautifulSoup(‘<html>data</html>’,‘html.parser’)#html或xml文本soup=BeautifulSoup(open(‘a(chǎn).html’),“html.parser“)#網(wǎng)頁(yè)對(duì)象實(shí)例—上海當(dāng)日天氣/weather/101020100.shtmlimportrequestsfrombs4importBeautifulSoupurl="/weather/101020100.shtml"r=requests.get(url)r.encoding=r.apparent_encodingsoup=BeautifulSoup(r.text,"html.parser")name=soup.find_all(class_="skyskyidlv3on")foruinname:day=u.h1.stringwea=u.find(class_="wea").texttem=u.find(class_="tem").get_text()win=u.find(attrs={"class":"win"}).get_text()content="日期:"+day+"天氣:"+wea+"溫度:"+tem+"風(fēng)力:"+wincontent=content.replace("\n","")print(content)實(shí)例—上海當(dāng)日天氣拓展上海7日天氣預(yù)報(bào)?引入正則任意城市7日天氣預(yù)報(bào)?根據(jù)城市編碼生成任意城市鏈接任意城市周邊地區(qū)當(dāng)日天氣?多個(gè)周邊地區(qū)任意城市周邊地區(qū)7日天氣預(yù)報(bào)?根據(jù)每個(gè)周邊地區(qū)鏈接importrequestsfrombs4importBeautifulSoupurl="/weather/101020100.shtml"r=requests.get(url)r.encoding=r.apparent_encodingsoup=BeautifulSoup(r.text,"html.parser")name=soup.find_all(class_=pile("^skyskyidlv"))foruinname:day=u.h1.stringwea=u.find(class_="wea").text#text屬性

tem=u.find(class_="tem").get_text()#get_text方法

win=u.find(attrs={"class":"win"}).get_text()#設(shè)置attrscontent="日期:"+day+"天氣:"+wea+"溫度:"+tem+"風(fēng)力:"+wincontent=content.replace("\n","")print(content)實(shí)例—上海7日天氣15日天氣預(yù)報(bào)?任意城市7日天氣預(yù)報(bào)搜索天氣網(wǎng)城市編碼保存到txt文檔,將“=>”替換成“:”手動(dòng)拷貝賦值給字典citycName=input("城市名稱:")print("{}7日天氣預(yù)報(bào)".format(cName))code=city[cName]url="/weather/"+code+".shtml"#調(diào)用自定義函數(shù)get7DaysWeather(url)get7DaysWeather(url)defget7DaysWeather(url):r=requests.get(url)r.encoding=r.apparent_encodingsoup=BeautifulSoup(r.text,"html.parser")name=soup.find_all(class_=pile("^skyskyidlv"))foruinname:day=u.h1.stringwea=u.find(class_="wea").text#text屬性

tem=u.find(class_="tem").get_text()#get_text方法

win=u.find(attrs={"class":"win"}).get_text()#設(shè)置attrscontent="日期:"+day+"天氣:"+wea+"溫度:"+tem+"風(fēng)力:"+wincontent=content.replace("\n","")print(content)任意城市周邊地區(qū)當(dāng)日天氣函數(shù)getLink(cName),根據(jù)城市名稱得到城市鏈接defgetLink(cName):fp=open(r"城市編碼.txt","r")r="{"+fp.read()+"}"cityCode=eval(r)cityCode[cName]code=city[cName]url="/weather/"+code+".shtml"returnurl任意城市周邊地區(qū)當(dāng)日天氣defgetRegionInfo(url):r=requests.get(url)r.encoding=r.apparent_encodingsoup=BeautifulSoup(r.text,"html.parser")info=soup.find('ul',class_="clearfixcity")info=info.find_all("li")regionInfo={}

#獲取每個(gè)周邊地區(qū)的名稱及其鏈接

foriinrange(len(info)):name=info[i].find('span').texttem=info[i].find('i').text#link=info[i].find('a').get('href').replace("#around2",'')regionInfo[name]=temreturnregionInfo主函數(shù)defmain():cName=input("城市名稱:")url=getLink(cName)regionInfo=getRegionInfo(url)forname,teminregionInfo.items():print("{}:氣溫{}".format(name,tem))main()任意城市周邊地區(qū)的7日天氣預(yù)報(bào)?案例文檔html="""<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<ahref="/bs"class="method"id="link1">BeautifulSoup</a>,<ahref="/re"class="method"id="link2">正則表達(dá)式</a>,兩種方法各有特點(diǎn)</p><pclass="result">...</p></body></html>"""結(jié)構(gòu)htmlheadtitlebodypbpaap<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<ahref="/bs"class="method"id="link1">BeautifulSoup</a>,<ahref="/re"class="method"id="link2">正則表達(dá)式</a>,

兩種方法各有特點(diǎn)</p><pclass="result">...</p></body></html>BeautifulSoup類的基本元素基本元素說(shuō)

明Tag標(biāo)簽,最基本的信息組織單元。用<>和</>標(biāo)明開(kāi)頭和結(jié)尾Name標(biāo)簽的名字,比如

<ahref="xxx">,a就是標(biāo)簽名。格式:<tag>.nameAttributes標(biāo)簽的屬性,字典形式組織,格式:<tag>.attrsNavigableString標(biāo)簽內(nèi)非屬性字符串,<a></a>中間部分的字符串。格式:<tag>.stringComment標(biāo)簽內(nèi)字符串的注釋部分,<!--...-->中的部分字符串。<ahref=""class="University">TongJi<!--Uni--></a>Tag:返回標(biāo)簽內(nèi)容

創(chuàng)建beautifulsoup對(duì)象soup=BeautifulSoup(html)soup=BeautifulSoup(open('index.html'))print(soup.prettify())獲取標(biāo)簽soup.titlesoup.headsoup.asoup.ptype(soup.a)直接用html文本將本地index.html文件打開(kāi),用之創(chuàng)建soup對(duì)象格式化輸出soup對(duì)象的內(nèi)容利用soup加標(biāo)簽名輕松地獲取標(biāo)簽的內(nèi)容注:它查找的是在所有內(nèi)容中的第一個(gè)符合要求的標(biāo)簽驗(yàn)證對(duì)象的類型:#<class'bs4.element.Tag'>soup.標(biāo)簽名<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>soup.title

soup.head

soup.p

soup.a

注:查找的是在所有內(nèi)容中的第一個(gè)符合要求的標(biāo)簽type(soup.a)soup.p.nameName:標(biāo)簽名字

(字符串類型)獲取標(biāo)簽名字[document]headsoup對(duì)象本身比較特殊,它的name即為[document]內(nèi)部標(biāo)簽,輸出的值即為標(biāo)簽本身的名稱bodyp<tag>.nametagnameattrs<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>

soup.name

[document]屬性(Attributes):說(shuō)明標(biāo)簽特點(diǎn)的區(qū)域獲取標(biāo)簽屬性soup.p.attrssoup.p['class']soup.p.get('class')soup.p['class']="newClass"delsoup.p['class']{'class':['title'],'name':'spider'}p標(biāo)簽的所有屬性;類型:字典['title']單獨(dú)獲取class屬性['title']利用get方法傳入屬性的名稱修改屬性刪除屬性<tag>.attrssoup.attrs空字典

tagnameattrs<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>soup.p.attrs['class']soup.p['class']soup.p.attrssoup.p.get('class')p標(biāo)簽的所有屬性單獨(dú)獲取class屬性利用get方法傳入屬性的名稱soup.p['class']="newC"修改屬性delsoup.p['class']刪除屬性"newC"{'class':['title'],'name':'spider'}內(nèi)容(NavigableString):

標(biāo)簽內(nèi)部字符串獲取標(biāo)簽的內(nèi)容soup.b.stringtype(soup.b.string)soup.a.stringsoup.p.stringsoup.html.string爬蟲(chóng)之信息解析<class'bs4.element.NavigableString'>BeautifulSoup<tag>.string爬蟲(chóng)之信息解析如果tag只有一個(gè)NavigableString類型子節(jié)點(diǎn),那么這個(gè)tag可以使用.string得到子節(jié)點(diǎn)。如果一個(gè)tag僅有一個(gè)子節(jié)點(diǎn),那么這個(gè)tag也可以使用.string方法,輸出結(jié)果與當(dāng)前唯一子節(jié)點(diǎn)的.string結(jié)果相同。Nonetag包含了多個(gè)子節(jié)點(diǎn),tag無(wú)法確定<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>soup.p.stringsoup.a.stringsoup.b.stringsoup.html.stringNone如果一個(gè)tag僅有一個(gè)子節(jié)點(diǎn),那么這個(gè)tag也可以使用.string方法,輸出結(jié)果與當(dāng)前唯一子節(jié)點(diǎn)的.string結(jié)果相同。Comment:

標(biāo)簽內(nèi)字符串的注釋部分獲取注釋<!—注釋-->soup.a.stringtype(soup.a.string)注釋是特殊的NavigableString對(duì)象iftype(soup.a.string)==bs4.element.Comment:print(soup.a.string)BeautifulSoup<class'bs4.element.Comment'>可利用.string來(lái)輸出它的內(nèi)容需通過(guò)類型區(qū)分兩者??梢栽谑褂们白鲆幌屡袛啾闅vhtmlheadtitlebodypbpaap下行遍歷上行遍歷平行遍歷<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<ahref="/bs"class="method"id="link1">BeautifulSoup</a>,<ahref="/re"class="method"id="link2">正則表達(dá)式</a>,

兩種方法各有特點(diǎn)</p><pclass="result">...</p></body></html>基于bs4庫(kù)的html內(nèi)容遍歷遍歷屬性說(shuō)明.contents子節(jié)點(diǎn)的的列表,將所有兒子節(jié)點(diǎn)存入列表.children子節(jié)點(diǎn)的迭代類型,與.contents類似,用于循環(huán)遍歷兒子節(jié)點(diǎn).descendants子孫節(jié)點(diǎn)的迭代類型,包含所有子孫節(jié)點(diǎn),用于循環(huán)遍歷.parent節(jié)點(diǎn)的父親標(biāo)簽.parents節(jié)點(diǎn)的父輩標(biāo)簽,包含父親,爺爺及以上.next_sibling返回按照html文本順序的下一個(gè)平行節(jié)點(diǎn)標(biāo)簽.previous_sibling返回按照html文本順序的上一個(gè)平行節(jié)點(diǎn)標(biāo)簽.next_siblings迭代類型,返回按照html文本順序的后續(xù)所有平行節(jié)點(diǎn)標(biāo)簽.previous_siblings返回按照html文本順序的前序平行節(jié)點(diǎn)標(biāo)簽.contents

.childrencontents屬性將tag的子節(jié)點(diǎn)以列表的方式輸出soup.head.contentssoup.body.contents輸出方式為列表,可以用列表索引來(lái)獲取它的某一個(gè)元素soup.body.contents[1]children返回的不是一個(gè)list,是一個(gè)

list生成器對(duì)象,可以通過(guò)遍歷獲取所有子節(jié)點(diǎn)soup.head.childrenlist(soup.body.children)forchildinsoup.body.children: print(child)[<title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title>]<list_iteratorat0xe713310>屬性直接子節(jié)點(diǎn)<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>soup.head.contentssoup.body.contentssoup.head.contents[0]soup.head.childrensoup.body.contents[1].descendants屬性.descendants屬性可以對(duì)tag的所有子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán)forchildinsoup.body.descendants: print()注意:而.contents

.children

屬性僅包含tag的直接子節(jié)點(diǎn)

所有子孫節(jié)點(diǎn).strings

stripped_strings和string屬性相比,strings獲取多層內(nèi)容,可遍歷獲取forstringinsoup.strings: print(string)輸出的字符串中可能包含了很多空格或空行,使用stripped_strings可以去除多余空白內(nèi)容forstringinsoup.stripped_strings: print(string)屬性

.parent屬性父節(jié)點(diǎn)bodyheadtitle<html><head><title>網(wǎng)絡(luò)爬蟲(chóng)之學(xué)習(xí)</title></head><body><pclass="title"name="spider"><b>爬蟲(chóng)之信息解析</b></p><pclass="method">下面介紹了兩種解析方法<aclass="method"href="/bs"id="link1">BeautifulSoup</a>.parents屬性通過(guò)元素的.parents屬性可以遞歸得到元素的所有父輩節(jié)點(diǎn)forparentinsoup.a.parents: print()forparentinsoup.p.string.parents: print()全部父節(jié)點(diǎn)htmlheadtitlebodypbpaapsoup.a.parentssoup.p.string.parents.next_sibling

.previous_sibling.next_sibling屬性獲取節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn)(同一級(jí)節(jié)點(diǎn)),.previous_sibling則獲取上一個(gè)兄弟節(jié)點(diǎn)。注意:實(shí)際文檔中的tag.next_sibling和.previous_sibling

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論