項目3 簡單靜態(tài)網(wǎng)頁爬取-獲取某企業(yè)官網(wǎng)基本信息_第1頁
項目3 簡單靜態(tài)網(wǎng)頁爬取-獲取某企業(yè)官網(wǎng)基本信息_第2頁
項目3 簡單靜態(tài)網(wǎng)頁爬取-獲取某企業(yè)官網(wǎng)基本信息_第3頁
項目3 簡單靜態(tài)網(wǎng)頁爬取-獲取某企業(yè)官網(wǎng)基本信息_第4頁
項目3 簡單靜態(tài)網(wǎng)頁爬取-獲取某企業(yè)官網(wǎng)基本信息_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

簡單靜態(tài)網(wǎng)頁爬取——

獲取某企業(yè)官網(wǎng)基本信息1解析網(wǎng)頁目錄實現(xiàn)HTTP請求2存儲數(shù)據(jù)3爬蟲的基本功能是讀取URL和爬取網(wǎng)頁內(nèi)容,這就需要爬蟲具備能夠?qū)崿F(xiàn)HTTP請求的功能。請求過程主要包括生成HTTP請求、請求頭處理、超時設(shè)置、請求重試、查看狀態(tài)碼等。通過Chrome開發(fā)者工具直接查看網(wǎng)頁“”的頁面元素、頁面源代碼和資源詳細信息,并分別通過urllib3庫、Requests庫實現(xiàn)向網(wǎng)頁發(fā)送GET類型的HTTP請求,并獲取返回的響應(yīng)。任務(wù)描述使用Chrome開發(fā)者工具查看頁面元素、頁面源代碼和資源詳細信息。使用urllib3庫生成HTTP請求。使用urllib3庫處理請求頭。使用urllib3庫設(shè)置超時時間(timeout)。使用urllib3庫設(shè)置請求重試。使用Requests庫生成HTTP請求。使用Requests庫查看狀態(tài)碼與編碼。使用Requests庫處理請求頭與響應(yīng)頭。使用Requests庫設(shè)置超時時間。任務(wù)分析Chrome瀏覽器提供了一個非常便利的開發(fā)者工具,供廣大Web開發(fā)者使用,該工具提供查看網(wǎng)頁元素、查看請求資源列表、調(diào)試JavaScript代碼等功能。該工具的打開方式是右擊Chrome瀏覽器頁面,在彈出的快捷菜單中單擊下圖所示的“檢查”選項。使用Chrome開發(fā)者工具查看網(wǎng)頁也可以單擊Chrome瀏覽器右上角的菜單,如下圖所示,單擊“更多工具”選項中的“開發(fā)者工具”選項打開開發(fā)者工具,還可以直接使用“F12”鍵、“Ctrl+Shift+I”組合鍵打開開發(fā)者工具。使用Chrome開發(fā)者工具查看網(wǎng)頁Chrome開發(fā)者工具目前包括9個面板,界面如下圖所示,本書使用的Chrome版本為64位108.0.5359.125,各面板的功能如表所示。使用Chrome開發(fā)者工具查看網(wǎng)頁使用Chrome開發(fā)者工具查看網(wǎng)頁面板說明“元素”(Elements)面板該面板可查看渲染頁面所需的HTML、CSS和DOM對象,并可實時編輯這些元素調(diào)試頁面渲染效果“控制臺”(Console)面板該面板可記錄各種警告與錯誤信息,并可作為shell在頁面上與JavaScript代碼交互“源代碼”(Sources)面板該面板可設(shè)置調(diào)試JavaScript代碼的斷點“網(wǎng)絡(luò)”(Network)面板該面板可查看頁面請求、下載的資源文件,以及優(yōu)化網(wǎng)頁加載性能,還可查看HTTP的請求頭、響應(yīng)內(nèi)容等使用Chrome開發(fā)者工具查看網(wǎng)頁“性能”(Performance)面板舊版Chrome中的“時間線”(Timeline)面板,該面板可展示頁面加載時所有事件花費時長的完整分析“內(nèi)存”(Memory)面板舊版Chrome中的“分析”(Profiles)面板,該面板可提供比性能面板更詳細的分析,如跟蹤內(nèi)存泄露等“應(yīng)用”(Application)面板該面板可檢查加載的所有資源“安全”(Security)面板該面板可調(diào)試當前網(wǎng)頁的安全和認證等問題,并確保網(wǎng)站上已正確地實現(xiàn)HTTPS“Lighthouse”面板舊版Chrome中的“審查”(Audits)面板,該面板用于分析網(wǎng)絡(luò)應(yīng)用和網(wǎng)頁,收集現(xiàn)代性能指標并提供對開發(fā)人員最佳實踐的意見續(xù)上表在爬蟲開發(fā)中,“元素”面板主要用于查看頁面元素所對應(yīng)的位置,如圖片所在的位置或文字鏈接所對應(yīng)的位置。從面板左側(cè)可看到,當前頁面的結(jié)構(gòu)為樹狀結(jié)構(gòu),單擊三角形圖標即可展開分支。依次單擊樹狀結(jié)構(gòu)的三角形圖標,依次展開<body>、<header>、<div>、<nav>、<ul>標簽,找到第一個<li>標簽,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁1.“元素”面板使用Chrome開發(fā)者工具查看網(wǎng)頁將鼠標指針懸停在圖3?5所示的<li>標簽上,會同步在網(wǎng)頁中標識出對應(yīng)部分的文字“首頁”,如下圖所示。“源代碼”面板通常用于調(diào)試JavaScript代碼,但對于爬蟲開發(fā)而言,還有一個附帶的功能可以用于查看HTML源代碼。在“源代碼”面板的左側(cè)展示了頁面包含的文件,單擊對應(yīng)文件即可在面板中間查看預(yù)覽,例如在面板左側(cè)選擇HTML文件,將在面板中間展示其完整代碼。切換至“源代碼”面板,單擊左側(cè)的“(索引)”文件,將在面板中間顯示其包含的完整代碼,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁2.“源代碼”面板對于爬蟲開發(fā)而言,“網(wǎng)絡(luò)”面板主要用于查看頁面加載時讀取的各項資源,如圖片、HTML文件、JavaScript文件、頁面樣式等的詳細信息,單擊某個資源便可以查看該資源的詳細信息。切換至“網(wǎng)絡(luò)”面板后,需先重新加載頁面,在“名稱”中單擊“”資源后,則在中間顯示該資源的標頭、預(yù)覽、響應(yīng)、啟動器、時間和Cookie詳情等,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁3.“網(wǎng)絡(luò)”面板使用Chrome開發(fā)者工具查看網(wǎng)頁根據(jù)選擇的資源類型,可顯示不同的信息,可能包括以下標簽信息。(1)“標頭”標簽展示該資源的HTTP頭部信息,主要包括“請求網(wǎng)址”“請求方法”“狀態(tài)代碼”和“遠程地址”等基本信息,以及響應(yīng)標頭、請求標頭等詳細信息,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁(2)“預(yù)覽”標簽可根據(jù)所選擇的資源類型(圖片、文本)來顯示相應(yīng)的預(yù)覽,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁(3)“響應(yīng)”標簽可顯示HTTP響應(yīng)信息,如下圖所示。若選中的“”資源為HTML文件,則將展示HTML代碼。使用Chrome開發(fā)者工具查看網(wǎng)頁(4)“啟動器”標簽可以顯示發(fā)出的請求所在文件,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁(5)“時間”標簽可顯示資源在整個請求過程中各環(huán)節(jié)花費的時間,如下圖所示。使用Chrome開發(fā)者工具查看網(wǎng)頁(6)“Cookie”標簽可顯示資源的HTTP請求和響應(yīng)過程中的Cookie信息,如下圖所示。urllib3是一個功能強大、條理清晰、用于HTTP客戶端的Python庫,其提供了很多Python標準庫里沒有的連接特性,如下表所示。使用urllib3庫實現(xiàn)HTTP請求連接特性連接特性線程安全管理連接池客戶端SSL/TLS驗證使用分部編碼上傳文件協(xié)助處理重復(fù)請求和HTTP重定位支持壓縮編碼支持HTTP和SOCKS代理測試覆蓋率達到100%urllib3庫使用十分方便,用戶可以通過一個PoolManager實例來生成HTTP請求。通過urllib3庫的request()方法即可創(chuàng)建一個請求,該方法可返回一個HTTP響應(yīng)對象。request()方法的基本語法格式如下。生成HTTP請求請求的類型請求類型所帶的參數(shù)請求頭所帶的參數(shù)依據(jù)具體需要及請求的類型可添加的參數(shù)urllib3.request(method,url,fields=None,headers=None,**urlopen_kw)字符串形式的網(wǎng)址向網(wǎng)頁“”發(fā)送GET請求,并查看服務(wù)器狀態(tài)碼和響應(yīng)實體。生成HTTP請求在request()方法中,如果需要傳入headers參數(shù),那么可通過定義一個字典來實現(xiàn),定義一個包含User-Agent信息的字典。請求頭處理字典的值,第一個字符不能為空格ua={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}字典的鍵查找User-Agent信息瀏覽器的User-Agent信息可以在“標頭”標簽下找到。請求頭處理為防止因為網(wǎng)絡(luò)不穩(wěn)定、服務(wù)器不穩(wěn)定等問題造成連接不穩(wěn)定時丟包,可以在request()方法設(shè)置timeout參數(shù),timeout參數(shù)通常為浮點數(shù)。依據(jù)不同需求,request()方法的timeout參數(shù)有多種設(shè)置方法,可直接在url后設(shè)置本次請求的全部timeout參數(shù),也可分別設(shè)置本次請求的連接與讀取的timeout參數(shù),還可在PoolManager實例中設(shè)置timeout參數(shù)(可應(yīng)用至該實例的全部請求中)。分別使用3種方法向網(wǎng)頁“”發(fā)送帶timeout參數(shù)的GET請求,可僅指定超時時間,或分別指定連接和讀取的超時時間。timeout設(shè)置urllib3庫可以通過設(shè)置request()方法的retries參數(shù)來對重試進行控制,默認進行3次請求重試以及3次重定向。自定義重試次數(shù)可通過賦值一個整數(shù)給retries參數(shù)來實現(xiàn),還可通過定義retries實例來定制請求重試次數(shù)及重定向次數(shù)。若需要同時關(guān)閉請求重試及重定向,則可將retries參數(shù)賦值為False;若僅關(guān)閉重定向,則將redirect參數(shù)賦值為False。與timeout設(shè)置類似,可以在PoolManager實例中設(shè)置retries參數(shù)控制該實例下的全部請求重試策略。向網(wǎng)頁“”發(fā)送請求重試次數(shù)為10的GET請求,或發(fā)送請求重試次數(shù)為5與重定向次數(shù)為4的GET請求,或發(fā)送同時關(guān)閉請求重試與重定向的GET請求,或發(fā)送僅關(guān)閉重定向的GET請求,或直接在PoolManager實例中定義請求重試次數(shù)。請求重試設(shè)置向網(wǎng)頁“”發(fā)送一個完整的請求,該請求包含鏈接、User-Agent、超時時間和重試次數(shù)設(shè)置。發(fā)送完整HTTP請求Requests庫是一個原生的HTTP庫,比urllib3庫更容易使用。Requests庫可發(fā)送原生的HTTP/1.1請求,不需要手動為URL添加查詢字符串,也不需要對POST數(shù)據(jù)進行表單編碼。相對于urllib3庫,Requests庫擁有完全自動化的Keep-Alive和HTTP連接池的功能。Requests庫的連接特性如下表所示。使用Requests庫實現(xiàn)HTTP請求連接特性連接特性連接特性Keep-Alive和HTTP連接池基本/摘要式的身份認證文件分塊上傳國際化域名和URL優(yōu)雅的key/valueCookie流下載帶持久Cookie的會話自動解壓連接超時瀏覽器式的SSL認證Unicode響應(yīng)體分塊請求自動內(nèi)容解碼HTTP/HTTPS代理支持支持.netrc使用Requests庫生成請求非常簡便,其中,實現(xiàn)請求的方法為get()方法,其基本語法格式如下。生成請求依據(jù)具體需要及請求的類型可添加的參數(shù),通常參數(shù)賦值為字典或具體數(shù)據(jù)requests.get(url,**kwargs)字符串形式的網(wǎng)址向網(wǎng)頁“”發(fā)送GET請求,并查看返回的結(jié)果類型、狀態(tài)碼、編碼、響應(yīng)頭和網(wǎng)頁內(nèi)容。使用rqg.status_code可查看服務(wù)器返回的狀態(tài)碼。而使用rqg.encoding可通過服務(wù)器返回的HTTP頭部信息來猜測網(wǎng)頁編碼。需要注意的是,當Requests庫猜測錯時,需要手動指定編碼,避免返回的網(wǎng)頁內(nèi)容解析出現(xiàn)亂碼。向網(wǎng)頁“”發(fā)送GET請求,查看返回的狀態(tài)碼和修改后的編碼,并將編碼手動指定為utf-8。rqg表示requests.get(url)返回的對象查看狀態(tài)碼與編程手動指定編碼的方法并不靈活,無法自適應(yīng)爬取過程中不同網(wǎng)頁的編碼,而使用chardet庫的方法比較簡便靈活。chardet庫是一個非常優(yōu)秀的字符串/文件編碼檢測模塊。chardet庫的detect()方法可以檢測給定字符串的編碼,其基本語法格式如下。查看狀態(tài)碼與編程表示需要檢測編碼的字符串chardet.detect(byte_str)detect()方法可返回以下字典,字典中的encoding參數(shù)表示編碼形式,confidence參數(shù)表示檢測精確度,language參數(shù)表示當前字符串中出現(xiàn)的語言類型。查看狀態(tài)碼與編程{'encoding':'utf-8','confidence':0.99,'language':''}將請求的編碼指定為detect()方法檢測到的編碼,可以避免檢測錯誤造成的亂碼。Requests庫中對請求頭的處理與urllib3庫類似,即使用get()方法的headers參數(shù)在GET請求中上傳參數(shù),參數(shù)形式為字典。使用rqg.headers可查看服務(wù)器返回的響應(yīng)頭,通常響應(yīng)頭返回的結(jié)果會與上傳的請求參數(shù)對應(yīng)。定義一個User-Agent字典作為headers參數(shù),向網(wǎng)頁“”發(fā)送帶有該headers參數(shù)的GET請求,并查看返回的響應(yīng)頭。請求頭與響應(yīng)頭處理為避免因等待服務(wù)器響應(yīng)造成程序永久失去響應(yīng),通常需要給程序設(shè)置一個時間作為限制,超過該時間后程序?qū)詣油V沟却?。在Requests庫中通過設(shè)置get()方法的timeout參數(shù),可以實現(xiàn)超過該參數(shù)設(shè)定的秒數(shù)后,程序停止等待。向網(wǎng)頁“”分別發(fā)送超時時間為2s、0.001s的帶有timeout參數(shù)的GET請求,并查看對應(yīng)響應(yīng)。timeout設(shè)置向網(wǎng)頁“”發(fā)送一個完整的請求,該請求包含鏈接、請求頭、超時時間,并且正確設(shè)置編碼。發(fā)送完整HTTP請求1解析網(wǎng)頁目錄實現(xiàn)HTTP請求2存儲數(shù)據(jù)3通過解析網(wǎng)頁可以獲取網(wǎng)頁包含的數(shù)據(jù)信息,如文本、圖片、視頻等,這需要爬蟲具備定位網(wǎng)頁中信息的位置并解析網(wǎng)頁內(nèi)容的功能。本任務(wù)分別通過Xpath、BeautifulSoup庫和正則表達式解析3.1.3小節(jié)中通過Requests庫獲取的網(wǎng)頁“”的網(wǎng)頁內(nèi)容,即獲取其中的元素及相關(guān)信息。任務(wù)描述使用lxml庫的etree模塊實現(xiàn)通過Xpath獲取網(wǎng)頁內(nèi)容中的標題內(nèi)容、節(jié)點下的文本內(nèi)容。使用BeautifulSoup庫創(chuàng)建BeautifulSoup對象,將HTML文檔轉(zhuǎn)換為文檔樹。使用BeautifulSoup庫搜索文檔樹中的文本內(nèi)容、屬性值。使用正則表達式匹配字符串。使用正則表達式查找網(wǎng)頁中的標題內(nèi)容。任務(wù)分析XML路徑語言(XMLPathLanguage,XPath)是一門在XML文檔中查找信息的語言。XPath最初被設(shè)計用于搜尋XML文檔,但同樣適用于HTML文檔的搜索。XPath的選擇功能十分強大,它不僅提供了非常簡潔明了的路徑選擇表達式,還提供了超過100個內(nèi)建函數(shù),用于字符串、數(shù)值、時間的匹配,以及節(jié)點、序列的處理等,幾乎所有定位的節(jié)點都可以用XPath來選擇。使用Xpath解析網(wǎng)頁使用Xpath需要從lxml庫中導(dǎo)入etree模塊,還需要使用HTML類對需要匹配的HTML對象進行初始化。HTML類的基本語法格式如下?;菊Z法選擇的HTML解析器lxml.etree.HTML(text,parser=None,base_url=None)需要轉(zhuǎn)換為HTML格式的字符串文檔的原始URL,用于查找外部實體的相對路徑使用HTML類將網(wǎng)頁內(nèi)容初始化,并輸出初始化后的網(wǎng)頁內(nèi)容。首先調(diào)用HTML類對Requests庫請求回來的網(wǎng)頁進行初始化,這樣就成功構(gòu)造了一個XPath解析對象。若HTML類中的節(jié)點沒有閉合,etree模塊可提供自動補全功能。調(diào)用tostring()方法即可輸出修正后的HTML代碼,但其結(jié)果為bytes類型,需要使用decode()方法將其轉(zhuǎn)成str類型。也可以直接從本地文件中導(dǎo)入HTML文件(保存有網(wǎng)頁內(nèi)容的HTML文件),將其中的內(nèi)容導(dǎo)入并使用HTML類進行初始化,編碼格式設(shè)為utf-8?;菊Z法Xpath可使用類似正則表達式的表達式來匹配HTML文件中的內(nèi)容,常用的表達式如下表。子節(jié)點表示當前節(jié)點的下一層節(jié)點,子孫節(jié)點表示當前節(jié)點的所有下層節(jié)點,父節(jié)點表示當前節(jié)點的上一層節(jié)點?;菊Z法表達式說明nodename選取nodename節(jié)點的所有子節(jié)點/從當前節(jié)點選取直接子節(jié)點//從當前節(jié)點選取所有子孫節(jié)點.選取當前節(jié)點..選取當前節(jié)點的父節(jié)點@選取屬性使用Xpath進行匹配時,可按表達式查找對應(yīng)節(jié)點,并將節(jié)點輸出至一個列表中。使用名稱定位head節(jié)點,分別使用節(jié)點層級、名稱、搜索定位head節(jié)點下的title節(jié)點。直接使用名稱無法定位子孫節(jié)點的title節(jié)點,原因是當前Xpath解析對象html指向網(wǎng)頁中的根節(jié)點html節(jié)點,通過名稱只能定位html節(jié)點的兩個子節(jié)點:head節(jié)點或body節(jié)點?;菊Z法Xpath中的謂語可用于查找某個特定的節(jié)點或包含某個指定值的節(jié)點,謂語被嵌在路徑后的方括號中,常用的謂語表達式如下表。謂語表達式說明/html/body/div[1]選取屬于body子節(jié)點的第一個div節(jié)點/html/body/div[last()]選取屬于body子節(jié)點的最后一個div節(jié)點/html/body/div[last()-1]選取屬于body子節(jié)點的倒數(shù)第二個div節(jié)點/html/body/div[position()<3]選取屬于body子節(jié)點的前兩個div節(jié)點/html/body/div[@id]選取屬于body子節(jié)點的帶有id屬性的div節(jié)點/html/body/div[@id="content"]選取屬于body子節(jié)點的id屬性值為content的div節(jié)點/html/body/div[xx>10.00]選取屬于body子節(jié)點的xx元素值大于10的節(jié)點Xpath中還提供了用于進行模糊搜索的功能函數(shù),有時僅掌握了對象的部分特征,當需要模糊搜索該類對象時,可使用功能函數(shù)來實現(xiàn),常用的功能函數(shù)如表。功能函數(shù)功能函數(shù)示例說明starts-with//div[starts-with(@id,"co")]選取id值以co開頭的div節(jié)點contains//div[contains(@id,"co")]選取id值包含co的div節(jié)點and//div[contains(@id,"co")andcontains(@id,"en")]選取id值包含co和en的div節(jié)點text//div[contains(text(),"first")]選取節(jié)點文本包含first的div節(jié)點使用text功能函數(shù)可以提取某個單獨子節(jié)點下的文本,若需要提取出定位到的子節(jié)點及其子孫節(jié)點下的全部文本,則需要使用string()方法來實現(xiàn)。header節(jié)點下的全部標題文本及對應(yīng)鏈接均位于該節(jié)點的子節(jié)點ul節(jié)點下,使用starts-with函數(shù)定位id值以me開頭的ul節(jié)點,并使用text功能函數(shù)獲取其所有子孫節(jié)點a內(nèi)的文本內(nèi)容,使用@選取href屬性,從而實現(xiàn)提取所有子孫節(jié)點a內(nèi)的鏈接。使用string()方法可以直接獲取ul節(jié)點及其子孫節(jié)點中的所有文本內(nèi)容及對應(yīng)鏈接。提取header節(jié)點下的全部標題文本及對應(yīng)鏈接BeautifulSoup庫介紹BeautifulSoup是一個可以從HTML文件或XML文件中提取數(shù)據(jù)的Python庫。它提供了一些簡單的函數(shù)用于實現(xiàn)導(dǎo)航、搜索、修改分析樹等功能。通過解析文檔,BeautifulSoup庫可為用戶提供需要爬取的數(shù)據(jù),非常簡便,僅需少量代碼即可寫出一個完整的應(yīng)用程序。目前,BeautifulSoup3已經(jīng)停止開發(fā),大部分的爬蟲選擇使用BeautifulSoup4開發(fā)。BeautifulSoup不僅支持Python標準庫中的HTML解析器,還支持一些第三方的解析器。HTML解析器本書主要使用lxmlHTML作為解析器。解析器語法格式優(yōu)點缺點Python標準庫BeautifulSoup(markup,"html.parser")Python的內(nèi)置標準庫;執(zhí)行速度適中;文檔容錯能力強Python2.7.3或3.2.2前的版本的文檔容錯能力弱lxmlHTML解析器BeautifulSoup(markup,"lxml")速度快;文檔容錯能力強需要安裝C語言庫lxmlXML解析器BeautifulSoup(markup,["lxml-xml"])BeautifulSoup(markup,"xml")速度快;唯一支持XML的解析器需要安裝C語言庫html5libBeautifulSoup(markup,"html5lib")最好的容錯性;以瀏覽器的方式解析文檔;生成HTML5格式的文檔速度慢;不依賴外部擴展創(chuàng)建BeautifulSoup對象要使用BeautifulSoup庫解析網(wǎng)頁,首先需要創(chuàng)建BeautifulSoup對象,通過將字符串或HTML文件傳入BeautifulSoup庫的構(gòu)造方法可以創(chuàng)建一個BeautifulSoup對象,使用格式如下。BeautifulSoup("<html>data</html>")#通過字符串創(chuàng)建BeautifulSoup(open("index.html"))#通過HTML文件創(chuàng)建創(chuàng)建BeautifulSoup對象創(chuàng)建的BeautifulSoup對象可通過prettify()方法進行格式化輸出,其基本語法格式如下。BeautifulSoup.prettify(encoding=None,formatter='minimal')表示格式化時使用的編碼表示格式化的模式對象類型BeautifulSoup庫可將HTML文檔轉(zhuǎn)換成一個復(fù)雜的樹狀結(jié)構(gòu),每個節(jié)點都是Python對象,對象類型可以歸納為4種:Tag、NavigableString、BeautifulSoup、Comment。(1)TagTag對象為HTML文檔中的標簽,形如“<title>TheDormouse'sstory</title>”或“<pclass="title"><b>TheDormouse'sstory</b></p>”等HTML標簽,再加上其中包含的內(nèi)容便是BeautifulSoup庫中的Tag對象。通過Tag名稱可以很方便地在文檔樹中獲取需要的Tag對象,但使用Tag名稱查找的方法只能獲取文檔樹中第一個同名的Tag對象,而通過多次調(diào)用可獲取某個Tag對象下的分支Tag對象。通過find_all()方法可以獲取文檔樹中的全部同名Tag對象。對象類型Tag對象有兩個非常重要的屬性:name和attributes。name屬性可通過.name方式來獲取和修改,修改過后的name屬性將會應(yīng)用至BeautifulSoup對象生成的HTML文檔。attributes屬性表示Tag對象標簽中HTML文本的屬性,通過.attrs方式可獲取Tag對象的全部attributes屬性,返回的值為字典,修改或增加屬性的操作方法與字典的相同。對象類型(2)NavigableStringNavigableString對象為包含在Tag對象中的文本字符串內(nèi)容,如“<title>TheDormouse'sstory</title>”中的“TheDormouse'sstory”,可使用.string方式獲取,NavigableString對象無法被編輯,但可以使用replace_with()方法進行替換。對象類型(3)BeautifulSoupBeautifulSoup對象表示的是一個文檔的全部內(nèi)容。大部分時候,可以把它當作Tag對象。由于BeautifulSoup對象并不是真正的HTML文檔或XML文檔的Tag對象,所以并沒有Tag對象的name和attributes屬性,但其包含一個值為“[document]”的特殊name屬性。對象類型(4)CommentTag對象、NavigableString對象、BeautifulSoup對象幾乎覆蓋了HTML文檔和XML文檔中的所有內(nèi)容,但還有一些特殊對象。文檔的注釋部分是最容易與Tag對象中的文本字符串混淆的部分。在BeautifulSoup庫中,將文檔的注釋部分識別為Comment類型。Comment對象是一個特殊類型的NavigableString對象,當其出現(xiàn)在HTML文檔中時,會使用特殊的格式輸出。搜索特定節(jié)點并獲取其中的鏈接及文本

