數(shù)據(jù)采集與預處理(微課版) 課件 第2章 數(shù)據(jù)采集與存儲_第1頁
數(shù)據(jù)采集與預處理(微課版) 課件 第2章 數(shù)據(jù)采集與存儲_第2頁
數(shù)據(jù)采集與預處理(微課版) 課件 第2章 數(shù)據(jù)采集與存儲_第3頁
數(shù)據(jù)采集與預處理(微課版) 課件 第2章 數(shù)據(jù)采集與存儲_第4頁
數(shù)據(jù)采集與預處理(微課版) 課件 第2章 數(shù)據(jù)采集與存儲_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章數(shù)據(jù)采集與存儲“Python數(shù)據(jù)采集與預處理目錄CONTENTS數(shù)據(jù)類型與操作2.1網(wǎng)頁抓?。号老x基礎2.2解析庫的使用2.3數(shù)據(jù)存儲2.4學習目標掌握JSON、CSV基礎數(shù)據(jù)的定義格式了解爬蟲的基本流程了解什么是HTTP掌握網(wǎng)頁的基本元素掌握并熟練使用urllib庫掌握并熟練使用requests庫掌握并熟練使用正則表達式提取數(shù)據(jù)了解什么是代理網(wǎng)絡掌握并熟練使用解析庫BeautifulSoup、XPath解析網(wǎng)頁掌握并熟練使用JSON、CSV格式的讀取、存儲及數(shù)據(jù)在MySQL數(shù)據(jù)庫的操作數(shù)據(jù)類型與操作01經(jīng)常使用AJAX配合JSON來完成任務,比和XML配合容易的多,速度快。如果使用XML,需要讀取XML文檔,然后用XMLDOM來遍歷文檔并讀取值并存儲在變量中。但如果使用JSON,則只需讀取JSON字符串。CSV是一種純文本文件格式,用于存儲表格數(shù)據(jù)(例如電子表格或數(shù)據(jù)庫)。它本質上存儲的表格數(shù)據(jù)包括數(shù)字和純文本。大多數(shù)在線服務使用戶可以自由地將網(wǎng)站中的數(shù)據(jù)導出為CSV文件格式。CSV文件通常會在Excel中打開,同時在參加編程馬拉松或Kaggle比賽時,通常會提供這種文件格式的語料。從這使用范圍方面來看,CSV更加深得程序員的喜愛。2.1數(shù)據(jù)類型與操作2.1.1數(shù)據(jù)類型介紹JSON(JavaScriptObjectNotation)是一種輕量級的數(shù)據(jù)交換格式。它基于JavaScript的一個子集,也就是JavaScript對象標記(1)對象:對象在JavaScript中是使用花括號{}包裹起來的內容,數(shù)據(jù)結構為{key1:value1,key2:value2,...}的鍵值對結構。在面向對象的語言中,key為對象屬性,value為對應的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。(2)數(shù)組:數(shù)組在JavaScript中是方括號[]包裹起來的內容,數(shù)據(jù)結構為[“java”,“javascript”,“vb”,...]的索引結構。在JavaScript中,數(shù)組是一種比較特殊的類型,它也可以像對象那樣使用鍵值對,但還是索引用的多。同樣的,值的類型可以是任意類型。2.1數(shù)據(jù)類型與操作2.1.2JSON格式數(shù)據(jù)2.1數(shù)據(jù)類型與操作{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}],"authors":[{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}],"musicians":[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]}在不同的主條目(programmers、authors和musicians)之間,記錄中實際的名稱/值對可以不一樣。JSON是完全動態(tài)的,允許在JSON結構的中間改變表示數(shù)據(jù)的方式。逗號分隔值(Comma-SeparatedValues,CSV),有時也稱為字符分隔值,因為分隔字符也可以不是逗號,其文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本)。純文本意味著該文件是一個字符序列,不含必須像二進制數(shù)字那樣被解讀的數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。CSV的格式規(guī)范(格式規(guī)范定義來源于RFC4180),一共七點:2.1數(shù)據(jù)類型與操作2.1.3CSV格式數(shù)據(jù)(1)每一行記錄位于一個單獨的行上,用回車換行符CRLF(也就是\r\n)分割。(2)文件中的最后一行記錄可以有結尾回車換行符,也可以沒有。(3)第一行可以存在一個可選的標題頭,格式和普通記錄行的格式一樣。標題頭要包含文件記錄字段對應的名稱,應該有和記錄字段一樣的數(shù)量。(在MIME類型中,標題頭行的存在與否可以通過MIMEtype中的可選“header”參數(shù)指明)。(4)在標題頭行和普通行每行記錄中,會存在一個或多個由半角逗號(,)分隔的字段。整個文件中每行應包含相同數(shù)量的字段,空格也是字段的一部分,不應被忽略。每一行記錄最后一個字段后不能跟逗號(通常用逗號分隔,也有其他字符分隔的CSV,需事先約定)。(5)每個字段可用也可不用半角雙引號(’’)括起來(不過有些程序,如Microsoft的Excel就根本不用雙引號)。如果字段沒有用引號括起來,那么該字段內部不能出現(xiàn)雙引號字符。(6)字段中若包含回車換行符、雙引號或者逗號,該字段需要用雙引號括起來。(7)如果用雙引號括字段,那么出現(xiàn)在字段內的雙引號前必須加一個雙引號進行轉義。2.1數(shù)據(jù)類型與操作網(wǎng)頁抓?。号老x基礎02網(wǎng)絡爬蟲(又稱為網(wǎng)頁蜘蛛,網(wǎng)絡機器人),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。網(wǎng)絡爬蟲按照系統(tǒng)結構和實現(xiàn)技術,大致可以分為以下幾種類型:通用網(wǎng)絡爬蟲(GeneralPurposeWebCrawler)、聚焦網(wǎng)絡爬蟲(FocusedWebCrawler)、增量式網(wǎng)絡爬蟲(IncrementalWebCrawler)、深層網(wǎng)絡爬蟲(DeepWebCrawler)。

