爬蟲幾乎已經成為python學習大軍中最為龐大的一支,沒有之一。
我非常贊同以爬蟲的目的來學習python,或者用python來實現爬蟲。
可是,為什么學了python之后,依舊寫不了爬蟲呢?
最主要的原因,你沒有理解python爬蟲的套路!
沒有案例的回答都是騙流量,這一次就來爬一爬本提問的一些信息:

什么是爬蟲的套路?
爬蟲通俗來說就是抓取網頁數據,比如說大家都喜歡的妹子圖、小視頻呀,還有電子書、文字評論、商品詳情等等。
只要網頁上有的,都可以通過爬蟲爬取下來。
一般而言,python爬蟲需要以下幾步:
- 找到需要爬取內容的網頁URL
- 打開該網頁的檢查頁面(即查看HTML代碼,按F12快捷鍵即可進入)
- 在HTML代碼中找到你要提取的數據
- 寫python代碼進行網頁請求、解析
- 存儲數據

在默認你已經有python基礎的前提下,來說一說如何寫代碼進行網頁請求、解析。
網頁請求意思是把網頁的HTML源碼下載下來,以知乎首頁為例,一般長這樣:

網頁的信息包含在源碼里,比如圖中的標題“首頁-知乎”。
好了,接下來我們一步步按照套路把本問題的信息都爬下來!

一、找到需要爬取網頁的URL
這個很容易,該問題的url:https://www.zhihu.com/question/21358581
我們需要爬取四個信息:
- 問題描述
- 問題補充
- 關注者數
- 被瀏覽數
二、打開該網頁的檢查頁面
推薦使用chrome瀏覽器實踐,會和本文操作同步。
打開本問題的網頁:

按F12鍵進入開發者頁面:

三、在HTML代碼中找到你要提取的數據
點擊開發者頁面左上角的‘選擇元素’箭頭:

然后再點擊網頁上的問題描述,這時候開發者界面上出現HTML源碼:

你想要的問題描述文字,就藏在html源碼里:

我們要爬取的第一個信息已經找到,按照上面步驟,可以找到其它三個信息在html中的位置。
如果你不懂什么是html?為甚么爬信息需要看html?請先看這篇回答:
四、寫python代碼進行網頁請求、解析
這一步可能是大家最最關心的,因為涉及到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的使用,爬蟲也就能入門了。



