知乎爬蟲之4:抓取頁面數(shù)據(jù)
git爬蟲項(xiàng)目地址( 終于上傳代碼了~~~~關(guān)注和star在哪里):https://github.com/MatrixSeven/ZhihuSpider(已完結(jié))
附贈(zèng)之前爬取的數(shù)據(jù)一份(mysql): 鏈接:https://github.com/MatrixSeven/ZhihuSpider/README.MD 只下載不點(diǎn)贊,不star,差評(píng)差評(píng)~藍(lán)瘦香菇)
本文由博主原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:知乎爬蟲之4:抓取頁面數(shù)據(jù)
咱們上一篇分析了知乎的登陸請(qǐng)求和如何拿到粉絲/關(guān)注的請(qǐng)求,那么咱們這篇就來研究下如何拿利用Jsoup到咱們想要的數(shù)據(jù)。
那么咱們說下,首先請(qǐng)求關(guān)注者和粉絲者是pcweb版本的,但是獲取頁面的是手機(jī)頁面的。
好,正題:
1.什么是Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。
2. HttpClient請(qǐng)求模擬
HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。
3.走起頁面
首先模擬手機(jī)瀏覽器的UA。就是讓咱們打開的頁面返回的是移動(dòng)端的頁面效果,那么最應(yīng)該怎么怎么做呢?其實(shí)服務(wù)器判定你是ie還是chrome還是firefox是根據(jù)請(qǐng)求頭里面的UA實(shí)現(xiàn)的,因此咱們要找一個(gè)手機(jī)瀏覽器的UA。。
咱們可以某度一下或者直接在瀏覽器里面直接f12,模擬移動(dòng)端,然后看請(qǐng)求參數(shù):
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
妥妥的沒問題:

那咱們?nèi)绾螌⑦@句體現(xiàn)到程序里面呢?
簡(jiǎn)單,在咱們拿到get對(duì)象后直接設(shè)置:
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如出一轍。
咱們直接對(duì)著頁面,右擊咱們想要的元素,選擇審查元素,然后用jq的選擇器選出來就好了。
可以參考jQuery 選擇器
4.拿到關(guān)注者
直接get咱們之前分析的請(qǐng)求地址
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
不過要記得替換用戶名字和在請(qǐng)求頭里加入cookie的最后一段zc_0
然后請(qǐng)求數(shù)據(jù)返回的是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": "阿里巴巴,分布式數(shù)據(jù)庫,",
"avatar_url": "https://pic1.zhimg.com/da8e974dc_is.jpg",
"is_following": false,
"is_org": false,
"follower_count": 14,
"badge": [],
"id": "ff02ea0544901a9ddfcb7ba60c73b673",
"articles_count": 0
}
]
}
這個(gè)數(shù)據(jù)包括了下次請(qǐng)求地址,上次請(qǐng)求地址,時(shí)候是開始,時(shí)候是結(jié)束,共有多少粉絲,關(guān)注人基本信息,
因此咱們可以在一個(gè)while里來獲得所有粉絲數(shù):
流程:
- 第一次獲取數(shù)據(jù)
- 獲取is_end字段
- 判斷is_end時(shí)候?yàn)閠rue
- 根據(jù)is_end判斷是否繼續(xù)循環(huán)
- 如果循環(huán),更新is_end,更新下次請(qǐng)求連接
一套下來,就能拿到一個(gè)用戶的所有粉絲了。

浙公網(wǎng)安備 33010602011771號(hào)