這是簡(jiǎn)易數(shù)據(jù)分析系列的第 12 篇文章。
本文首發(fā)于博客園:簡(jiǎn)易數(shù)據(jù)分析 12。
前面幾篇文章我們介紹了 Web Scraper 應(yīng)對(duì)各種翻頁(yè)的解決方法,比如說(shuō)修改網(wǎng)頁(yè)鏈接加載數(shù)據(jù)、點(diǎn)擊“更多按鈕“加載數(shù)據(jù)和下拉自動(dòng)加載數(shù)據(jù)。今天我們說(shuō)說(shuō)一種更常見的翻頁(yè)類型——分頁(yè)器。
本來(lái)想解釋一下啥叫分頁(yè)器,翻了一堆定義覺(jué)得很繁瑣,大家也不是第一年上網(wǎng)了,看張圖就知道了。我找了個(gè)功能最全的例子,支持?jǐn)?shù)字頁(yè)碼調(diào)整,上一頁(yè)下一頁(yè)和指定頁(yè)數(shù)跳轉(zhuǎn)。
今天我們就學(xué)學(xué),Web Scraper 怎么對(duì)付這種類型的網(wǎng)頁(yè)翻頁(yè)。
其實(shí)我們?cè)诒窘坛痰牡谝粋€(gè)例子,抓取豆瓣電影 TOP 排行榜中,豆瓣的這個(gè)電影榜單就是用分頁(yè)器分割數(shù)據(jù)的:
但當(dāng)時(shí)我們是找網(wǎng)頁(yè)鏈接規(guī)律抓取的,沒(méi)有利用分頁(yè)器去抓取。因?yàn)楫?dāng)一個(gè)網(wǎng)頁(yè)的鏈接變化規(guī)律時(shí),控制鏈接參數(shù)抓取是實(shí)現(xiàn)成本最低的;如果這個(gè)網(wǎng)頁(yè)進(jìn)可以翻頁(yè),但是鏈接的變化不是規(guī)律的,就得去會(huì)一會(huì)這個(gè)分頁(yè)器了。
說(shuō)這些理論有些枯燥,我們舉個(gè)翻頁(yè)鏈接不規(guī)律的例子。
8 月 2 日是蔡徐坤的生日,為了表達(dá)慶祝,在微博上粉絲們給坤坤刷了 300W 的轉(zhuǎn)發(fā)量,微博的轉(zhuǎn)發(fā)數(shù)據(jù)正好是用分頁(yè)器分割的,我們就分析一下微博的轉(zhuǎn)發(fā)信息頁(yè)面,看看這類數(shù)據(jù)怎么用 Web Scraper 抓取。
這條微博的直達(dá)鏈接是:
https://weibo.com/1776448504/I0gyT8aeQ?type=repost
看了他那么多的視頻,為了表達(dá)感激,我們可以點(diǎn)進(jìn)去出為坤坤加一份閱讀量。
首先我們看看第 1 頁(yè)轉(zhuǎn)發(fā)的鏈接,長(zhǎng)這個(gè)樣子:
第 2 頁(yè)長(zhǎng)這個(gè)樣子,注意到多了個(gè) #_rnd1568563840036
參數(shù):
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563840036
第 3 頁(yè)參數(shù)為 #_rnd1568563861839
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563861839
第 4 頁(yè)參數(shù)為 #_rnd1568563882276
:
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563882276
多看幾個(gè)鏈接你就可以發(fā)現(xiàn),這個(gè)轉(zhuǎn)發(fā)網(wǎng)頁(yè)的網(wǎng)址毫無(wú)規(guī)律可言,所以只能通過(guò)分頁(yè)器去翻頁(yè)加載數(shù)據(jù)。下面就開始我們的實(shí)戰(zhàn)教學(xué)環(huán)節(jié)。
1.創(chuàng)建 SiteMap
我們首先創(chuàng)建一個(gè) SiteMap,這次取名為 cxk
,起始鏈接為 https://weibo.com/1776448504/I0gyT8aeQ?type=repost。
2.創(chuàng)建容器的 selector
因?yàn)槲覀円c(diǎn)擊分頁(yè)器,外面的容器的類型我們選為 Element Click
,具體的參數(shù)解釋可以看下圖,我們之前在簡(jiǎn)易數(shù)據(jù)分析 08詳細(xì)解釋過(guò)一次,這里就不多言了。
container 的預(yù)覽是下圖的樣子:
分頁(yè)器選擇的過(guò)程可以參看下圖:
3.創(chuàng)建子選擇器
這幾個(gè)子選擇器都比較簡(jiǎn)單,類型都是文字選擇器,我們選擇了評(píng)論用戶名,評(píng)論內(nèi)容和評(píng)論時(shí)間三種類型的內(nèi)容。
4.抓取數(shù)據(jù)
按照 Sitemap cxk
-> Scrape
的操作路徑就可以抓取數(shù)據(jù)了。
5.一些問(wèn)題
如果你看了我上面的教程立馬去爬數(shù)據(jù),可能遇到的第一個(gè)問(wèn)題就是,300w 的數(shù)據(jù),難道我全部爬下來(lái)嗎?
聽上去也不太現(xiàn)實(shí),畢竟 Web Scraper 針對(duì)的數(shù)據(jù)量都是相對(duì)比較小的,幾萬(wàn)數(shù)據(jù)都算多的了,數(shù)據(jù)再大你就得考慮爬取時(shí)間是否太長(zhǎng),數(shù)據(jù)如何存儲(chǔ),如何應(yīng)對(duì)網(wǎng)址的反爬蟲系統(tǒng)(比如說(shuō)冷不丁的跳出一個(gè)驗(yàn)證碼,這個(gè) Web Scraper 是無(wú)能為力的)。
考慮到這個(gè)問(wèn)題,前面的自動(dòng)控制抓取數(shù)量的教程你又看過(guò)的話,可能想著用 :nth-of-type(-n+N)
控制抓取 N 條數(shù)據(jù)。如果你嘗試了,就會(huì)發(fā)現(xiàn)這個(gè)方法根本沒(méi)用。
失效的原因其實(shí)涉及到一點(diǎn)點(diǎn)網(wǎng)頁(yè)的知識(shí)了,感興趣的話可以看看下面的解釋,不感興趣可以直接看最后的結(jié)論。
像我前面介紹的點(diǎn)擊更多加載型網(wǎng)頁(yè)和下拉加載型網(wǎng)頁(yè),他們新加載的數(shù)據(jù),是在當(dāng)前頁(yè)面追加的,你一直下拉,數(shù)據(jù)一直加載,同時(shí)網(wǎng)頁(yè)的滾動(dòng)條會(huì)越來(lái)越短,這意味著所有的數(shù)據(jù)都在同一個(gè)頁(yè)面。
當(dāng)我們用 :nth-of-type(-n+N)
控制加載數(shù)量時(shí),其實(shí)相當(dāng)于在這個(gè)網(wǎng)頁(yè)設(shè)立一個(gè)計(jì)數(shù)器,當(dāng)數(shù)據(jù)一直累加到我們想要的數(shù)量時(shí),就會(huì)停止抓取。
但是對(duì)于使用翻頁(yè)器的網(wǎng)頁(yè),每次的翻頁(yè)相當(dāng)于刷新當(dāng)前網(wǎng)頁(yè),這樣每次都會(huì)設(shè)立一個(gè)計(jì)數(shù)器。
比如說(shuō)你想抓取 1000 條數(shù)據(jù),但是第 1 頁(yè)網(wǎng)頁(yè)只有 20 條數(shù)據(jù),抓到最后一條了,還差 980 條;然后一翻頁(yè),又設(shè)立一個(gè)新的計(jì)數(shù)器,抓完第 2 頁(yè)的最后一條數(shù)據(jù),還差 980,一翻頁(yè)計(jì)數(shù)器就重置,又變成 1000 了......所以這個(gè)控制數(shù)量的方法就失效了。
所以結(jié)論就是,如果翻頁(yè)器類型的網(wǎng)頁(yè)想提前結(jié)束抓取,只有斷網(wǎng)的這種方法。當(dāng)然,如果你有更好的方案,可以在評(píng)論里回復(fù)我,我們可以互相討論一下。
6.總結(jié)
分頁(yè)器是一種很常見的網(wǎng)頁(yè)分頁(yè)方法,我們可以通過(guò) Web Scraper 中的 Element click
處理這種類型的網(wǎng)頁(yè),并通過(guò)斷網(wǎng)的方法結(jié)束抓取。
7.推薦閱讀
簡(jiǎn)易數(shù)據(jù)分析 05 | Web Scraper 翻頁(yè)——控制鏈接批量抓取數(shù)據(jù)
簡(jiǎn)易數(shù)據(jù)分析 08 | Web Scraper 翻頁(yè)——點(diǎn)擊「更多按鈕」翻頁(yè)
簡(jiǎn)易數(shù)據(jù)分析 10 | Web Scraper 翻頁(yè)——抓取「滾動(dòng)加載」類型網(wǎng)頁(yè)
簡(jiǎn)易數(shù)據(jù)分析 09 | Web Scraper 自動(dòng)控制抓取數(shù)量 & Web Scraper 父子選擇器