BeautifulSoup庫中定義了很多搜索方法,其中常用的有find()方法和find_all()方法,兩者的參數(shù)一致,區(qū)別為find_all()方法的返回結(jié)果是只包含一個元素的列表,而find()方法返回的是匹配到的第一個元素結(jié)果。此外,比較常用的select()方法的功能與find()方法、find_all()方法的功能一樣,均用于選取特定的標簽,且選取規(guī)則依賴于CSS,因此又被稱為CSS選擇器。搜索特定節(jié)點并獲取其中的鏈接及文本

find_all()方法可用于搜索文檔樹中的Tag對象,非常方便,其基本語法格式如下。find_all()方法BeautifulSoup.find_all(name=None,attrs={},recursive=True,string=None,limit=None,**kwargs)查找所有名字為name的Tag對象查找符合指定條件屬性的Tag對象是否檢索當前Tag對象的所有子孫節(jié)點搜索文檔中匹配傳入的字符串的內(nèi)容是否檢索當前Tag對象的所有子孫節(jié)點若一個指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時會把該參數(shù)當作指定名字的Tag對象的屬性來搜索搜索特定節(jié)點并獲取其中的鏈接及文本使用find_all()方法搜索到指定節(jié)點后,使用get()方法可獲取列表中的節(jié)點所包含的鏈接,而使用get_text()方法可獲取其中的文本內(nèi)容。首先使用find_all()方法定位title節(jié)點,并分別使用string屬性和get_text()方法獲取title節(jié)點內(nèi)的標題文本;然后使用find_all()方法定位header節(jié)點下的ul節(jié)點,并分別使用get()方法、get_text()方法獲取其每個子孫節(jié)點a的鏈接和文本內(nèi)容。find_all()方法搜索特定節(jié)點并獲取其中的鏈接及文本在網(wǎng)頁中使用CSS選擇器時,標簽名不加任何修飾,類名前加.,id名前加#。在Tag對象或BeautifulSoup對象的select()方法中傳入字符串參數(shù),即可使用CSS選擇器的語法找到標簽。select()方法BeautifulSoup.select(selector,namespaces=None,limit=None,**kwargs)一個包含CSS選擇器的字符串將CSS選擇器中使用的命名空間前綴映射到命名空間URIs的字典在找到limit個匹配的結(jié)果后,停止尋找若一個指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時會把該參數(shù)傳輸給soupsieve.select()方法搜索特定節(jié)點并獲取其中的鏈接及文本