實際的網(wǎng)絡爬蟲系統(tǒng)通常是幾種爬蟲技術相結合實現(xiàn)的。2.2網(wǎng)頁抓取:爬蟲基礎2.2.1爬蟲基本流程介紹0105040203通用網(wǎng)絡爬蟲獲取初始URL。初始的URL地址可以由人為地指定,也可以由用戶指定的某個或幾個初始爬蟲網(wǎng)頁決定。根據(jù)初始的URL爬取頁面并獲得新的URL。獲得初始的URL地址之后,首先需要爬取對應URL地址中的網(wǎng)頁,爬取了對應的URL地址中的網(wǎng)頁后,將網(wǎng)頁存儲到原始數(shù)據(jù)庫中,并且在爬取網(wǎng)頁的同時,發(fā)現(xiàn)新的URL地址,同時將已經(jīng)爬取的URL地址存放到一個URL列表中保存,用于去重以及判斷爬取的進程。將新的URL放到URL隊列中。在第2步中,獲取到了下一個新的需要爬取的URL地址后,會將新的URL地址放到URL隊列中。從URL隊列中讀取新的URL,并依據(jù)新的URL爬取網(wǎng)頁,同時從新網(wǎng)頁中獲取URL,并存放上述爬取過程。滿足爬蟲系統(tǒng)設置的停止條件時,停止爬取。在編寫爬蟲的時候,一般會設置相應的停止條件。2.2網(wǎng)頁抓取:爬蟲基礎聚焦網(wǎng)絡爬蟲04030201從新的URL中過濾掉與爬取目標無關的鏈接。因為聚焦網(wǎng)絡爬蟲對網(wǎng)頁的爬取是有目的性的,所以與目標無關的網(wǎng)頁將會被過濾掉。同時,也需要將已爬取的URL地址存放到一個URL列表中,用于去重和判斷爬取的進程。根據(jù)初始的URL爬取頁面,并獲取新的URL。獲取初始URL。爬取目標的定義和描述。在聚焦網(wǎng)絡爬蟲中,我們首先要依據(jù)爬取需求定義好該聚焦網(wǎng)絡爬蟲爬取的目標,以及進行相關的描述。2.2網(wǎng)頁抓?。号老x基礎聚焦網(wǎng)絡爬蟲08070605滿足系統(tǒng)中設置的停止條件時,或無法獲取新的URL地址時,則停止爬蟲行為。從下一步要爬取的URL地址中,讀取新的URL,然后依據(jù)新的URL地址爬取網(wǎng)頁,并重復上述爬取過程。從URL隊列中,根據(jù)搜索算法,確定URL的優(yōu)先級,并確定下一步要爬取的URL地址。在通用網(wǎng)絡爬蟲中,下一步爬取哪些URL地址,是不太重要的,但是在聚焦網(wǎng)絡爬蟲中,不同的爬取順序,可能導致爬蟲的執(zhí)行效率不同,所以,我們需要依據(jù)搜索策略來確定下一步需要爬取哪些URL地址。將過濾后的鏈接放到URL隊列中。2.2網(wǎng)頁抓?。号老x基礎

超文本傳輸協(xié)議(HyperTextTransferProtocol,HTTP),

是互聯(lián)網(wǎng)上應用最為廣泛的一種網(wǎng)絡協(xié)議。所有WWW文件都必須遵守這個標準。它可以使瀏覽器更加高效,使網(wǎng)絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先于圖形)等。2.2網(wǎng)頁抓?。号老x基礎2.2.2HTTP基本原理2.2網(wǎng)頁抓?。号老x基礎HTTP協(xié)議采用URL作為定位網(wǎng)絡資源的標識,URL格式如下:http://host[:port][path]host:合法的Internet主機域名或IP地址port:端口號,缺省端口為80path:請求資源的路徑HTTPS(HyperTextTransferProtocoloverSecureSocketLayer):超文本傳輸安全協(xié)議。通俗講HTTPS就是HTTP的安全版,通過它傳輸?shù)膬热荻际墙?jīng)過SSL加密的。爬蟲抓取的頁面通常都是HTTP或HTTPS協(xié)議的。當我們打開瀏覽器,從一個站點點擊鏈接進入下一個站點,就相當于從超文本的一個空間進入另一個空間,瀏覽器再將其解析出來,就是我們看到的頁面了。HTTP是一個應用層協(xié)議,是我們想從服務器端獲取信息的最直觀的請求。比如,在爬蟲中使用的<urllib模塊>,<requests模塊>等都是封裝了HTTP協(xié)議,作為一個HTTP客戶端實現(xiàn)了博文,圖片,視頻等信息源的下載。但是HTTP也不是直接就可以用的,它的請求是建立在一些底層協(xié)議的基礎上完成的。如TCP/IP協(xié)議棧中,HTTP需要TCP的三次握手連接成功后才能向服務器發(fā)起請求。當然,如果是HTTPS的話,還需要TSL和SSL安全層。2.2網(wǎng)頁抓?。号老x基礎互聯(lián)網(wǎng)的關鍵技術就是TCP/IP協(xié)議。兩臺計算機之間的通信是通過TCP/IP協(xié)議在因特網(wǎng)上進行的。實際上這個是兩個協(xié)議:TCP(TransmissionControlProtocol,傳輸控制協(xié)議)和IP(InternetProtocol,網(wǎng)際協(xié)議)。TCP/IP就是TCP和IP兩個協(xié)議在一起協(xié)同工作,有上下層次的關系。TCP負責應用軟件(比如你的瀏覽器)和網(wǎng)絡軟件之間的通信。IP負責計算機之間的通信。TCP負責將數(shù)據(jù)分割并裝入IP包,IP負責將包發(fā)送至接受者,傳輸過程要經(jīng)IP路由器負責根據(jù)通信量、網(wǎng)絡中的錯誤或者其他參數(shù)來進行正確地尋址,然后在它們到達的時候重新組合它們。IP:計算機之間的通信。IP協(xié)議是計算機用來相互識別的通信的一種機制,每臺計算機都有一個IP。用來在internet上標識這臺計算機。IP負責在因特網(wǎng)上發(fā)送和接收數(shù)據(jù)包。通過IP,消息(或者其他數(shù)據(jù))被分割為小的獨立的包,并通過因特網(wǎng)在計算機之間傳送。IP負責將每個包路由至它的目的地。IP協(xié)議僅僅是允許計算機相互發(fā)消息,但它并不檢查消息是否以發(fā)送的次序到達而且沒有損壞(只檢查關鍵的頭數(shù)據(jù))。為了提供消息檢驗功能,直接在IP協(xié)議上設計了傳輸控制協(xié)議TCP。2.2網(wǎng)頁抓?。号老x基礎HTTP工作過程,一次HTTP操作稱為一個事務,其工作整個過程如下:(1)地址解析。如用客戶端瀏覽器請求這個頁面::8080/index.html從中分解出協(xié)議名、主機名、端口、對象路徑等部分,對于我們的這個地址,解析得到的結果如下:①協(xié)議名:http②主機名:③端口:8080④對象路徑:/index.htm在這一步,需要域名系統(tǒng)DNS解析域名,得主機的IP地址。(2)封裝HTTP請求數(shù)據(jù)包。把以上部分結合本機自己的信息,封裝成一個HTTP請求數(shù)據(jù)包2.2網(wǎng)頁抓取:爬蟲基礎3)封裝成TCP包,建立TCP連接(TCP的三次握手)。在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網(wǎng)絡與服務器建立連接,該連接是通過TCP來完成的,該協(xié)議與IP協(xié)議共同構建Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡。HTTP是比TCP更高層次的應用層協(xié)議,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能,才能進行更層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這里是8080端口。(4)客戶機發(fā)送請求命令建立連接后,客戶機發(fā)送一個請求給服務器,請求方式的格式為:統(tǒng)一資源標識符(URL)、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可內容。(5)服務器響應服務器接到請求后,給予相應的響應信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。實體消息是服務器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結束。接著,它就以Content-Type應答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)。2.2網(wǎng)頁抓?。号老x基礎(6)服務器關閉TCP連接一般情況下,一旦Web服務器向瀏覽器發(fā)送了請求數(shù)據(jù),它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼(Connection:keep-alive)。TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個請求建立新連接所需的時間,還節(jié)約了網(wǎng)絡帶寬。使用HTML來建立自己的WEB站點,HTML運行在瀏覽器上,由瀏覽器來解析。2.2網(wǎng)頁抓?。号老x基礎1.<!DOCTYPEhtml>聲明為HTML5文檔2.<html>元素是HTML頁面的根元素3.<head>元素包含了文檔的元(meta)數(shù)據(jù),如<metacharset="utf-8">定義網(wǎng)頁編碼格式為utf-8。4.<title>元素描述了文檔的標題5.<body>元素包含了可見的頁面內容6.<h1>元素定義一個大標題7.<p>元素定義一個段落2.2.3網(wǎng)頁基礎1HTML標題2HTML段落3HTML鏈接4HTML圖像5HTML<head>元素6HTML表格2.2網(wǎng)頁抓?。号老x基礎7HTML布局8HTML框架網(wǎng)頁基礎1.HTML標題HTML標題(Heading)是通過<h1>-<h6>標簽來定義的。2.2網(wǎng)頁抓取:爬蟲基礎2.HTML段落HTML段落是通過標簽<p>來定義的。<h1>這是一個標題</h1><h2>這是一個標題</h2><h3>這是一個標題</h3><p>這是一個段落。</p><p>這是另外一個段落。</p>3.HTML鏈接HTML鏈接是通過標簽<a>來定義的。<ahref="">這是一個鏈接</a>4.HTML圖像HTML圖像是通過標簽<img>來定義的。<imgloading="lazy"src="/images/logo.png"width="258"height="39"/>5.HTML<head>元素<head>元素包含了所有的頭部標簽元素。在<head>元素中你可以插入腳本(scripts),樣式文件(CSS),及各種meta信息??梢蕴砑釉陬^部區(qū)域的元素標簽為:<title>,<style>,<meta>,<link>,<script>,<noscript>和<base>。2.2網(wǎng)頁抓?。号老x基礎6.HTML表格表格由<table>標簽來定義。每個表格均有若干行(由<tr>標簽定義),每行被分割為若干單元格(由<td>標簽定義)。字母td指表格數(shù)據(jù)(tabledata),即數(shù)據(jù)單元格的內容。數(shù)據(jù)單元格可以包含文本、圖片、列表、段落、表單、水平線、表格等等。<tableborder="1"> <tr> <td>row1,cell1</td> <td>row1,cell2</td> </tr> <tr> <td>row2,cell1</td> <td>row2,cell2</td> </tr></table>7.HTML布局大多數(shù)網(wǎng)站會把內容安排到多個列中(就像雜志或報紙那樣)。大多數(shù)網(wǎng)站可以使用<div>或者<table>元素來創(chuàng)建多列。CSS用于對元素進行定位,或者為頁面創(chuàng)建背景以及色彩豐富的外觀。2.2網(wǎng)頁抓?。号老x基礎8.HTML框架通過使用框架,你可以在同一個瀏覽器窗口中顯示不止一個頁面。<iframesrc="URL"></iframe> #格式#示例<iframesrc="demo_iframe.htm"name="iframe_a"></iframe><p><ahref=""target="iframe_a"rel="noopener">RUNOOB.COM</a></p>以上便是一些常用的HTML基礎,了解了一些基礎的頁面構成,有利于讀者在后續(xù)爬蟲時,定位到需要爬取的位置。HTML標簽簡寫及全稱速查網(wǎng)址:/html/html-tag-name.htmlurllib庫一般用來實現(xiàn)這些功能:向服務器發(fā)送請求,得到服務器響應,獲取網(wǎng)頁的內容。Python的強大就在于提供了功能齊全的類庫,來幫助完成這些請求,通過調用urllib庫,我們不需要了解請求的數(shù)據(jù)結構,HTTP、TCP、IP層的網(wǎng)絡傳輸通信,以及服務器應答原理等等。

