爬蟲幾乎已經成爲python學習大軍中最爲龐大的一支,沒有之一。html
我很是贊同以爬蟲的目的來學習python,或者用python來實現爬蟲。python
但是,爲何學了python以後,依舊寫不了爬蟲呢?chrome
沒有案例的回答都是騙流量,這一次就來爬一爬本提問的一些信息:瀏覽器
爬蟲通俗來講就是抓取網頁數據,好比說你們都喜歡的妹子圖、小視頻呀,還有電子書、文字評論、商品詳情等等。服務器
只要網頁上有的,均可以經過爬蟲爬取下來。python爬蟲
通常而言,python爬蟲須要如下幾步:函數
在默認你已經有python基礎的前提下,來講一說如何寫代碼進行網頁請求、解析。學習
網頁請求意思是把網頁的HTML源碼下載下來,以知乎首頁爲例,通常長這樣:url
網頁的信息包含在源碼裏,好比圖中的標題「首頁-知乎」。3d
好了,接下來咱們一步步按照套路把本問題的信息都爬下來!
這個很容易,該問題的url:https://www.zhihu.com/question/21358581
咱們須要爬取四個信息:
推薦使用chrome瀏覽器實踐,會和本文操做同步。
打開本問題的網頁:
按F12鍵進入開發者頁面:
點擊開發者頁面左上角的‘選擇元素’箭頭:
而後再點擊網頁上的問題描述,這時候開發者界面上出現HTML源碼:
你想要的問題描述文字,就藏在html源碼裏:
咱們要爬取的第一個信息已經找到,按照上面步驟,能夠找到其它三個信息在html中的位置。
若是你不懂什麼是html?爲甚麼爬信息須要看html?請先看這篇回答:
這一步多是你們最最關心的,由於涉及到python代碼。
其實這裏對python的要求也僅限於你須要會數據類型、變量、運算符、函數、模塊之類的簡單語法。
由於咱們會用到好幾個第三方庫,幫助咱們完成網頁請求、解析的工做,你須要作的是知道這些庫的使用方法。
若是你對這個過程仍感迷惑,仍推薦先看這篇回答:
Part 1
這裏用到的用於網頁請求的庫是requests,一個很是流行的http請求庫。
這裏請求的是什麼?不是原諒、也不是理解,而是網頁的html信息。
服務器收到請求後,會返回相應的網頁對象。
Requests庫會自動解碼來自服務器的內容,大多數 unicode 字符集都能被無縫地解碼。
這一切requests都能妥妥地搞定。
咱們來嘗試下:
import requests headers = {'User-Agent':你的瀏覽器headers} # 傳入url和請求頭 r = requests.get('https://www.zhihu.com/question/21358581',headers=headers) # 響應的內容 print(r.text)
咱們會接收到服務器返回的頁面,requests解析後,呈現下面這樣子:
這就是咱們須要的html源碼呀!
接下來要作的就是從html中抽取咱們須要的四個信息。
Part 2
經過網頁請求,咱們獲取到響應的html文檔,咱們須要的東西都在這個文檔裏。
可是怎麼去抽取信息呢?
XPath 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷。
這裏用到另外一個有用的庫xpath,xpath庫可讓你輕鬆的使用XPath語言查找信息。
既然XPath是在XML文檔中才能起做用,然而咱們剛剛獲取的html只是文本字符串。
因此須要把html文檔轉換爲XPath能夠解析的對象:lxml.etree._Element
(xml/html文件樹中的一個節點)。
接着上面代碼:
# 將html文檔轉換爲XPath能夠解析的 s = etree.HTML(r.text)
Part 3
這下咱們可使用xpath庫來進行信息的提取了。
xpath的使用方法這裏不贅述了,你們能夠網上搜搜資料,個半小時也能學會。
這裏介紹一種簡單的方法,你在開發者頁面中找到對應信息的源碼後,直接右鍵複製xpath地址:
但複製的xpath頗有可能會致使獲取的信息爲空,因此我這裏用標籤的屬性來獲取對應文本。
接上面代碼:
# 獲取問題內容 q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0] # 獲取問題描述 q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0] # 獲取關注數和瀏覽量,這兩個屬性同樣 q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()') concern_num = q_number[0] browing_num = q_number[1] # 打印 print('問題:',q_content,'\n','描述:',q_describe,'\n','關注數:',concern_num,'\n','瀏覽量:',browing_num)
最終呈現的結果:
import requests from lxml import etree headers = {'User-Agent':你的瀏覽器headers} r = requests.get('https://www.zhihu.com/question/21358581',headers=headers) s = etree.HTML(r.text) # 獲取問題內容 q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0] # 獲取問題描述 q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0] # 獲取關注數和瀏覽量,這兩個屬性同樣 q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()') concern_num = q_number[0] browing_num = q_number[1] # 打印 print('問題:',q_content,'\n','描述:',q_describe,'\n','關注數:',concern_num,'\n','瀏覽量:',browing_num)
好了,關於這個問題的信息已經經過python爬下來。
初學的小夥伴本身嘗試再多爬些內容,練習requests和xpath的使用,爬蟲也就能入門了。