select()方法中最常用的參數(shù)為selector,即按照CSS選擇器,傳入目標節(jié)點的選擇器規(guī)則。select()方法可以使用標簽名、類名、id名、組合和屬性值查找標簽。標簽之間使用>連接表示父子關(guān)系;若使用空格連接,表示前輩和后輩關(guān)系。此處介紹更為簡單的獲取屬性的方式,在[]中填入想要獲取的屬性名即可獲取到select結(jié)果列表中元素的屬性值。select()方法小貼士Tag對象內(nèi)只要不含有其他標簽子節(jié)點,這個Tag對象既可以使用string()得到文本,也可以使用text()獲得文本。如果Tag對象包含多個子節(jié)點,那么Tag對象就無法確定string()方法應(yīng)該調(diào)用哪個子節(jié)點的內(nèi)容。獲取標簽中文本信息的兩種方法string()和text()的區(qū)別正則表達式介紹在編寫處理網(wǎng)頁文本的程序時,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需求,而正則表達式正好能滿足這一點。正則表達式(RegularExpression,RE),又稱為正規(guī)表示法或常規(guī)表示法,常用于檢索、替換符合某個模式的文本。其主要思想為,首先設(shè)置一些特殊的字及字符組合,然后通過組合的“規(guī)則字符串”來對表達式進行過濾,從而獲取或匹配需要的特定內(nèi)容。正則表達式具有靈活、邏輯性和功能性非常強的特點,能迅速地通過表達式,從字符串中找到所需信息,但對于剛接觸的人來說,比較晦澀難懂。正則表達式模塊元字符常見符號描述示例literal匹配文本字符串的字面值literalfoore1|re2匹配正則表達式re1或re2foo|bar.匹配任何字符(除了\n之外)b.b^匹配字符串起始部分^Dear$匹配字符串終止部分/bin/*sh$*匹配0次或者多次前面出現(xiàn)的正則表達式[A-Za-z0-9]*正則表達式常見符號及其描述如下表。正則表達式模塊常見符號描述示例+匹配1次或者多次前面出現(xiàn)的正則表達式[a-z]+.com?匹配0次或者1次前面出現(xiàn)的正則表達式goo?{N}匹配N次前面出現(xiàn)的正則表達式[0-9]{3}{M,N}匹配M~N次前面出現(xiàn)的正則表達式[0-9]{5,9}[…]匹配來自字符集的任意單一字符[aeiou]正則表達式模塊常見符號描述示例[..x-y..]匹配x~y范圍中的任意單一字符[0-9],[A-Za-z][^…]不匹配此字符集中出現(xiàn)的任何一個字符,包括某一范圍的字符(如果在此字符集中出現(xiàn))[^aeiou],A-Za-z0-9(*|+|?|{})?用于匹配上面頻繁出現(xiàn)/重復(fù)出現(xiàn)符號的非貪婪版本(*、+、?、{}).*?[a-z](…)匹配封閉的正則表達式,然后另存為子組([0-9]{3})?,f(oo|u)bar正則表達式模塊特殊字符特殊字符描述示例\d匹配任何十進制數(shù)字,與[0-9]一致(\D與\d相反,不匹配任何非數(shù)值型的數(shù)字)data\d+.txt\w匹配任何字母與數(shù)字字符,與[A-Za-z0-9_]相同(\W與之相反)[A-Za-z_]\w+\s匹配任何空白字符,與[\n\t\r\v\f]相同(\S與之相反)of\sthe\b匹配任何單詞邊界(\B與之相反)\bThe\b正則表達式特殊符號及其描述如下表。正則表達式模塊特殊字符特殊字符描述示例\N匹配已保存的子組N(參見表315的符號(…))price:\16\c逐字匹配任何特殊字符c(即僅按照字面意義匹配,不匹配特殊含義).,\,*\A(\Z)匹配字符串的起始(結(jié)束)\ADear正則表達式特殊符號及其描述如下表。正則表達式模塊使用re模塊的步驟為:首先,將正則表達式的字符串編譯為Pattern實例;其次,使用Pattern實例處理文本并獲得匹配結(jié)果(一個Match實例);最后,使用Match實例獲得信息,并進行其他的操作。在re模塊中,常用的方法及其說明如下表。方法名稱方法名稱 compile()將正則表達式的字符串轉(zhuǎn)化為Pattern匹配對象match()將輸入的字符串從頭開始對輸入的正則表達式進行匹配,如果遇到無法匹配的字符或到達字符串末尾,那么立即返回None,否則獲取匹配結(jié)果search()將輸入的整個字符串進行掃描,對輸入的正則表達式進行匹配,并獲取匹配結(jié)果,如果沒有匹配結(jié)果,那么輸出None正則表達式模塊使用re模塊的步驟為:首先,將正則表達式的字符串編譯為Pattern實例;其次,使用Pattern實例處理文本并獲得匹配結(jié)果(一個Match實例);最后,使用Match實例獲得信息,并進行其他的操作。在re模塊中,常用的方法及其說明如下表。方法名稱方法名稱 split()以能夠匹配的字符串作為分隔符,將字符串分割后返回一個列表findall()搜索整個字符串,返回一個包含全部能匹配子串的列表finditer()與findall()方法的作用類似,以迭代器的形式返回結(jié)果sub()使用指定內(nèi)容替換字符串中匹配的每一個子串內(nèi)容正則表達式模塊在re模塊中,使用compile()方法可以將正則表達式的字符串轉(zhuǎn)化為Pattern匹配對象,其基本語法格式如下。需要轉(zhuǎn)換的正則表達式的字符串pile(pattern,flags=0)匹配模式,取值為運算符“|”時表示同時生效compile()方法正則表達式模塊flag參數(shù)的可選值如下表??蛇x值說明re.I忽略大小寫re.M多行模式,改變“^”和“$”的行為re.S將“.”修改為任意匹配模式,改變“.”的行為re.L使預(yù)定字符類\w\W\b\B\s\S,取決于當前區(qū)域設(shè)定re.U使預(yù)定字符類\w\W\b\B\s\S\d\D,取決于Unicode定義的字符屬性re.X詳細模式,該模式下正則表達式可為多行,忽略空白字符并可加入注釋正則表達式模塊search()方法可將輸入的整個字符串進行掃描,并對輸入的正則表達式進行匹配,若無可匹配字符,則將立即返回None,否則獲取匹配結(jié)果。search()方法的基本語法格式如下。search()方法轉(zhuǎn)換后的正則表達式的字符串re.search(pattern,string,flags=0)輸入的需要匹配的字符串匹配模式,取值為運算符“|”時表示同時生效在search()方法中輸入的pattern參數(shù),需要先使用compile()方法將其轉(zhuǎn)換為正則表達式正則表達式模塊findall()方法可搜索整個字符串,并返回一個包含全部能匹配的子串的列表,其基本語法格式如下。findall()方法轉(zhuǎn)換后的正則表達式re.findall(pattern,string,flags=0)輸入的需要匹配的字符串匹配模式,取值為運算符“|”時表示同時生效獲取網(wǎng)頁中的標題內(nèi)容分別使用re模塊中的search()方法和findall()方法查找網(wǎng)頁內(nèi)容中的title內(nèi)容,即獲取網(wǎng)頁中的標題內(nèi)容。1解析網(wǎng)頁目錄實現(xiàn)HTTP請求2存儲數(shù)據(jù)3爬蟲通過解析網(wǎng)頁獲取頁面中的數(shù)據(jù)后,還需要將獲得的數(shù)據(jù)存儲下來以供后續(xù)分析。使用JSON模塊將Xpath獲取的文本內(nèi)容存儲為JSON文件,使用PyMySQL庫將BeautifulSoup庫獲取的標題存儲入MySQL數(shù)據(jù)庫。任務(wù)描述使用JSON模塊將Xpath獲取的文本內(nèi)容存儲為JSON文件。使用PyMySQL庫將BeautifulSoup庫獲取的標題存儲入MySQL數(shù)據(jù)庫。任務(wù)分析將數(shù)據(jù)存儲為JSON文件JSON文件的操作在Python中分為解碼和編碼兩種,都通過JSON模塊來實現(xiàn)。其中,編碼過程為將Python對象轉(zhuǎn)換為JSON對象的過程,而解碼過程則相反,其將JSON對象轉(zhuǎn)換為Python對象。將數(shù)據(jù)存儲為JSON文件的過程為一個編碼過程,編碼過程常用到dump函數(shù)和dumps函數(shù)。兩者的區(qū)別在于,dump函數(shù)將Python對象轉(zhuǎn)換為JSON對象,并通過fp文件流將JSON對象寫入文件內(nèi),而dumps函數(shù)則生成一個字符串。將數(shù)據(jù)存儲為JSON文件dump函數(shù)和dumps函數(shù)的基本語法格式如下。json.dump(obj,fp,*,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=False,**kw)json.dumps(obj,*,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=False,**kw)將數(shù)據(jù)存儲為JSON文件dump函數(shù)和dumps函數(shù)的常用參數(shù)及其說明。參數(shù)名稱說明skipkeys如果skipkeys為True,那么那些不是基本對象(包括str、int、float、bool、None)的字典的鍵會被跳過;否則將引發(fā)TypeError。默認為Falseensure_ascii如果ensure_ascii為True,那么輸出時保證將所有輸入的非ASCII字符轉(zhuǎn)義。如果ensure_ascii為False,那么輸入的非ASCII字符會原樣輸出。默認為Truecheck_circular如果check_circular為False,那么將跳過容器類型的循環(huán)引用檢查,循環(huán)引用將引發(fā)OverflowError(或更多錯誤)。默認為Trueallow_nan如果allow_nan為False,那么在對嚴格JSON規(guī)格范圍外的float類型值(nan、inf和-inf)進行序列化時會引發(fā)ValueError。如果allow_nan為True,那么使用它們的JavaScript等價形式(NaN、Infinity和-Infinity)。默認為True將數(shù)據(jù)存儲為JSON文件dump函數(shù)和dumps函數(shù)的常用參數(shù)及其說明。參數(shù)名稱說明indent如果indent為一個非負整數(shù)或字符串,那么JSON數(shù)組元素和對象成員會被美化輸出為該值指定的縮進等級。若縮進等級為0、負數(shù)或"",則只會添加換行符。默認選擇最緊湊的表達。使用一個正整數(shù)會讓每一層縮進同樣數(shù)量的空格。如果indent是一個字符串(如"\t"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論