此外,urllib庫是Python內置的HTTP請求庫,也就是說不需要額外安裝。requests庫的更多信息可以從官網(wǎng)/3/library/urllib.request.html瀏覽查看。2.2網(wǎng)頁抓?。号老x基礎2.2.4使用urllib庫requsetHTTP請求模塊,可以用來模擬發(fā)送請求,只需要傳入URL及額外參數(shù),就可以模擬瀏覽器訪問網(wǎng)頁的過程。error異常處理模塊,檢測請求是否報錯,捕捉異常錯誤,進行重試或其他操作,保證程序不會終止。parse工具模塊,提供許多URL處理方法,如拆分、解析、合并等。robotparser識別網(wǎng)站的robots.txt文件,判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬,使用頻率較少。網(wǎng)絡爬蟲排除標準(RobotsExclusionStandard)。網(wǎng)站告知網(wǎng)絡爬蟲哪些頁面可以抓取,哪些不行,在網(wǎng)站的根目錄下的robots.txt文件。2.2網(wǎng)頁抓?。号老x基礎urllib庫包含4個模塊:urlopen是request模塊中的方法,用于模擬瀏覽器的一個請求發(fā)起過程,便于我們抓取網(wǎng)頁信息。2.2網(wǎng)頁抓?。号老x基礎1.request模塊importurllib.request

