使用requests爬蟲簡單獲取知乎問題信息

爬蟲幾乎已經成爲python學習大軍中最爲龐大的一支,沒有之一。html

我很是贊同以爬蟲的目的來學習python,或者用python來實現爬蟲。python

但是,爲何學了python以後,依舊寫不了爬蟲呢?chrome

最主要的緣由,你沒有理解python爬蟲的套路!

沒有案例的回答都是騙流量,這一次就來爬一爬本提問的一些信息:瀏覽器

什麼是爬蟲的套路?

爬蟲通俗來講就是抓取網頁數據,好比說你們都喜歡的妹子圖、小視頻呀,還有電子書、文字評論、商品詳情等等。服務器

只要網頁上有的,均可以經過爬蟲爬取下來。python爬蟲

通常而言,python爬蟲須要如下幾步:函數

  1. 找到須要爬取內容的網頁URL
  2. 打開該網頁的檢查頁面(即查看HTML代碼,按F12快捷鍵便可進入)
  3. 在HTML代碼中找到你要提取的數據
  4. 寫python代碼進行網頁請求、解析
  5. 存儲數據

在默認你已經有python基礎的前提下,來講一說如何寫代碼進行網頁請求、解析。學習

網頁請求意思是把網頁的HTML源碼下載下來,以知乎首頁爲例,通常長這樣:url

網頁的信息包含在源碼裏,好比圖中的標題「首頁-知乎」。3d

好了,接下來咱們一步步按照套路把本問題的信息都爬下來!

1、找到須要爬取網頁的URL

這個很容易,該問題的url:https://www.zhihu.com/question/21358581

咱們須要爬取四個信息:

  • 問題描述
  • 問題補充
  • 關注者數
  • 被瀏覽數

2、打開該網頁的檢查頁面

推薦使用chrome瀏覽器實踐,會和本文操做同步。

打開本問題的網頁:

按F12鍵進入開發者頁面:

3、在HTML代碼中找到你要提取的數據

點擊開發者頁面左上角的‘選擇元素’箭頭:

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

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

咱們要爬取的第一個信息已經找到,按照上面步驟,能夠找到其它三個信息在html中的位置。

若是你不懂什麼是html?爲甚麼爬信息須要看html?請先看這篇回答:

如何入門 Python 爬蟲?​www.zhihu.com圖標

4、寫python代碼進行網頁請求、解析

這一步多是你們最最關心的,由於涉及到python代碼。

其實這裏對python的要求也僅限於你須要會數據類型、變量、運算符、函數、模塊之類的簡單語法。

由於咱們會用到好幾個第三方庫,幫助咱們完成網頁請求、解析的工做,你須要作的是知道這些庫的使用方法。

若是你對這個過程仍感迷惑,仍推薦先看這篇回答:

如何入門 Python 爬蟲?​www.zhihu.com圖標

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)

最終呈現的結果:

image

所有代碼:

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的使用,爬蟲也就能入門了。

相關文章
相關標籤/搜索