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


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

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

可是,為什么學了python之后,依舊寫不了爬蟲呢?

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

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

什么是爬蟲的套路?

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

只要網頁上有的,都可以通過爬蟲爬取下來。

一般而言,python爬蟲需要以下幾步:

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

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

網頁請求意思是把網頁的HTML源碼下載下來,以知乎首頁為例,一般長這樣:

網頁的信息包含在源碼里,比如圖中的標題“首頁-知乎”。

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

一、找到需要爬取網頁的URL

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

我們需要爬取四個信息:

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

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

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

打開本問題的網頁:

按F12鍵進入開發者頁面:

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

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

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

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

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

如果你不懂什么是html?為甚么爬信息需要看html?請先看這篇回答:

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM