天天看點

java爬蟲抓取資料難在哪裡_知乎爬蟲之4:抓取頁面資料

git爬蟲項目位址( 終于上傳代碼了~~~~關注和star在哪裡):MatrixSeven/ZhihuSpider

本文由部落客原創,轉載請注明出處:知乎爬蟲之4:抓取頁面資料

咱們上一篇分析了知乎的登陸請求和如何拿到粉絲/關注的請求,那麼咱們這篇就來研究下如何拿利用Jsoup到咱們想要的資料。

那麼咱們說下,首先請求關注者和粉絲者是pcweb版本的,但是擷取頁面的是手機頁面的。

好,正題:

1.什麼是Jsoup

jsoup 是一款Java 的HTML解析器,可直接解析某個URL位址、HTML文本内容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作資料。

2. HttpClient請求模拟

HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協定的用戶端程式設計工具包,并且它支援 HTTP 協定最新的版本和建議。

3.走起頁面

首先模拟手機浏覽器的UA。就是讓咱們打開的頁面傳回的是移動端的頁面效果,那麼最應該怎麼怎麼做呢?其實伺服器判定你是ie還是chrome還是firefox是根據請求頭裡面的UA實作的,是以咱們要找一個手機浏覽器的UA。。

咱們可以某度一下或者直接在浏覽器裡面直接f12,模拟移動端,然後看請求參數:

User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36

妥妥的沒問題:

那咱們如何将這句展現到程式裡面呢?

簡單,在咱們拿到get對象後直接設定:

httpGet.setHeader("User-Agent", "Mozilla/5.0

(Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36");

就ok了,然後咱們就可以用jsoup來拿咱們想要的元素了,jsoup的文法和jq如出一轍。

咱們直接對着頁面,右擊咱們想要的元素,選擇審查元素,然後用jq的選擇器選出來就好了。

可以參考jQuery 選擇器

4.拿到關注者

直接get咱們之前分析的請求位址

https://www.zhihu.com/api/v4/members/Sweets07/followers?per_page=10&

include=data%5B%2A%5D.employments%2Ccover_url%2Callow_message%2Canswer_coun

t%2Carticles_count%2Cfavorite_count%2Cfollower_count%2Cgender%2Cis_followe

d%2Cmessage_thread_token%2Cis_following%2Cbadge%5B%3F%28type%3Dbest_answerer

%29%5D.topics&limit=10&offset=30

不過要記得替換使用者名字和在請求頭裡加入cookie的最後一段zc_0

然後請求資料傳回的是json

{

"paging": {

"is_end": false,

"next": "https://www.zhihu.com/api/v4/members/Sweets07/followers?per_page=10&include=data%5B%2A%5D.answer_count%2Carticles_count%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=10&offset=20",

"previous": "https://www.zhihu.com/api/v4/members/Sweets07/followers?per_page=10&include=data%5B%2A%5D.answer_count%2Carticles_count%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=10&offset=0",

"is_start": false,

"totals": 398

},

"data": [

{

"is_followed": true,

"avatar_url_template": "https://pic1.zhimg.com/da8e974dc_{size}.jpg",

"name": "陳曉峰",

"url": "",

"type": "people",

"user_type": "people",

"answer_count": 0,

"url_token": "chen-xiao-feng-84",

"headline": "阿裡巴巴,分布式資料庫,",

"avatar_url": "https://pic1.zhimg.com/da8e974dc_is.jpg",

"is_following": false,

"is_org": false,

"follower_count": 14,

"badge": [],

"id": "ff02ea0544901a9ddfcb7ba60c73b673",

"articles_count": 0

}

]

}

這個資料包括了下次請求位址,上次請求位址,時候是開始,時候是結束,共有多少粉絲,關注人基本資訊,

是以咱們可以在一個while裡來獲得所有粉絲數:

流程:第一次擷取資料

擷取is_end字段

判斷is_end時候為true

根據is_end判斷是否繼續循環

如果循環,更新is_end,更新下次請求連接配接

一套下來,就能拿到一個使用者的所有粉絲了。