respons=urllib.request.urlopen('/')#http請求對象print(type(respons))print(respons.read().decode('utf-8'))#調用http請求對象的read()方法讀取對象的內容并以utf-8的格式顯示出來respons對象主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等屬性。下面看一個例子2.2網(wǎng)頁抓?。号老x基礎1.request模塊importurllib.requestrespons=urllib.request.urlopen('')print(respons.status)print(respons.getheaders())print(respons.getheader('Server'))可以得到了訪問百度時的響應狀態(tài)碼和響應的頭信息,響應狀態(tài)碼200表示成功訪問,然后響應頭中的Server值是BWS/1.1,表明服務器是用此搭建的。在網(wǎng)絡不好的情況下程序可能會因報錯而終止運行,這時異常處理就很重要了。URLError是error異常模塊的基類,由request模塊生成的異常都可以通過捕獲這個類來處理。HTTPError是URLError的子類,專門用來處理HTTP請求錯誤,比如認證請求失敗等,它有三個屬性:code:返回HTTP狀態(tài)碼。reason:返回錯誤的原因。headers:返回請求頭。下面舉個例子:2.2網(wǎng)頁抓?。号老x基礎2.error模塊fromurllibimportrequest,errortry:response=request.urlopen('/index.html')excepterror.HTTPErrorase:print(e.reason,e.code,e.headers,sep='\n')就會返回得到,HTTP狀態(tài)碼、返回錯誤的原因、請求頭。urllib庫提供了parse模塊用以處理URL的標準接口,例如實現(xiàn)URL各部分的抽取,合并以及連接轉換。2.2網(wǎng)頁抓取:爬蟲基礎3.parse模塊返回結果是一個ParseResult對象,由scheme、netloc、path、params、query、fragment這六部分組成,分別代表協(xié)議、域名、訪問路徑、參數(shù)、查詢條件、錨點。fromurllib.parseimporturlparseResult=urlparse('/apps/abs/10/297/x7m9k?spm=a2166.8043889.305590.6.59e87482PoG2FO&wh_weex=true&psId=1650038')print(type(result),'\n',result)2.2網(wǎng)頁抓取:爬蟲基礎4.robotts協(xié)議也叫爬蟲協(xié)議,用來告訴爬蟲和搜索引擎哪些頁面可以爬取,哪些不能。當搜索爬蟲訪問一個站點時,它首先會檢查這個站點根目錄下是否存在robots.txt文件,如果存在則會根據(jù)其中的爬取范圍來爬取,如果沒有這個文件,爬蟲就會訪問所有可直接訪問的頁面。robotparser模塊可用于解析robotts.txt。這個模塊提供了一個RobotFileParser可以根據(jù)某網(wǎng)站的robots.txt文件來判斷一個爬蟲是否有權限來爬取這個頁面,它有如下一些方法:①set_url():用來設置robots.txt文件的鏈接,如果在創(chuàng)建RobotFileParser對象時傳入了鏈接就不需要使用這個方法來設置了。②read():讀取robots.txt文件并進行分析,這個方法執(zhí)行一個讀取和分析操作,這個方法必須調用。③parse():用來解析robots.txt文件,傳入robots.txt某些行的內容,它會按照robots.txt的語法規(guī)則來分析這些內容。④can_fetch():傳入User-agent和要抓取的URL,返回是否可以抓取這個URL,只有Ture和False。⑤mtime():返回上次抓取和分析robots.txt的時間。⑥modified():將當前時間設置為上次抓取和分析robots.txt的時間。requests庫是目前公認的最簡潔、最方便的爬取網(wǎng)頁的第三方庫,甚至可以用一行代碼就可以從網(wǎng)頁獲取爬取的信息。requests庫的更多信息可以從官網(wǎng)瀏覽查看。2.2網(wǎng)頁抓?。号老x基礎1.requests庫的安裝win+R執(zhí)行命令cmd,執(zhí)行下面的命令行。pipinstallrequests2.2.5使用requests庫請求網(wǎng)站2.2網(wǎng)頁抓取:爬蟲基礎2.測試requests庫是否安裝成功在IDEA編譯器中,測試requests庫是否安裝成功importrequestsr=requests.get('/')print(type(r))print(r.status_code)print(r.encoding)print(r.cookies)<class'requests.models.Response'>200ISO-8859-1<RequestsCookieJar[<CookieBDORZ=27315for./>]>可以看到下面的輸出,即安裝成功2.2網(wǎng)頁抓?。号老x基礎3.requests庫的主要方法requests庫常用的主要方法一共有7個,如下:①requests.request(method,url,**kwargs)構造一個請求,支撐以下各方法的基礎方法。②requests.get(url,params=None,**kwargs)get()函數(shù)時獲取HTML網(wǎng)頁的主要方法,對應于HTTP的GET,其參數(shù)解釋如下:a.url:擬獲取頁面的url鏈接。b.params:url中的額外參數(shù),字典或字節(jié)流格式,可選。c.**kwargs:12個控制訪問的參數(shù)。r=requests.get(url)d.r:返回一個包含服務器資源的Response對象,Response對象包含服務器返回的所有信息,也包含請求的Request信息。2.2網(wǎng)頁抓?。号老x基礎屬性說明r.status_codeHTTP請求的返回狀態(tài),200表示連接成功,404表示失敗r.textHTTP響應內容的字符串形式,即,url對應的頁面內容r.encoding從HTTPheader中猜測的響應內容編碼方式r.apparent_encoding從內容中分析出的響應內容編碼方式(備選編碼方式)r.contentHTTP響應內容的二進制形式Response對象屬性2.2網(wǎng)頁抓?。号老x基礎③requests.head(url,**kwargs)獲取HTML網(wǎng)頁的頭信息方法,對應于HTTP的HEAD。④requests.post(url,data=None,json=None,**kwargs)向HTML網(wǎng)頁提交POST請求的方法,對應于HTTP的POST。⑤requests.put(url,data=None,**kwargs)向HTML網(wǎng)頁提交PUT請求的方法,對應于HTTP的PUT。⑥requests.patch(url,data=None,**kwargs)向HTML網(wǎng)頁提交局部修改請求,對應于HTTP的PATCH。⑦requests.delete(url,**kwargs)向HTML網(wǎng)頁提交刪除請求,對應于HTTP的DELETE。

可以看出,HTTP協(xié)議和requests庫訪問網(wǎng)頁的方法幾乎是一一對應,功能一致的。在使用requests庫來獲取頁面信息時,我們主要使用的是get()函數(shù),通過requests.get(url)獲取url的相關內容。

但這樣的語句并不是一定成立的,因為網(wǎng)絡連接有風險,所以這樣的語句異常處理很重要。2.2網(wǎng)頁抓取:爬蟲基礎4.requests庫的異常處理requests庫常用的異常處理方法一共有6個,如下:異常說明requests.ConnectionError網(wǎng)絡連接錯誤異常,如DNS查詢失敗、拒接連接等requests.HTTPErrorHTTP錯誤異常requests.URLRequiredURL錯誤異常requests.TooManyRedirects超過最大重定向次數(shù),產生重定向異常requests.ConnectTimeout連接遠程服務器超時異常(僅僅是連接的時間)requests.Timeout請求URL超時,產生超時異常(整個過程)2.2網(wǎng)頁抓?。号老x基礎正則表達式可以從一個基礎字符串中根據(jù)一定的匹配模式替換文本中的字符串、驗證表單、提取字符串等等。在Python中,一般會使用re模塊來實現(xiàn)Python正則表達式的功能。(正則表達式在線測試平臺:/)2.2.6正則表達式提取數(shù)據(jù)1.正則表達式的基本使用理論(1)基本匹配正則表達式其實就是在執(zhí)行搜索時的格式,它由一些字母和數(shù)字組合而成。例如:一個正則表達式cat,它表示一個規(guī)則:由字母c開始,接著是a,再接著是t。"cat"=>Thefatcatsatonthemat.2.2網(wǎng)頁抓?。号老x基礎同時,正則表達式是大小寫敏感的,若一個正則表達式The,匹配到的是The,而不會匹配the。"The"=>Thefatcatsatonthemat.(2)元字符正則表達式主要依賴于元字符。元字符不代表他們本身的字面意思,他們都有特殊的含義。一些元字符寫在方括號中的時候有一些特殊的意思。以表是一些元字符的介紹:2.2網(wǎng)頁抓取:爬蟲基礎元字符描述.句號匹配任意單個字符除了換行符。[]字符種類。匹配方括號內的任意字符。[^]否定的字符種類。匹配除了方括號里的任意字符*匹配>=0個重復的在*號之前的字符。+匹配>=1個重復的+號前的字符。?標記?之前的字符為可選.{n,m}匹配num個大括號之前的字符或字符集(n<=num<=m).(xyz)字符集,匹配與xyz完全相等的字符串.|或運算符,匹配符號前或后的字符.\轉義字符,用于匹配一些保留的字符[](){}.*+?^$\|^從開始行開始匹配.$從末端開始匹配.常用的元字符2.2網(wǎng)頁抓取:爬蟲基礎①點運算符“.”是元字符中最簡單的例子。“.”匹配任意單個字符,但不匹配換行符。例如,表達式.ar匹配一個任意字符后面跟著是a和r的字符串。".ar"=>Thecar

