智能計算平臺應用開發(初級)-人工智能示教編程-爬蟲流程_第1頁
智能計算平臺應用開發(初級)-人工智能示教編程-爬蟲流程_第2頁
智能計算平臺應用開發(初級)-人工智能示教編程-爬蟲流程_第3頁
智能計算平臺應用開發(初級)-人工智能示教編程-爬蟲流程_第4頁
智能計算平臺應用開發(初級)-人工智能示教編程-爬蟲流程_第5頁
已閱讀5頁,還剩77頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章人工智能示教編程爬蟲簡介爬蟲流程爬蟲框架網絡爬蟲工作時,會首先根據種子網頁的URL,形成初始的待爬取的URL集合,然后依次讀取并從互聯網上下載、保存、分析和獲取該網頁中新的URL鏈接。簡單來說,網絡爬蟲需要先獲取網頁,再從網頁的數據中提取想要的數據,并存儲數據。爬蟲流程對于新的URL,根據深度、寬度和最佳優先等不同策略,將其放入待爬取的URL集合中。如果是基于相似度的最佳定向策略,還需要考慮相似度的衡量。對于已經處理完畢的網頁,將其內容存入數據庫作為鏡像緩存,并將URL地址放入已爬取的集合,以免重復。網址分析URLURL是統一資源定位符,即通常所說的網址,URL是對可以從互聯網上得到的資源位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址?;ヂ摼W上的每個文件都有唯一的URL,URL包含的信息指出文件的位置以及瀏覽器應該怎么處理它。。網絡爬蟲根據URL來獲取網頁信息,因此,URL是爬蟲獲取數據的基本依據。URL的格式由以下3個部分組成。網址分析協議也被稱為服務方式;目前主流的協議有HTTP和HTTPS協議。主機名和端口號為可選參數;一般網站默認端口號為80,如中國醫科大學的主機名是。主機資源的具體地址如目錄和文件名等。客戶端由客戶端向服務器發起請求服務器服務器收到請求后再向客戶端發送響應,響應中的狀態碼將顯示此次通信的狀態。客戶端與服務器間通過HTTP通信請求與響應不同的類型請求與響應通過頭字段實現。HTTP響應過程請求與響應HTTP客戶端HTTP客戶端會向服務器發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器HTTP服務器從該端口監聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態,如“HTTP/1.1200OK”,以及響應的內容,如請求的文件、錯誤消息或其他信息。在HTTP/1.1協議中共定義8種方法(也叫“動作”)來以不同方式操作指定的資源。請求與響應請求方法方法描述GET請求指定的頁面信息,并返回實體主體。GET方法可能會被網絡爬蟲等隨意訪問,因此GET方法應該只用于讀取數據,而不應當被用在產生“副作用”的操作中,如WebApplication等會改變狀態的操作HEAD與GET方法一樣,都是向服務器發出指定資源的請求,只不過服務器將不傳回具體的內容。使用這個方法可以在不必傳輸全部內容的情況下,獲取該資源的相關信息(元信息或稱元數據)POST向指定資源提交數據,請求服務器進行處理(如提交表單或者上傳文件)。數據會被包含在請求中,這個請求可能會創建新的資源或修改現有資源,或兩者皆有PUT從客戶端上傳指定資源的最新內容,即更新服務器端的指定資源DELETE請求服務器刪除標識的指定資源TRACE回顯服務器收到的請求,主要用于測試或診斷OPTIONS允許客戶端查看服務器端上指定資源所支持的所有HTTP請求方法。用“*”來代替資源名稱,向服務器發送OPTIONS請求,可以測試服務器功能是否正常CONNECTHTTP/1.1中預留給能夠將連接改為管道方式的代理服務器HTTP請求方法的名稱是區分大小寫請求與響應當某個請求所指定的資源不支持對應的請求方法時,服務器會返回狀態碼405(MethodNotAllowed)。當服務器不認識或者不支持對應的請求方法時,會返回狀態碼501(NotImplemented)。請求與響應HTTP服務器一般情況下,HTTP服務器至少需要實現GET和HEAD方法,其他方法為可選項。所有方法支持的實現都應當匹配方法各自的語法格式。除上述方法外,特定的HTTP服務器還能夠擴展自定義的方法。請求與響應HTTP采用請求/響應模型客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議版本、響應狀態、服務器信息、響應頭部和響應數據。請求與響應客戶端與服務器間的請求與響應的具體步驟連接Web服務器發送HTTP請求服務器接收請求并返回HTTP響應釋放TCP連接客戶端解析HTML內容請求與響應連接Web服務器由一個HTTP客戶端,通常為瀏覽器,發起連接。與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。發送HTTP請求客戶端經TCP套接字向Web服務器發送一個文本格式的請求報文.一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。服務器接收請求并返回HTTP響應Web服務器解析請求,定位該次的請求資源,之后將資源副本寫進TCP套接字,由客戶端進行讀取。一個響應與一個請求對應,響應報文由狀態行、響應頭部、空行和響應數據4部分組成。請求與響應釋放TCP連接若本次連接的Connection模式為Close,則由服務器主動關閉TCP連接,客戶端將被動關閉連接,釋放TCP連接;若Connection模式為Keep-Alive,則該連接會保持一段時間,在該時間內可以繼續接收請求與回傳響應??蛻舳私馕鯤TML內容客戶端首先會對狀態行進行解析,查看狀態代碼是否能表明該次請求是成功的。之后解析每一個響應頭,響應頭告知以下內容為若干字節的HTML文檔和文檔的字符集。最后由客戶端讀取響應數據HTML,根據HTML的語法對其進行格式化,并在窗口中對其進行顯示。可以使用urllib庫的request模塊下的urlopen函數打開URL。urlopen函數常用的參數及其說明請求與響應——urllib參數名稱參數說明url統一資源定位地址,可以是一個字符串或一個Request對象datadata是指定要發送到服務器的其他數據的對象,如果不需要這些數據,則值為Nonetimeout超時參數為阻塞操作(如連接嘗試),指定超時(以秒為單位),如果未指定,將使用全局默認超時設置。超時參數只適用于HTTP、HTTPS和FTP連接Request是urllib庫的request模塊常用的類,Request類是URL請求的抽象。Request類常用參數及其說明請求與響應——urllib參數名稱參數說明url包含有效URL的字符串data指定要發送到服務器的其他數據的對象,如果不需要數據,則值為None。當前,HTTP請求是唯一使用數據的請求。支持的對象類型包括字節、類似文件的對象和類似字節對象的可迭代對象headerheader是一個字典,被當作add_header()被調用,每個鍵和值作為參數。通常用于“欺騙”服務器,該參數的值表示用戶代理頭文件的值,該值由瀏覽器用于標識自身—一些HTTP服務器只允許來自普通瀏覽器的請求,而不允許來自腳本origin_req_host原始事務的請求主機,默認為http.cookiejar.request_host(self),是用戶發起的原始請求的主機名或IP地址Requests庫所有的功能可以通過7個方法訪問,這7個方法都會返回一個Response對象的實例。請求與響應——Requests方法說明request用于構造和發送請求head用于發送HEAD請求get發送GET請求post發送POST請求put發送PUT請求patch發送PATCH請求delete發送DELETE請求Requests庫的Request類和Response類請求與響應——RequestsRequest類用于準備發送到服務器的PreparedRequest,是用戶創建的Request對象。Response類是響應對象,包含服務器對HTTP請求的響應。Response類的主要屬性及其說明請求與響應——Requests屬性名稱說明status_code響應的HTTP狀態的整數代碼,如404或200headers不區分大小寫的響應標題字典cookies服務器返回的Cookie的CookieJarurl響應的最終URL位置historyResponse請求歷史記錄中的對象列表。任何重定向響應都將在此結束。列表從最早的請求到最新的請求進行排序content響應的內容,以字節為單位text響應的內容,以unicode表示。響應內容的編碼僅根據HTTP頭確定請求與響應——urllib3使用urllib3庫發出請求與接收響應使用urllib3庫發出請求時,需要先實例化一個PoolManager對象,PoolManager對象處理了所有連接池和線性安全的細節??梢岳肞roxyManager進行請求代理操作。urllib3庫使用request方法發送一個請求。HTTP響應對象提供status、data和headers等屬性。返回的JSON格式數據可以通過JSON模塊加載為字典數據類型。響應返回的數據都是字節類型,對于大量的數據可以通過stream來處理,也可以j將其當作一個文件對象來處理。網頁解析網頁解析通過解析網頁可以從網頁獲取包含的信息,如文本、圖片、視頻等,這需要爬蟲具備定位網頁中信息的位置并解析網頁內容的功能??赏ㄟ^Chrome開發者工具直接查看網站的頁面元素、頁面源碼和資源詳細信息,分別通過正則表達式、XPath及BeautifulSoup解析網頁的內容,獲取其中的元素及相關信息。Chrome瀏覽器提供了一個非常便利的開發者工具,供廣大開發者使用,該工具可提供查看網頁元素、查看請求資源列表、調試JS等功能。網頁解析——使用Chrome開發者工作查看網頁打開開發者工具可以通過右鍵單擊Chrome瀏覽器頁面,在彈出的菜單中單擊的“檢查”選項來打開該工具。也可以通過單擊Chrome瀏覽器右上角的

