實戰請看下一篇
爬蟲是我最喜歡乾的事了,把別人的東西拿到自己的手裏有一種江洋大盜的快感,後來爬多了。。。
這只是一種技術
初始爬蟲
問題:
什麼是爬蟲?參考鏈接
網絡爬蟲是一種按照一定的規則,自動地抓取網絡信息的程序或者腳本
爬蟲有什麼用?
① 網絡數據採集
② 大數據分析
③ 網頁分析
什麼工作原理?
首先來看網頁特徵
-
HTML
描繪網頁信息HTML是一種標記語言,用標籤標記內容並加以解析和區分。
瀏覽器的功能是將獲取到的HTML代碼進行解析,然後將原始的代碼轉變成我們直接看到的網站頁面。 使用
HTTP
/HTTPS
傳輸協議唯一的地址路徑
URL
所以我們可以拿到 URL
,通過使用 HTTP
/ HTTPS
傳輸協議來獲取整個 HTML
頁面,然後解析整個 HTML
就可以得到 HTML
中的數據
那麼對於一個程序員來說就是:
- 拿到要爬取的URL
- 發送
Request
請求
①.設置請求方式:GET、POST
②.請求的URL
③.請求頭
④.請求體
3.獲取 Response
數據
①.響應狀態:ResponseCode
②.響應頭:ResponseHeader
③.響應體:ResponseBody
4.數據解析
①.直接返回
②.json、xml解析
③.正則表達式
④.BeautifulSoup
⑤.Xpath
⑥.Lxml
⑦.html6lib
5.數據存儲
①.json、xml、txt直接保存
②.MySQL、SQL Server
③.MongoDB、Redis、Excel
④.file類型:image、video、mp3等等
爬蟲戰鬥
數據解析 BeautifulSoup 和 Lxml
Beautiful Soup
Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔爲用戶提供需要抓取的數據,因爲簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。
Beautiful Soup已成爲和lxml、html6lib一樣出色的python解釋器,爲用戶靈活地提供不同的解析策略或強勁的速度。
Lxml
Lxml是一個Python庫,使用它可以輕鬆處理XML和HTML文件,還可以用於web爬取。市面上有很多現成的XML解析器,但是爲了獲得更好的結果,開發人員有時更願意編寫自己的XML和HTML解析器。這時lxml庫就派上用場了。這個庫的主要優點是易於使用,在解析大型文檔時速度非常快,歸檔的也非常好,並且提供了簡單的轉換方法來將數據轉換爲Python數據類型,從而使文件操作更容易。
Beautiful Soup 和 Lxml 對比
兩個我都嘗試過 lxml比beautifulSoup速度更快,容錯和處理能力更強,
還有另外一點lxml可以使用Xpath
所以我後面使用lxml
Beautiful Soup
pip3 install beautifulsoup4
Lxml安裝
pip3 install lxml
Xpath語法 Xpath教程
認識Xpath
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
XPath 是 W3C XSLT 標準的主要元素,並且 XQuery 和 XPointer 都構建於 XPath 表達之上。
因此,對 XPath 的理解是很多高級 XML 應用的基礎。
說白了 Xpath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和我們在常規的電腦文件系統中看到的表達式非常相似。
選取節點
XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿着路徑或者 step 來選取的。
下面列出了最有用的路徑表達式:
表達式 | 描述 |
---|---|
nodename | 選取此節點的所有子節點。 |
/ | 從根節點選取。 |
// | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 |
. | 選取當前節點。 |
.. | 選取當前節點的父節點。 |
@ | 選取屬性。 |
在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:
路徑表達式 | 結果 |
---|---|
bookstore | 選取 bookstore 元素的所有子節點。 |
/bookstore | 選取根元素 bookstore。 註釋:假如路徑起始於正斜槓( bookstore/book ),選取屬於 bookstore 的子元素的所有 book 元素。 |
//book | 選取所有 book 子元素,而不管它們在文檔中的位置。 |
bookstore//book | 選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麼位置。 |
//@lang | 選取名爲 lang 的所有屬性。 |
謂語(Predicates)
謂語用來查找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括號中。
實例
在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:
路徑表達式 | 結果 |
---|---|
/bookstore/book[1] | 選取屬於 bookstore 子元素的第一個 book 元素。 |
/bookstore/book[last()] | 選取屬於 bookstore 子元素的最後一個 book 元素。 |
/bookstore/book[last()-1] | 選取屬於 bookstore 子元素的倒數第二個 book 元素。 |
/bookstore/book[position()<3] | 選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 選取所有擁有名爲 lang 的屬性的 title 元素。 |
//title[@lang='eng'] | 選取所有 title 元素,且這些元素擁有值爲 eng 的 lang 屬性。 |
/bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。 |
選取未知節點
XPath 通配符可用來選取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素節點。 |
@* | 匹配任何屬性節點。 |
node() | 匹配任何類型的節點。 |
實例
在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:
路徑表達式 | 結果 |
---|---|
/bookstore/* | 選取 bookstore 元素的所有子元素。 |
//* | 選取文檔中的所有元素。 |
//title[@*] | 選取所有帶有屬性的 title 元素。 |
選取若干路徑
通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
實例
在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:
路徑表達式 | 結果 |
---|---|
//book/title - //book/price | 選取 book 元素的所有 title 和 price 元素。 |
//title - //price | 選取文檔中的所有 title 和 price 元素。 |
/bookstore/book/title - //price | 選取屬於 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。 |