parkedinthegarage.②字符集字符集也叫做字符類。方括號用來指定一個字符集。在方括號中使用連字符來指定字符集的范圍。在方括號中的字符集不關心順序。例如,表達式[Tt]he匹配the和The。"[Tt]he"=>Thecarparkedinthegarage.方括號的句號就表示句號。表達式ar[.]匹配ar.字符串。"ar[.]"=>Agarageisagoodplacetoparkacar.2.2網(wǎng)頁抓?。号老x基礎③否定字符集一般來說^表示一個字符串的開頭,但它用在一個方括號的開頭的時候,它表示這個字符集是否定的。例如,表達式[^c]ar匹配一個后面跟著ar的除了c以外的任意字符。④重復次數(shù)后面跟著元字符+,*or?的,用來指定匹配子模式的次數(shù)。這些元字符在不同的情況下有著不同的意思。*號匹配在*之前的字符出現(xiàn)大于等于0次。例如,表達式a*匹配0或更多個以a開頭的字符。表達式[a-z]*匹配一個行中所有以小寫字母開頭的字符串。"[^c]ar"=>Thecarparkedinthegarage."[a-z]*"=>Thecarparkedinthegarage.*字符和.字符搭配可以匹配所有的字符.*。*和表示匹配空格的符號\s連起來用,如表達式\s*cat\s*匹配0或更多個空格開頭和0或更多個空格結尾的cat字符串。"\s*cat\s*"=>Thefatcatsatontheconcatenation.2.2網(wǎng)頁抓?。号老x基礎+號匹配+號之前的字符出現(xiàn)>=1次。例如表達式c.+t匹配以首字母c開頭以t結尾,中間跟著至少一個字符的字符串。在正則表達式中元字符?標記在符號前面的字符為可選,即出現(xiàn)0或1次。例如,表達式[T]?he匹配字符串he和The。⑤{}號在正則表達式中{}是一個量詞,常用來限定一個或一組字符可以重復出現(xiàn)的次數(shù)。例如,表達式[0-9]{2,3}匹配最少2位最多3位0~9的數(shù)字。"c.+t"=>Thefatcatsatonthemat"[T]?he"=>Thecarisparkedinthegarage."[0-9]{2,3}"=>Thenumberwas9.9997butweroundeditoffto10.0.我們可以省略第二個參數(shù)。例如,[0-9]{2,}匹配至少兩位0~9的數(shù)字。"[0-9]{2,}"=>Thenumberwas9.9997butweroundeditoffto10.0.2.2網(wǎng)頁抓取:爬蟲基礎如果逗號也省略掉則表示重復固定的次數(shù)。例如,[0-9]{3}匹配3位數(shù)字⑥(...)特征標群特征標群是一組寫在(...)中的子模式。(...)中包含的內容將會被看成一個整體,和數(shù)學中小括號()的作用相同。例如,表達式(ab)*匹配連續(xù)出現(xiàn)0或更多個ab。如果沒有使用(...),那么表達式ab*將匹配連續(xù)出現(xiàn)0或更多個b。再比如之前說的{}是用來表示前面一個字符出現(xiàn)指定次數(shù)。但如果在{}前加上特征標群(...)則表示整個標群內的字符重復N次。我們還可以在()中用或字符|表示或。例如,(c|g|p)ar匹配car或gar或par."[0-9]{3}"=>Thenumberwas9.9997butweroundeditoffto10.0."(c|g|p)ar"=>Thecarisparkedinthegarage.⑦|或運算符或運算符就表示或,用作判斷條件。例如(T|t)he|car匹配(T|t)he或car。"(T|t)he|car"=>Thecarisparkedinthegarage.2.2網(wǎng)頁抓?。号老x基礎⑧轉碼特殊字符反斜線\在表達式中用于轉碼緊跟其后的字符。用于指定{}[]/\+*.$^|?這些特殊字符。如果想要匹配這些特殊字符則要在其前面加上反斜線\。例如.是用來匹配除換行符外的所有字符的。如果想要匹配句子中的.則要寫成\.以下這個例子\.?是選擇性匹配."(f|c|m)at\.?"=>Thefatcatsatonthemat.⑨錨點在正則表達式中,想要匹配指定開頭或結尾的字符串就要使用到錨點。^指定開頭,$指定結尾。^用來檢查匹配的字符串是否在所匹配字符串的開頭。例如,在abc中使用表達式^a會得到結果a。但如果使用^b將匹配不到任何結果。因為在字符串abc中并不是以b開頭。例如,^(T|t)he匹配以The或the開頭的字符串。"(T|t)he"=>Thecarisparkedinthegarage."^(T|t)he"=>Thecarisparkedinthegarage.2.2網(wǎng)頁抓?。号老x基礎同理于^號,$號用來匹配字符是否是最后一個。例如,(at\.)$匹配以at.結尾的字符串。"(at\.)"=>Thefatcat.sat.onthemat."(at\.)$"=>Thefatcat.sat.onthemat.(3)簡寫字符集常用的字符集簡寫簡寫描述.除換行符外的所有字符\w匹配所有字母數(shù)字,等同于[a-zA-Z0-9_]\W匹配所有非字母數(shù)字,即符號,等同于:[^\w]\d匹配數(shù)字:[0-9]\D匹配非數(shù)字:[^\d]\s匹配所有空格字符,等同于:[\t\n\f\r\p{Z}]\S匹配所有非空格字符:[^\s]\f匹配一個換頁符\n匹配一個換行符\r匹配一個回車符\t匹配一個制表符\v匹配一個垂直制表符\p匹配CR/LF(等同于\r\n),用來匹配DOS行終止符2.2網(wǎng)頁抓取:爬蟲基礎(4)零寬度斷言先行斷言和后發(fā)斷言都屬于非捕獲簇(不捕獲文本,也不針對組合計進行計數(shù))。先行斷言用于判斷所匹配的格式是否在另一個確定的格式之前,匹配結果不包含該確定格式(僅作為約束)。例如,我們想要獲得所有跟在$符號后的數(shù)字,我們可以使用正后發(fā)斷言(?<=\$)[0-9\.]*。這個表達式匹配$開頭,之后跟著0,1,2,3,4,5,6,7,8,9,.這些字符可以出現(xiàn)大于等于0次。符號描述?=正先行斷言-存在?!負先行斷言-排除?<=正后發(fā)斷言-存在?<!負后發(fā)斷言-排除2.2網(wǎng)頁抓?。号老x基礎①?=...正先行斷言?=...正先行斷言,表示第一部分表達式之后必須跟著?=...定義的表達式。返回結果只包含滿足匹配條件的第一部分表達式。定義一個正先行斷言要使用()。在括號內部使用一個問號和等號:(?=...)。正先行斷言的內容寫在括號中的等號后面。例如,表達式(T|t)he(?=\sfat)匹配The和the,在括號中我們又定義了正先行斷言(?=\sfat),即The和the后面緊跟著(空格)fat。"(T|t)he(?=\sfat)"=>Thefatcatsatonthemat.②?!...負先行斷言負先行斷言?!用于篩選所有匹配結果,篩選條件為其后不跟隨著斷言中定義的格式。正先行斷言定義和負先行斷言一樣,區(qū)別就是=替換成!也就是(?!...)。表達式(T|t)he(?!\sfat)匹配The和the,且其后不跟著(空格)fat。"(T|t)he(?!\sfat)"=>Thefatcatsatonthemat.2.2網(wǎng)頁抓?。号老x基礎③?<=...正后發(fā)斷言正后發(fā)斷言記作(?<=...)用于篩選所有匹配結果,篩選條件為其前跟隨著斷言中定義的格式。例如,表達式(?<=(T|t)he\s)(fat|mat)匹配fat和mat,且其前跟著The或the。④?<!...負后發(fā)斷言負后發(fā)斷言記作(?<!...)用于篩選所有匹配結果,篩選條件為其前不跟隨著斷言中定義的格式。例如,表達式(?<!(T|t)he\s)(cat)匹配cat,且其前不跟著The或the。"(?<=(T|t)he\s)(fat|mat)"=>Thefatcatsatonthemat."(?<!(T|t)he\s)(cat)"=>Thecatsatoncat.2.2網(wǎng)頁抓?。号老x基礎(5)標志標志也叫模式修正符,因為它可以用來修改表達式的搜索結果。這些標志可以任意的組合使用,它也是整個正則表達式的一部分標志描述i忽略大小寫。g全局搜索。m多行修飾符:錨點元字符^$工作范圍在每行的起始。①忽略大小寫(CaseInsensitive)修飾語i用于忽略大小寫。例如,表達式/The/gi表示在全局搜索The,在后面的i將其條件修改為忽略大小寫,則變成搜索the和The,g表示全局搜索。"The"=>Thefatcatsatonthemat."/The/gi"=>Thefatcatsatonthemat.2.2網(wǎng)頁抓?。号老x基礎②全局搜索(Globalsearch)修飾符g常用于執(zhí)行一個全局搜索匹配,即不僅僅返回第一個匹配的,而是返回全部。例如,表達式/.(at)/g表示搜索任意字符(除了換行)+at,并返回全部結果。③多行修飾符(Multiline)多行修飾符m常用于執(zhí)行一個多行匹配。像之前介紹的(^,$)用于檢查格式是否是在待檢測字符串的開頭或結尾。但我們如果想要它在每行的開頭和結尾生效,我們需要用到多行修飾符m。例如,表達式/at(.)?$/gm表示小寫字符a后跟小寫字符t,末尾可選除換行符外任意字符。根據(jù)m修飾符,現(xiàn)在表達式匹配每行的結尾。"/.(at)/"=>Thefatcatsatonthemat."/.(at)/g"=>Thefat