按鈕,單擊“更多工具”選項中的“開發者工具”選項,也可以使用“F12”鍵或“Ctrl+Shift+I”組合鍵來打開開發者工具。網頁解析——使用Chrome開發者工作查看網頁Chrome開發者工具界面包括9個面板本書使用的Chrome版本為64位69.0.3497.100Chrome開發者工具面板的功能對于爬蟲開發來說,常用的面板為元素面板、源代碼面板及網絡面板。網頁解析——使用Chrome開發者工作查看網頁面板說明元素面板(Elements)該面板可查看渲染頁面所需的HTML、CSS和DOM(DocumentObjectModel)對象,并可實時編輯這些元素調試頁面渲染效果控制臺面板(Console)該面板可記錄各種警告與錯誤信息,并可作為shell在頁面上與JavaScript交互源代碼面板(Sources)該面板可設置調試JavaScript的斷點網絡面板(Network)該面板可查看頁面請求、下載的資源文件,以及優化網頁加載性能。還可查看HTTP的請求頭、響應內容等性能面板(Performance)原舊版Chrome中的時間線面板(Timeline),該頁面可展示頁面加載時所有事件花費時長的完整分析內存面板(Memory)原舊版Chrome中的分析面板(Profiles),可提供比性能面板更詳細的分析,如跟蹤內存泄漏等應用面板(Application)原舊版Chrome中的資源面板(Sources),該面板可檢查加載的所有資源安全面板(Security)該面板可調試當前網頁的安全和認證等問題,并確保網站上已正確地實現HTTPS審查面板(Audits)該面板可對當前網頁的網絡利用情況、網頁性能方面進行診斷,并給出優化建議網頁解析——使用Chrome開發者工作查看網頁元素面板查看頁面元素所對應的位置,如圖片所在的位置或文字鏈接所對應的位置。元素面板左側可看到,當前頁面的結構為樹狀結構,單擊三角符號即可展開分支。源代碼面板通常用來調試JS代碼;但對于爬蟲開發而言,還有一個附帶的功能可以查看HTML源碼。網頁解析——使用Chrome開發者工作查看網頁網頁解析——使用Chrome開發者工作查看網頁源代碼面板左側展示了頁面包含的文件,在左側選擇HTML文件,將在面板中間展示其完整代碼。網絡面板對于爬蟲開發而言,網絡面板主要用于查看頁面加載時讀取的各項資源,如圖片、HTML、JS、頁面樣式等的詳細信息。通過單擊某個資源便可以查看該資源的詳細信息。網頁解析——使用Chrome開發者工作查看網頁網頁解析——使用Chrome開發者工作查看網頁切至網絡面板(Network),重新加載頁面后,在資源文件名中單擊“sklearn.svm.OneClassSVM.html”資源,在中間將顯示該資源的頭部信息、預覽、響應信息、花費時間詳情和Cookies。網頁解析——使用Chrome開發者工作查看網頁Headers標簽頁展示該資源的HTTP頭部信息,主要包括RequestURL、RequestMethod、StatusCode、RemoteAddress等基本信息,以及ResponseHeaders、RequestHeaders等詳細消息。網頁解析——使用Chrome開發者工作查看網頁Preview標簽頁可根據所選擇的資源類型(JSON、圖片、文本)來顯示相應的預覽。網頁解析——使用Chrome開發者工作查看網頁Response標簽頁可顯示HTTP的響應信息,選中的“index.html”文件為HTML文件,則將展示HTML代碼。網頁解析——使用Chrome開發者工作查看網頁Cookies標簽頁可顯示資源的HTTP請求和響應過程中的Cookie信息。網頁解析——使用Chrome開發者工作查看網頁Timing標簽頁可顯示資源在整個請求過程中各部分花費的時間。網頁解析——使用正則表達式解析網頁在編寫處理網頁文本的程序時,經常會有查找符合某些復雜規則的字符串的需求,而正則表達式正好能滿足這一點。正則表達式(RegularExpression)簡稱Regex或RE,又稱為正規表示法或常規表示法,常常用于檢索、替換符合某個模式的文本。主要思想為:先設置一些特殊的字及字符組合,再通過組合的“規則字符串”來對表達式進行過濾,從而獲取或匹配需要的特定內容。正則表達式具有靈活、邏輯性和功能性非常強的特點,能迅速地通過表達式從字符串中找到所需信息的優點,但對于剛接觸的人來說,比較晦澀難懂。網頁解析——使用正則表達式解析網頁正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的內容或者所有這些組件的任意組合。正則表達式的特殊字符使用正則表達式匹配一些有特殊含義的字符時,必須先使字符轉義。網頁解析——使用正則表達式解析網頁字符描述$匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multiline屬性,則“$”也匹配“\n”或“\r”。要匹配“$”字符本身,需要使用“\$”()標記一個子表達式的開始和結束位置。可以獲取子表達式供以后使用。要匹配“(”和“)”字符,請使用“\(”和“\)”*匹配前面的子表達式零次或多次。要匹配“*”字符,請使用“\*”+匹配前面的子表達式一次或多次。要匹配“+”字符,請使用“\+”.匹配除換行符“\n”之外的任何單字符。要匹配“.”,請使用“\.”[標記一個中括號表達式的開始。要匹配“[”,請使用“\[”?匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配“?”字符,請使用“\?”\將下一個字符標記為特殊字符、原義字符、向后引用、八進制轉義符。例如,“n”匹配字符“n”?!癨n”匹配換行符。序列“\\”匹配“\”,而“\(”則匹配“(”^匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配“^”字符本身,請使用“\^”{標記限定符表達式的開始。要匹配“{”,請使用“\{”|指明兩項之間的一個選擇。要匹配“|”,請使用“\|”正則表達式中的特殊字符及說明網頁解析——使用正則表達式解析網頁字符描述*匹配前面的子表達式零次或多次。例如,“zo*”能匹配“z”以及“zoo”。“*”等價于{0,}+匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”?!?”等價于{1,}?匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”“does”中的“does”或者“doxy”中的“do”?!?”等價于{0,1}{n}n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個“o”{n,}n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有“o”。“o{1,}”等價于“o+”?!皁{0,}”則等價于“o*”{n,m}m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。正則表達式的限定字符限定符用來指定正則表達式的一個給定組件必須要出現多少次才滿足匹配。網頁解析——使用正則表達式解析網頁正則表達式的定位符定位符能夠將正則表達式固定到行首或行尾,用來描述字符串或單詞的邊界。不能將限定符與定位符一起使用。若要匹配一行文本開始處的文本,需要在正則表達式的開始使用“^”字符。網頁解析——使用正則表達式解析網頁字符描述^匹配輸入字符串開始的位置。如果設置了RegExp對象的Multiline屬性,“^”還會與“\n”或“\r”之后的位置匹配$匹配輸入字符串結尾的位置。如果設置了RegExp對象的Multiline屬性,“$”還會與“\n”或“\r”之前的位置匹配\b匹配一個單詞邊界,即字與空格間的位置\B非單詞邊界匹配正則表達式的定位符及說明網頁解析——使用正則表達式解析網頁正則表達式運算符的優先級順序正則表達式從左到右進行計算,并遵循優先級順序,這與算術表達式非常類似。相同優先級的從左到右進行運算,不同優先級的運算先高后低。運算符描述\轉義符(),(?:),(?=),[]圓括號和方括號*,+,?,{n},{n,},{n,m}限定符^,$,\任何元字符、任何字符定位點和序列(即:位置和順序)|替換,“或”操作,字符具有高于替換運算符的優先級,使得“m|food”匹配“m”或“food”按上到下的排序說明了各種正則表達式運算符的從最高到最低的優先級順序。網頁解析——使用正則表達式解析網頁先將正則表達式的字符串形式編譯為Pattern實例使用Pattern實例處理文本獲得匹配結果,即一個Match實例使用Match實例獲得信息,進行其他的操作。re模塊Python通過自帶的re模塊提供了對正則表達式的支持。使用re模塊的步驟網頁解析——使用正則表達式解析網頁方法名稱說明compile將正則表達式的字符串轉化為Pattern匹配對象match將輸入的字符串從頭開始對輸入的正則表達式進行匹配,如果遇到無法匹配的字符或到達字符串末尾,則立即返回None,否則獲取匹配結果search將輸入的整個字符串進行掃描,對輸入的正則表達式進行匹配,并獲取匹配結果,如果沒有匹配結果,則輸出Nonesplit以能夠匹配的字符串作為分隔符,將字符串分割后返回一個列表findall搜索整個字符串,返回一個包含全部能匹配子串的列表finditer與findall方法的作用類似,以迭代器的形式返回結果sub使用指定內容替換字符串中匹配的每一個子串內容re模塊中常用的方法及其說明網頁解析——使用正則表達式解析網頁compile方法常用的參數及其說明參數名稱說明pattern接收str。表示需要轉換的正則表達式的字符串。無默認值flags接收str。表示匹配模式,取值為運算符“|”時表示同時生效,如re.I|re.M。默認為0flags參數的可選值可選值說明re.I忽略大小寫re.M多行模式,改變“^”和“$”的行為re.S將“.”修改為任意匹配模式,改變“.”的行為re.L表示特殊字符集“\w,\W,\b,\B,\s,\S”,取決于當前區域設定re.U表示特殊字符集“\w,\W,\b,\B,\d,\D,\s,\S”,取決于unicode定義的字符屬性re.X詳細模式,該模式下正則表達式可為多行,忽略空白字符并可加入注釋網頁解析——使用正則表達式解析網頁search方法常用的參數及其說明參數名稱說明pattern接收Pattern實例。表示轉換后的正則表達式。無默認值string接收str。表示輸入的需要匹配的字符串。無默認值flags接收str。表示匹配模式,取值為運算符“|”時表示同時生效,如re.I|re.M。默認為0search方法中輸入的pattern參數需要使用compile方法先轉換為正則表達式的字符串。網頁解析——使用正則表達式解析網頁findall方法常用的參數及其說明參數名稱說明pattern接收Pattern實例。表示轉換后的正則表達式。無默認值string接收str。表示輸入的需要匹配的字符串。無默認值flags接收str。表示匹配模式,取值為運算符“|”時表示同時生效,如re.I|re.M。默認為0使用正則表達式無法很好地定位特定節點并獲取其中的鏈接和文本內容,而使用XPath和BeautifulSoup能較為便利地實現這個功能。網頁解析——使用XPath解析網頁XML路徑語言(XMLPathLanguage,XPath)一門在XML文檔中查找信息的語言。XPath最初被設計用來搜尋XML文檔,但是同樣適用于HTML文檔的搜索。XPath的選擇功能十分強大,它提供了非常簡潔明了的路徑選擇表達式,還提供了超過100個內建函數,用于字符串、數值、時間的匹配,以及節點、序列的處理等,幾乎所有定位的節點都可以用XPath來選擇。使用XPath需要從lxml庫中導入etree模塊,還需要使用HTML類對需要匹配的HTML對象進行初始化。HTML類的常用參數及其說明網頁解析——使用XPath解析網頁參數名稱說明text接收str。表示需要轉換為HTML的字符串。無默認值parser接收str。表示選擇的HTML解析器。無默認值base_url接收str。表示文檔的原始URL,用于查找外部實體的相對路徑。默認為None使用HTML類將網頁內容初始化,首先需要調用HTML類對Requests庫請求回來的網頁進行初始化,這樣就成功構造了一個XPath解析對象。若HTML中的節點沒有閉合,etree模塊也可提供自動補全功能。網頁解析——使用XPath解析網頁調用tostring方法即可輸出修正后的HTML代碼,但是結果為bytes類型,需要使用decode方法將其轉成str類型。也可以直接從本地文件中導入HTML文件,調用保存有網頁內容的HTML文件,將其中的內容導入并使用HTML類進行初始化,編碼格式設為utf-8。etree模塊常用函數網頁解析——使用XPath解析網頁函數名稱說明fromstring將string解析為Element或者ElementTreeparse將文件或者是file_like對象解析為ElementTree(非Element對象),因為parse一般解析整篇文檔,字符串解析函數一般只解析片段。其中file還可以是HTTP/FTPURL,也就是說,file應該是一個Bytes流XML/HTML行為比較像fromstring,比較直接地對XML和HTML文檔進行特定解析,可以修改解析器parser參數。其中parser可以由相應的XMLParser/HTMLParser函數生成,可設置項有很多不僅限于encoding、recover、remove_blank_text、remove_commentstostring將一個Element或者ElementTree轉換為string形式。這里面有幾個可選參數:pretty_print表示是否格式化提高可讀性,method選擇輸出后的文檔格式,不同的選擇,做的修改也不相同,可選參數有xml、html、text、c14n(規范化xml);encoding表示輸出的字符串編碼格式,在無XML文檔聲明情況下默認是ASCⅡ,可通過encoding進行修改,但是如果所改編碼不是utf-8兼容,那么將會啟用默認聲明XPath常用的表達式使用類似正則的表達式來匹配HTML文件中的內容。網頁解析——使用XPath解析網頁表達式說明nodename選取nodename節點的所有子節點/從當前節點選取直接子節點//從當前節點選取所有子孫節點.選取當前節點..選取當前節點的父節點@選取屬性使用XPath方法進行匹配時,可按表達式查找對應位置,并輸出至一個列表內。使用名稱定位head節點,分別使用層級結構、名稱定位head節點下的title節點。直接使用名稱無法定位子孫節點的title節點,因為名稱只能定位子節點的head節點或body節點。網頁解析——使用XPath解析網頁子節點子節點表示當前節點的下一層節點。子孫節點子孫節點表示當前節點的所有下層節點。父節點父節點表示當前節點的上一層節點。XPath通配符可以選取未知的XML元素。網頁解析——使用XPath解析網頁通配符描述*匹配任何元素@*匹配任何屬性node()匹配任何類型XPath運算符網頁解析——使用XPath解析網頁運算符描述|計算兩個節點集+加法-減法*乘法div除法=等于!=不等于<

小于<=小于或等于>

大于>=大于或等于or或and與mod計算除法的余數網頁解析——使用XPath解析網頁XPath謂語可用來查找某個特定的節點或包含某個指定的值的節點,謂語被嵌在路徑后的方括號中。使用謂語時,將表達式加入XPath的路徑中即可。XPath謂語常用的表達式表達式說明/html/body/div[1]選取屬于body子節點的第一個div節點/html/body/div[last()]選取屬于body子節點的最后一個div節點/html/body/div[last()-1]選取屬于body子節點的倒數第二個div節點/html/body/div[position()<3]選取屬于body子節點的前兩個div節點/html/body/div[@id]選取屬于body子節點的帶有id屬性的div節點/html/body/div[@id="content"]選取屬于body子節點的id屬性值為content的div節點/html/body/div[xx>10.00]選取屬于body子節點的xx元素值大于10的節點網頁解析——使用XPath解析網頁XPath功能函數有時僅掌握了對象的部分特征,當需要模糊搜索該類對象時,可使用功能函數來實現。功能函數示例說明starts-with//div[starts-with(@id,"co")]選取id值以co開頭的div節點contains//div[contains(@id,"co")]選取id值包含co的div節點and//div[contains(@id,"co")andcontains(@id,"en")]選取id值包含co和en的div節點text//li[contains(text(),"first")]選取節點文本包含first的li節點text函數用于提取文本內容定位title節點可以獲取title節點內的文本內容,使用text函數可以提取某個單獨子節點下的文本。若想提取出定位到的子節點及其子孫節點下的全部文本,則需要使用string方法來實現。網頁解析——使用BeautifulSoup庫解析網頁BeautifulSoup庫BeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫。它提供了一些簡單的函數用來處理導航、搜索、修改分析樹等功能。通過解析文檔,BeautifulSoup庫可為用戶提供需要抓取的數據,非常簡便,僅需少量代碼就可以寫出一個完整的應用程序。目前,BeautifulSoup3已經停止開發,大部分的爬蟲選擇使用BeautifulSoup4開發。網頁解析——使用BeautifulSoup庫解析網頁BeautifulSoup不僅支持Python標準庫中的HTML解析器,還支持一些第三方的解析器。BeautifulSoup支持的HTML解析器解析器語法格式優點缺點Python標準庫BeautifulSoup(markup,"html.parser")Python的內置標準庫;執行速度適中;文檔容錯能力強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格式的文檔;不依賴外部擴展速度慢創建BeautifulSoup對象使用BeautifulSoup庫解析網頁,首先需要創建BeautifulSoup對象,通過將字符串或HTML文件傳入BeautifulSoup庫的構造方法可以創建一個BeautifulSoup對象。生成的BeautifulSoup對象可通過prettify方法進行格式化輸出。prettify方法常用的參數及其說明網頁解析——使用BeautifulSoup庫解析網頁參數名稱說明encoding接收str。表示格式化時使用的編碼。默認為Noneformatter接收str。表示格式化的模式。默認為minimal,表示按最簡化的格式化方法將字符串處理成有效的HTML∕XML對象類型BeautifulSoup庫可將HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象。網頁解析——使用BeautifulSoup庫解析網頁(4種)對象類型Tag對象NavigableString對象BeautifulSoup對象Comment對象網頁解析——使用BeautifulSoup庫解析網頁Tag對象Tag對象為HTML文檔中的標簽,形如“<title>TheDormouse'sstory</title>”或“<pclass="title"><b>TheDormouse'sstory</b></p>”等HTML標簽,再加上其中包含的內容便是BeautifulSoup庫中的Tag對象。通過Tag名稱可以很方便地在文檔樹中獲取需要的Tag對象,使用Tag名稱查找的方法只能獲取文檔樹中第一個同名的Tag對象,而通過多次調用可獲取某個Tag對象下的分支Tag對象。通過find_all方法可以獲取文檔樹中的全部同名Tag對象。Tag對象有兩個非常重要的屬性:name和attributes。網頁解析——使用BeautifulSoup庫解析網頁name屬性可通過name方法來獲取和修改,修改過后的name屬性將會應用至BeautifulSoup對象生成的HTML文檔。attributes屬性表示Tag對象標簽中HTML文本的屬性,通過attrs屬性可獲取Tag對象的全部attributes屬性,返回的值為字典,修改或增加等操作方法與字典相同。網頁解析——使用BeautifulSoup庫解析網頁NavigableString對象NavigableString對象為包含在Tag對象中的文本字符串內容,如“<title>TheDormouse‘sstory</title>”中的“TheDormouse’sstory”,可使用string的方法獲取。NavigableString對象無法被編輯,但可以使用replace_with的方法進行替換。網頁解析——使用BeautifulSoup庫解析網頁BeautifulSoup對象BeautifulSoup對象表示的是一個文檔的全部內容。大部分時候,可以把它當作Tag對象。BeautifulSoup對象并不是真正的HTML或XML的Tag對象,所以并沒有Tag對象的name和attributes屬性,但其包含了一個值為“[document]”的特殊name屬性。Tag對象、NavigableString對象、BeautifulSoup對象幾乎覆蓋了HTML和XML中的所有內容,但是還有一些特殊對象。文檔的注釋部分是最容易與Tag對象中的文本字符串混淆的部分。網頁解析——使用BeautifulSoup庫解析網頁Comment對象在BeautifulSoup庫中,將文檔的注釋部分識別為Comment類型,Comment對象是一個特殊類型的NavigableString對象。但是當Comment對象出現在HTML文檔中時,Comment對象會使用特殊的格式輸出,需調用prettify函數獲取節點的Comment對象并輸出內容。搜索特定節點并獲取其中的鏈接及文本BeautifulSoup庫中定義了很多搜索方法,其中常用的有find方法和find_all方法,兩者的參數一致。網頁解析——使用BeautifulSoup庫解析網頁find_all方法的返回結果是只包含一個元素的列表。find_all方法可用于搜索文檔樹中的Tag對象,非常方便。find方法返回的直接是結果。find_all方法常用的參數及其說明網頁解析——使用BeautifulSoup庫解析網頁參數名稱說明name接收str。表示查找所有名字為name的Tag對象,字符串對象會被自動忽略掉,搜索name參數的值時可以使用任一類型的過濾器,如字符串、正則表達式、列表、方法或True。默認值為Noneattrs接收str。表示查找符合CSS類名的Tag對象,使用class做參數會導致語法錯誤,從BeautifulSoup庫的4.1.1版本開始,可以通過class參數搜索有指定CSS類名的Tag對象。默認為空recursive接收Built-in。表示是否檢索當前Tag對象的所有子孫節點。默認為True,若只想搜索Tag對象的直接子節點,可將該參數設為Falsestring接收str。表示搜索文檔中能夠匹配傳入的字符串的內容,與name參數的可選值一樣,string參數也接收多種過濾器。無默認值**kwargs若一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數當作指定名字的Tag對象的屬性來搜索find_all方法可通過多種方法遍歷搜索文檔樹中符合條件的所有子節點。網頁解析——使用BeautifulSoup庫解析網頁可通過name參數搜索同名的全部子節點,并接收多種過濾器。按照CSS類名可模糊匹配或完全匹配。完全匹配class的值時,如果CSS類名的順序與實際不符,將搜索不到結果。若Tag對象的class屬性是多值屬性,可以分別搜索Tag對象中的每個CSS類名。通過字符串內容搜索符合條件的全部子節點,可通過過濾器操作。通過傳入的關鍵字參數,搜索匹配關鍵字的子節點。使用find_all方法搜索到指定節點后網頁解析——使用BeautifulSoup庫解析網頁使用get方法可獲取列表中的節點所包含的鏈接。使用get_text方法可獲取其中的文本內容。爬蟲通過解析網頁獲取頁面中的數據后,還需要將獲得的數據存儲下來以供后續分析。數據入庫JSON模塊使用JSON模塊能夠將XPath獲取的文本內容存儲為JSON文件。PyMySQL庫使用PyMySQL庫能夠將獲取的結構化數據存入MySQL數據庫,使用PyMongo庫能夠將非結構化數據存入MongoDB數據庫。。JSON文件的操作在Python中分為解碼和編碼兩種,都通過JSON模塊來實現。數據入庫——將數據存儲為JSON文件編碼編碼過程是將Python對象轉換為JSON對象的過程。編碼過程常用dump函數和dumps函數。解碼編碼過程是將JSON對象轉換為Python對象的過程。dump函數和dumps函數的區別數據入庫——將數據存儲為JSON文件dump函數將Python對象轉換為JSON對象,并通過fp文件流將JSON對象寫入文件內,將數據存儲為JSON文件時主要使用的是dump函數。dumps函數是生成一個字符串。寫入文件時需要先序列化Python對象,否則會報錯。dump函數和dumps函數常用的參數及其說明數據入庫——將數據存儲為JSON文件參數名稱說明skipkeys接收Built-in。表示是否跳過非Python基本類型的key,若dict的keys內的數據為非Python基本類型,即不是str、unicode、int、long、float、bool、None等類型,則設置該參數為False時,會報TypeError錯誤。默認值為False,設置為True時,跳過此類keyensure_ascii接收Built-in。表示顯示格式,若dict內含有非ASCII的字符,則會以類似“\uXXX”的格式顯示。默認值為True,設置為False后,將會正常顯示indent接收int。表示顯示的行數,若為0或為None,則在一行內顯示數據,否則將會換行顯示數據且按照indent的數量顯示前面的空白,同時將JSON內容格式化顯示。默認為Noneseparators接收str。表示分隔符,實際上為(item_separator,dict_separator)的一個元組,當indent為None時,默認取值為(',',':'),表示dictionary內的keys之間用“,”隔開,而key和value之間用“:”隔開。默認為Noneencoding接收str。表示設置的JSON數據的編碼形式,處理中文時需要注意此參數的值。默認為utf-8sort_keys接收Built-in。表示是否根據keys的值進行排序。默認為False,為True時數據將根據keys的值進行排序PyMySQL與MySQLdb都是Python中用來操作MySQL的庫,兩者使用方法一致。PyMySQL庫與MySQLdb庫的區別PyMySQL支持Python3.X版本;MySQLdb不支持Python3.X版本。數據入庫——將數據存儲入MySQL數據庫PyMySQL庫使用connect函數連接數據庫。connect函數常用的參數及其說明數據入庫——將數據存儲入MySQL數據庫參數名稱說明host接收str。表示數據庫地址,本機地址通常為。默認為Noneport接收str。表示數據庫端口,通常為3306。默認為0user接收str。數據庫用戶名,管理員用戶為root。默認為Nonepasswd接收str。

溫馨提示

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

評論

0/150

提交評論