catsatonthemat."/.at(.)?$/"=>Thefatcatsatonthemat.

"/.at(.)?$/gm"=>Thefatcatsatonthemat.2.2網(wǎng)頁抓取:爬蟲基礎(6)貪婪匹配與惰性匹配(Greedyvslazymatching)正則表達式默認采用貪婪匹配模式,在該模式下意味著會匹配盡可能長的子串。我們可以使用?將貪婪匹配模式轉化為惰性匹配模式。"/(.*at)/"=>Thefatcatsatonthemat."/(.*?at)/"=>

Thefatcatsatonthemat.2.re模塊來實現(xiàn)Python正則表達式正則表達式要進行相應匹配還需要通過正則表達式函數(shù)來完成。常見的正則表達式函數(shù)有re.match()函數(shù)、re.search()函數(shù)、全局匹配函數(shù)、re.sub()函數(shù),下面我們講解這些常用函數(shù)的使用。2.2網(wǎng)頁抓取:爬蟲基礎(1)re.match()函數(shù)如果想要從源字符串的起始位置匹配一個模式,我們可以使用re.match()函數(shù),re.match()函數(shù)的使用格式是: re.match(pattern,string,flag)第一個參數(shù)代表對應的正則表達式,第二個參數(shù)代表對應的源字符,第三個參數(shù)是可選參數(shù),代表對應的標志位,可以放模式修正符等信息。importre

str=''pattern='www'result=re.match(pattern,str)result2=re.match(pattern,str).span()print(result)print(result2)2.2網(wǎng)頁抓?。号老x基礎程序中,會從string的起始位置進行匹配,如果不滿足模式,則會返回None,如果符合要求,則返回匹配成功的結果。此時,正則表達式剛好可以從string的開頭進行匹配并匹配成功,所以,可以看到,result、result2都成功進行了匹配,但是展現(xiàn)形式不一樣。通過.span()設置可以過濾掉一些信息,只留下匹配成功的結果在源字符串中的位置。2.2網(wǎng)頁抓?。号老x基礎(2)re.search()函數(shù)我們還可以使用re.search()函數(shù)進行匹配,會掃描整個字符串并進行對應的匹配。該函數(shù)與re.match()函數(shù)最大的不同是,re.match()函數(shù)從源字符串的開頭進行匹配,而re.search()函數(shù)會在全文中進行檢索匹配。示例代碼如下:importre

str=''pattern='.noon.'res1=re.match(pattern,str)res2=re.search(pattern,str)print(res1)print(res2)2.2網(wǎng)頁抓取:爬蟲基礎可以看出,字符串str的開始位置不符合正則表達式格式,所以match()方法匹配不到結果。但是字符串str中含有符合正則表達式格式的內容,所以search()方法匹配到了結果'unoona'。2.2網(wǎng)頁抓?。号老x基礎(3)全局匹配函數(shù)上面的兩種匹配函數(shù)match()、search()方法只返回一個匹配到的結果。那么當需要返回所有符合條件的匹配結果,可以使用全局匹配函數(shù)。示例代碼如下:importre

str=''#預編譯pattern=pile('.noon.')#全局匹配、找出左右符合條件的匹配res=pattern.findall(str)print(res)得到執(zhí)行結果:['unoona','anoons']。上面功能的實現(xiàn)重點主要是先預編譯,在找出所有符合條件的結果。2.2網(wǎng)頁抓?。号老x基礎(4)re.sub()函數(shù)上面的3個函數(shù)都是找出想要的條件的結果,那么當我們想根據(jù)正則表達式來替換符合條件的字符串,可以通過sub()實現(xiàn)。re.sub(pattern,rep,string,max)pattern:正則表達式rep:想要的目標字符串string:源字符串max:最多可替換的次數(shù);若忽略,則符合條件的全部替換2.2網(wǎng)頁抓?。号老x基礎importre

str=''pattern='.noon.'#全部替換res1=re.sub(pattern,'|**|',str)#替換兩次res2=re.sub(pattern,'|**|',str,2)print(res1)print(res2)2.2網(wǎng)頁抓?。号老x基礎最初爬蟲正常運行,正常抓取數(shù)據(jù),一切看起來都是那么美好,然而一會便可能就會出現(xiàn)錯誤,比如“403Forbidden”,這時候打開網(wǎng)頁一看,可能會看到“您的IP訪問頻率太高”這樣的提示。出現(xiàn)這種現(xiàn)象的原因是網(wǎng)站采取了一些反爬蟲措施。既然服務器檢測的是某個IP單位時間的請求次數(shù),那么借助某種方式來偽裝我們的IP,讓服務器識別不出是由我們本機發(fā)起的請求,不就可以成功防止封IP了嗎?一種有效的方式就是使用代理。2.2.7代理的使用1.基本原理在我們正常請求一個網(wǎng)站時,是發(fā)送了請求給Web服務器,Web服務器把響應傳回給我們。如果設置了代理服務器,實際上就是在本機和服務器之間搭建了一個橋,此時本機不是直接向Web服務器發(fā)起請求,而是向代理服務器發(fā)出請求,請求會發(fā)送給代理服務器,然后由代理服務器再發(fā)送給Web服務器,接著由代理服務器再把Web服務器返回的響應轉發(fā)給本機。這樣同樣可以正常訪問網(wǎng)頁,但這個過程中Web服務器識別出的真實IP就不再是本機的IP了,其成功實現(xiàn)了IP偽裝,這就是代理的基本原理。2.2網(wǎng)頁抓?。号老x基礎2.代理的作用(1)突破自身IP訪問限制,訪問一些平時不能訪問的站點。(2)訪問一些單位或團體內部資源:比如使用教育網(wǎng)內地址段免費代理服務器,就可以用于對教育網(wǎng)開放的各類FTP下載上傳,以及各類資料查詢共享等服務。(3)提高訪問速度:通常代理服務器都設置一個較大的硬盤緩沖區(qū),當有外界的信息通過時,同時也將其保存到緩沖區(qū)中,當其他用戶再訪問相同的信息時,則直接由緩沖區(qū)中取出信息,傳給用戶,以提高訪問速度。(4)隱藏真實IP:上網(wǎng)者也可以通過這種方法隱藏自己的IP,免受攻擊。對于爬蟲來說,我們用代理就是為了隱藏自身IP,防止自身的IP被封鎖。2.2網(wǎng)頁抓取:爬蟲基礎3.代理分類根據(jù)代理的協(xié)議,代理可以分為如下類別:①FTP代理服務器:主要用于訪問FTP服務器,一般有上傳、下載以及緩存功能,端口一般為21、2121等。②HTTP代理服務器:主要用于訪問網(wǎng)頁,一般有內容過濾和緩存功能,端口一般為80、8080、3128等。③SSL/TLS代理:主要用于訪問加密網(wǎng)站,一般有SSL或TLS加密功能(最高支持128位加密強度),端口一般為443。④RTSP代理:主要用于訪問Real流媒體服務器,一般有緩存功能,端口一般為554。⑤Telnet代理:主要用于telnet遠程控制(黑客入侵計算機時常用于隱藏身份),端口一般為23。⑥POP3/SMTP代理:主要用于POP3/SMTP方式收發(fā)郵件,一般有緩存功能,端口一般為110/25。⑦SOCKS代理:只是單純傳遞數(shù)據(jù)包,不關心具體協(xié)議和用法,所以速度快很多,一般有緩存功能,端口一般為1080。SOCKS代理協(xié)議又分為SOCKS4和SOCKS5,前者只支持TCP,而后者支持TCP和UDP,還支持各種身份驗證機制、服務器端域名解析等。簡單來說,SOCK4能做到的SOCKS5都可以做到,但SOCKS5能做到的SOCK4不一定能做到。(1)根據(jù)協(xié)議區(qū)分2.2網(wǎng)頁抓取:爬蟲基礎根據(jù)代理的匿名程度,代理可以分為如下類別:①高度匿名代理:會將數(shù)據(jù)包原封不動地轉發(fā),在服務端看來就好像真的是一個普通客戶端在訪問,而記錄的IP是代理服務器的IP。②普通匿名代理:會在數(shù)據(jù)包上做一些改動,服務端上有可能發(fā)現(xiàn)這是個代理服務器,也有一定幾率追查到客戶端的真實IP。代理服務器通常會加入的HTTP頭有HTTP_VIA和HTTP_X_FORWARDED_FOR。③透明代理:不但改動了數(shù)據(jù)包,還會告訴服務器客戶端的真實IP。這種代理除了能用緩存技術提高瀏覽速度,能用內容過濾提高安全性之外,并無其他顯著作用,最常見的例子是內網(wǎng)中的硬件防火墻。④間諜代理:指組織或個人創(chuàng)建的用于記錄用戶傳輸?shù)臄?shù)據(jù),然后進行研究、監(jiān)控等目的的代理服務器。(2)根據(jù)匿名程度區(qū)分2.2網(wǎng)頁抓取:爬蟲基礎爬蟲關于cookie和session,由于http協(xié)議無記憶性,比如說登錄淘寶網(wǎng)站的瀏覽記錄,下次打開是不能直接記憶下來的,后來就有了cookie和session機制。第一次登錄后,短時間內再次打開此頁面時,會發(fā)現(xiàn)系統(tǒng)已經(jīng)保存了cookie,不用再重新登錄。時間長了cookie會失效,需重新登錄。所以通過網(wǎng)頁捕獲cookie就可以實現(xiàn)自動登錄了。使用cookie登錄方式如下:打開瀏覽器控制臺F12,點擊網(wǎng)絡、headers,可以看見cookie后的信息。2.2.8使用Cookie登錄2.2網(wǎng)頁抓?。号老x基礎利用從瀏覽器獲取的cookie信息,我們就可以實現(xiàn)自動登錄了。嘗試以下代碼:fromurllibimportrequest

if__name__=='__main__':url="/3247429/profile"headers={#Cookie值從登錄后的瀏覽器,拷貝,見上"Cookie":"cookie值"}req=request.Request(url=url,headers=headers)rsp=request.urlopen(req)html=rsp.read().decode()withopen("rsp.html","w",encoding="utf-8")asf:print(html)f.write(html)解析庫的使用032.3解析庫的使用BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫。它能夠通過你喜歡的轉換器實現(xiàn)慣用的文檔導航,查找,修改文檔的方式。BeautifulSoup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間。2.3.1使用BeautifulSoup解析網(wǎng)頁(1)安裝BeautifulSoupwin+R執(zhí)行命令cmd,執(zhí)行下面的命令行。顯示安裝成功即可。

pipinstallbeautifulsoup4(2)BeautifulSoup解析器HTML相當于一個標簽樹,所以BeautifulSoup庫相當是一個解析、遍歷、維護“標簽樹”的功能庫。BeautifulSoup類的常用解析器2.3解析庫的使用解析器使用方法條件bs4的HTML解析器BeautifulSoup(mk,'html.parser')安裝bs4庫lxml的HTML解析器BeautifulSoup(mk,'lxml')pipinstalllxmllxml的XML解析器BeautifulSoup(mk,'xml')pipinstalllxmlhtml5lib的解析器BeautifulSoup(mk,'hmtl5lib')pipinstallhtml5lib(3)HTML內容的遍歷方法①標簽樹的下行遍歷:2.3解析庫的使用.contents:子節(jié)點的列表,將<tag>所有兒子節(jié)點存入列表.children:子節(jié)點的迭代類型,與.contents類似,用于循環(huán)遍歷兒子節(jié)點.descendants:子孫節(jié)點的迭代類型,包含所有子孫節(jié)點,用于循環(huán)遍歷②標簽樹的上行遍歷:.parents:節(jié)點的父親標簽.parents:節(jié)點先輩標簽的迭代類型,用于循環(huán)遍歷先輩節(jié)點③標簽樹的平行遍歷:.next_sibling:返回按照HTML文本順序的下一個平行節(jié)點標簽.previous_sibling:返回按照HTML文本順序的上一個平行節(jié)點標簽.nest_siblings:迭代類型,返回按照HTML文本順序的后續(xù)所有平行節(jié)點標簽.previous_sibling:迭代類型,返回按照HTML文本順序的前續(xù)所有平行節(jié)點標簽(4)基本元素2.3解析庫的使用Tag:標簽,最基本的信息組織單元,分別用<></>標明開頭和結尾Name:標簽的名字,<p>..</p>的名字是‘p’,格式:<tag>.nameAttributes:標簽的屬性,字典形式組織,格式:<tag>.attrsNavigableString:標簽內非屬性字符串,<>..</>中字符串,格式:<tag>.stringComment:標簽內字符串的注釋部分,一種特殊的Comment類型(5)獲取標簽節(jié)點信息的方法2.3解析庫的使用獲取標簽節(jié)點信息方法說明<>.find()搜索且只返回一個結果,字符串類型,同.find_all()參數(shù)<>.find_parents()在先輩節(jié)點中搜索,返回列表類型,同.find_all()參數(shù)<>.find_parent()在先輩節(jié)點中返回一個結果,字符串類型,同.find_all()參數(shù)<>.find_next_siblings()在后續(xù)平行節(jié)點中搜索,返回列表類型,同.find_all()參數(shù)<>.find_next_sibling()在后續(xù)平行節(jié)點中返回一個結合,字符串類型,同.find_all()參數(shù)<>.find_previous_siblings()在前續(xù)平行節(jié)點中搜索,返回列表類型,同.find_all()參數(shù)<>.find_previous_sibling()在前續(xù)平行節(jié)點中返回一個結合,字符串類型,同.find_all()參數(shù)2.3解析庫的使用在進行網(wǎng)頁抓取的時候,分析定位html節(jié)點是獲取抓取信息的關鍵,目前我用的是lxml模塊(用來分析XML文檔結構的,當然也能分析html結構),利用其lxml.html的xpath對html進行分析,獲取抓取信息。2.3.2使用XPath來處理HTML(1)首先,我們需要安裝一個支持xpath的Python庫。(2)XPATH常用規(guī)則基本上是用一種類似目錄樹的方法來描述在XML文檔中的路徑。比如用“/”來作為上下層級間的分隔。第一個“/”表示文檔的根節(jié)點(注意:不是指文檔最外層的tag節(jié)點,而是指文檔本身)。比如對于一個HTML文件來說,最外層的節(jié)點應該是“/html”。pipinstalllxml2.3解析庫的使用表達式描述nodename選取測節(jié)點的所有子節(jié)點/從當前節(jié)點選取直接子節(jié)點//從當前節(jié)點選取子孫節(jié)點.選取當前節(jié)點..選取當前節(jié)點的父節(jié)點@選取屬性XPATH目錄樹2.3解析庫的使用XPATH代碼可見書,節(jié)選關鍵代碼如下:fromlxmlimportetreeetree_html=etree.HTML(html1)#自動補全網(wǎng)頁格式,并解析為xpath能解析的命令result=etree.tostring(etree_html)#查看自動補全后的網(wǎng)頁result_0=etree_html.xpath('//ul//a')#查找ul的間接子孫節(jié)點aresult_1=etree_html.xpath('//li[@class="first-li"]')#查找class為first_li的節(jié)點result_2=etree_html.xpath('//ul/li')#查找ul下的直接子節(jié)點liresult_3=etree_html.xpath('//ul/..')#查找ul的父節(jié)點divresult_4=etree_html.xpath('//ul//a/text()')#提取文本信息result_5=etree_html.xpath('//ul//a/@href')#提取屬性信息2.3解析庫的使用另外一點,若是在瀏覽器中,有直接獲取xpath的方法:F12開發(fā)者工具,找到對應的元素,在標簽上右鍵,就可以看到一個copyxpath直接復制即可。數(shù)據(jù)存儲042.4數(shù)據(jù)存儲經(jīng)過解析器解析出數(shù)據(jù)之后,接下來就是存儲數(shù)據(jù)了。保存的形式可以多種多樣,最簡單的形式是直接保存為文本文件,如TXT、JSON、CSV等。另外,還可以保存到數(shù)據(jù)庫中,如關系型數(shù)據(jù)庫MySQL、SQLite、Oracle、DB2等,非關系型數(shù)據(jù)庫MongoDB、Redis等。2.4.1存儲為JSON格式(1)讀取JSONPython中提供了簡單易用得JSON庫來實現(xiàn)JSON文件的讀寫操作,我們可以調用JSON庫的loads()方法將JSON文本字符串轉為JSON對象,可以通過dumps()方法將JSON對象轉換為文本字符串。例如,這里有一段JSON形式的字符串,它是str類型,用Python將其轉換為可操作的數(shù)據(jù)結構,如列表或字典:2.4數(shù)據(jù)存儲這里使用loads()方法將字符串轉為JSON對象。由于最外層是中括號,所以最終的類型是列表屬性。這樣一來,我們就可以用索引來獲取對應的內容了。例如,如果想取第一個元素里的name屬性,就可以使用如下方式:importjson

str='''[{"name":"Bob","gender":"male","birthday":"1992-02-21"},{"name":"Selian","gender":"female","birthday":"1994-04-12"}]'''

print(type(str))data=json.loads(str)print(data)print(type(data))2.4數(shù)據(jù)存儲這里我們嘗試獲取年齡age,其在原字典中該鍵名并不存在,此時默認會返回None。如果傳入第二個參數(shù)(即默認值),那么在不存在的情況下返回該默認值。data[0]['name']data[0].get('name')上面得到的結果都是:Bob。通過中括號加0索引,可以得到第一個字典元素,然后再調用其鍵名即可得到相應的鍵值。獲取鍵值時有兩種方式,一種是中括號加鍵名,另一種是通過get()方法傳入鍵名。這里推薦使用get()方法,這樣如果鍵名不存在,會返回None。另外,get()方法還可以傳入第二個參數(shù)(即默認值),實例如下:data[0]['age']data[0].get('age',25)運行結果如下:None252.4數(shù)據(jù)存儲值得注意的是,JSON的數(shù)據(jù)格式需要用雙引號來包圍,不能使用單引號。例如,若使用如下形式表示,則會出現(xiàn)錯誤importjson

str='''[{‘name’:’Bob’,‘gender’:’male’,‘

溫馨提示

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

評論

0/150

提交評論