為了照顧更多的小伙伴,大家的學習能力及了解程度都不同,因此大家可以通過以下目錄來有選擇性的學習,節約大家的時間。
備注: 一定要實操!!!
一定要實操!!!
一定要實操!!!
目錄:
#了解和介紹
#下載及安裝說明
#工欲善其事必先利其器
#簡單嘗試(初期用法)案例解析:百度貼吧NBA吧話題爬取
#初級用法(控制鏈接完成批量爬蟲)進階 案例解析:豆瓣電影TOP250名稱爬取
#中級用法(同步完成多項參數爬蟲)進階 案例解析:豆瓣電影TOP250名稱爬取
#高級進階(完成動態類(翻頁;滾動加載))爬蟲
#了解和介紹
相信能看到這篇文章的小伙伴們應該多多少少對web scraper有些了解,在這里就不再過度闡述。
首先先簡單介紹一下web scraper(web scraper 網頁刮板)插件
是一款瀏覽器插件,或者是一款應用程序,用於簡單的非代碼工程化的爬蟲工具,當然正是因為如此所以它的缺點便是對大規模的(數據集大、網頁復雜)爬蟲工程較為吃力,優點便是簡單易操作,能滿足小白的日常爬蟲需求。
#下載及安裝說明
其實一直一來web scraper是Googled的插件,但是因為Google下載商場在國內受到限制,所以為了節約時間我就不介紹Goog瀏覽器如何下載此插件(感興趣的可自行查閱相關的資料,有很多)。
而FireFox瀏覽器插件可以正常在國內訪問及安裝,並且適配環境和Google瀏覽器一致,所以建議大家下載Firefox瀏覽器來使用web scraper插件。
1.下載安裝Firefox瀏覽器(地址:https://www.mozilla.org/zh-CN/firefox/download/thanks/)
2.打開瀏覽器,點擊右上角菜單欄,找到附加組件選項
3.進入附加組件管理器,左側選擇欄選擇組件,搜索欄內搜索 web scraper,點擊添加到Firefox即可,插件安裝成功后,Firefox瀏覽器右上角便會顯示web scraper圖標,這表示安裝成功了。
#工欲善其事必先利其器(后面的都要認真學了哦)
首先使用插件需要打開瀏覽器的開發者后台(想深入了解的小伙伴可以打開https://www.cnblogs.com/mojita/p/5769350.html學習)
如何打開呢,首先定格在瀏覽器頁面,然后按 F12
就可以實現(QQ 瀏覽器 F12
被禁掉了)。有的電腦需要fn+f12,Mac 電腦也可以用 option
+ command
+ I
打開,Win 電腦可以用 Ctrl
+ Shift
+ I
打開。
打開后會發現工具欄最右側出現web scraper圖標,點擊后便進入web scraper插件,爬蟲工作就從這里展開了!
打開后發現有三個工作欄:
先介紹以下URL:統一資源定位符,說白了就是一個網頁地址,常用的https://www.baidu.com/ 這便是一個URL
sitemaps:網站地圖
create new sitemap:創建新的網站地圖
create new sitemap子工作欄:
create sitemap (創建網站地圖),打開后會name和URL選項
import sitemap (導入網站地圖),打開后會有個Sitemap JSON的選項,顧名思義,這個選項需要我們自主添加json來創建網站地圖,(后面會學習到)
好了,先知道這么多即可,下面開始我們的web scraper爬蟲進階,沖啊
今天我們開始數據抓取的第一課,完成我們的第一個爬蟲。因為是剛剛開始,操作我會講的非常詳細,可能會有些啰嗦,希望各位不要嫌棄啊:)
有人之前可能學過一些爬蟲知識,總覺得這是個復雜的東西,什么 HTTP、HTML、IP 池,在這里我們都不考慮這些東西。一是小的數據量根本不需要考慮,二是這些亂七八糟的東西根本沒有說到爬蟲的本質。
爬蟲的本質是什么?其實就是找規律。
而且爬蟲的找規律難度,大部分都是小學三年級的數學題水平。
我們下面拿個例子說明一下,下圖歷史文章的一個截圖,我們可以很清晰的看到,每一條推文可以分為三大部分:標題、圖片和作者,我們只要找到這個規律,就可以批量的抓取這類數據。
好了,理論的地方我們講完了,下面我們開始進行實操。
但凡做爬蟲練手,第一個爬取的網站一般都是豆瓣電影 TOP 250,網址鏈接是 https://movie.douban.com/top250?start=0&filter=。第一次上手,我們爬取的內容盡量簡單,所以我們只爬取第一頁的電影標題。
瀏覽器按 F12
打開控制台,並把控制台放在網頁的下方(具體操作可以看上一篇文章),然后找到 Web Scraper 這個 Tab,點進去就來到了 Web Scraper 的控制頁面。
進入 Web Scraper 的控制頁面后,我們按照 Create new sitemap
-> Create Sitemap
的操作路徑,創建一個新的爬蟲,sitemap
是啥意思並不重要,你就當他是個爬蟲的別名就好了。
我們在接下來出現的輸入框里依次輸入爬蟲名和要爬取的鏈接。
爬蟲名可能會有字符類型的限制,我們看一下規則規避就好了,最后點擊 Create Sitemap
這個按鈕,創建我們的第一個爬蟲。
這時候會跳到一個新的操作面板,不要管別的,我們直接點擊 Add new selector
這個藍底白字的按鈕,顧名思義,創建一個選擇器,用來選擇我們想要抓取的元素。
這時候就要開始正式的數據抓取環節了!我們先觀察一下這個面板有些什么東西:
1.首先有個 Id,這個就是給我們要爬取的內容標注一個 id,因為我們要抓取電影的名字,簡單起見就取個 name 吧;
2.電影名字很明顯是一段文字,所以 Type 類型肯定是 Text,在這個爬蟲工具里,默認 Type 類型就是 Text,這次的爬取工作就不需要改動了;
3.我們把多選按鈕 Multiple 勾選上,因為我們要抓的是批量的數據,不勾選的話只能抓取一個;
4.最后我們點擊黃色圓圈里的 Select,開始在網頁上勾選電影名字;
當你把鼠標移動到網頁時,會發現網頁上出現了綠色的方塊兒,這些方塊就是網頁的構成元素,當我們點擊鼠標時,綠色的方塊兒就會變為紅色,表示這個元素被選中了:
這時候我們就可以進行我們的抓取工作了。
我們先選擇「肖生克的救贖」這個標題,然后再選擇「霸王別姬」這個標題(注意:想達到多選的效果,一定要手動選取兩個以上的內容)
選完這兩個標題后,向下拉動網頁,你就會發現所有的電影名字都被選中了:
拉動網頁檢查一遍,發現所有的電影標題都被選中后,我們就可以點擊 Done selecting!
這個按鈕,表示選擇完畢;
點擊按鈕后你會發現下圖的紅框位置會出現了一些字符,一般出現這個就表示選取成功了:
我們點擊 Data preview
這個按鈕,就可以預覽我們的抓取效果了:
沒什么問題的話,關閉 Data Preview 彈窗,翻到面板的最下面,有個 Save selector
的藍色按鈕,點擊后我們會回退到上一個面板。
這時候你會發現多了一行數據,其實就是我們剛剛的操作內容被記錄下來了。
在頂部的 tab 欄,有一個 Sitemap top250
的 tab,這個就是我們剛剛創建的爬蟲。點擊它,再點擊下拉菜單里的 Scrape
按鈕,開始我們的數據抓取。
這時候你會跳到另一個面板,里面有兩個輸入框,先別管他們是什么,全部輸入 2000 就好了。
點擊
Start scraping
藍色按鈕后,會跳出一個新的網頁,Web Scraper
插件會在這里進行數據抓取:
一般彈出的網頁自動關閉就代表着數據抓取結束了,我們點擊面板上的 refresh
藍色按鈕,就可以看到我們抓取的數據了!
在這個預覽面板上,第一列是 web scraper 自動添加的編號,沒啥意義;第二列是抓取的鏈接,第三列就是我們抓取的數據了。
這個數據會存儲在我們的瀏覽器里,我們也可以點擊 Sitemap top250
下的 Export data as CSV
,這樣就可以導出成 .csv
格式的數據,這種格式可以用 Excel 打開,我們可以用 Excel 做一些數據格式化的操作。
今天我們爬取了豆瓣電影TOP250 的第 1 頁數據(也就是排名最高的 25 部電影),下一篇我們講講,如何抓取所有的電影名。
上篇文章我們爬取了豆瓣電影 TOP250 前 25 個電影的數據,今天我們就要在原來的 Web Scraper 配置上做一些小改動,讓爬蟲把 250 條電影數據全部爬取下來。
前面我們同時說了,爬蟲的本質就是找規律,當初這些程序員設計網頁時,肯定會依循一些規則,當我們找到規律時,就可以預測他們的行為,達到我們的目的。
今天我們就找找豆瓣網站的規律,想辦法抓取全部數據。今天的規律就從常常被人忽略的網址鏈接開始。
1.鏈接分析
我們先看看第一頁的豆瓣網址鏈接:
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com
這個很明顯就是個豆瓣的電影網址,沒啥好說的top250
這個一看就是網頁的內容,豆瓣排名前 250 的電影,也沒啥好說的?
后面有個start=0&filter=
,根據英語提示來看,好像是說篩選(filter),從 0 開始(start)
再看看第二頁的網址鏈接,前面都一樣,只有后面的參數變了,變成了 start=25
,從 25 開始;
我們再看看第三頁的鏈接,參數變成了 start=50
,從 50 開始;
分析 3 個鏈接我們很容易得出規律:
start=0,表示從排名第 1 的電影算起,展示 1-25 的電影
start=25,表示從排名第 26 的電影算起,展示 26-50 的電影
start=50,表示從排名第 51 的電影算起,展示 51-75 的電影
…...
start=225,表示從排名第 226 的電影算起,展示 226-250 的電影
規律找到了就好辦了,只要技術提供支持就行。隨着深入學習,你會發現 Web Scraper 的操作並不是難點,最需要思考的其實還是這個找規律。
2.Web Scraper 控制鏈接參數翻頁
Web Scraper 針對這種通過超鏈接數字分頁獲取分頁數據的網頁,提供了非常便捷的操作,那就是范圍指定器。
比如說你想抓取的網頁鏈接是這樣的:
http://example.com/page/1
http://example.com/page/2
http://example.com/page/3
你就可以寫成 http://example.com/page/[1-3],把鏈接改成這樣,Web Scraper 就會自動抓取這三個網頁的內容。
當然,你也可以寫成 http://example.com/page/[1-100],這樣就可以抓取前 100 個網頁。
那么像我們之前分析的豆瓣網頁呢?它不是從 1 到 100 遞增的,而是 0 -> 25 -> 50 -> 75 這樣每隔 25 跳的,這種怎么辦?
http://example.com/page/0
http://example.com/page/25
http://example.com/page/50
其實也很簡單,這種情況可以用 [0-100:25]
表示,每隔 25 是一個網頁,100/25=4,爬取前 4 個網頁,放在豆瓣電影的情景下,我們只要把鏈接改成下面的樣子就行了;
https://movie.douban.com/top250?start=[0-225:25]&filter=
這樣 Web Scraper 就會抓取 TOP250 的所有網頁了。
3.抓取數據
解決了鏈接的問題,接下來就是如何在 Web Scraper 里修改鏈接了,很簡單,就點擊兩下鼠標:
1.點擊 Stiemaps
,在新的面板里點擊 ID 為 top250
的這列數據:
2.進入新的面板后,找到 Stiemap top250
這個 Tab,點擊,再點擊下拉菜單里的 Edit metadata
:
3.修改原來的網址,圖中的紅框是不同之處:
修改好了超鏈接,我們重新抓取網頁就好了。操作和上文一樣,我這里就簡單復述一下:
- 點擊
Sitemap top250
下拉菜單里的Scrape
按鈕 - 新的操作面板的兩個輸入框都輸入 2000
- 點擊
Start scraping
藍色按鈕開始抓取數據 - 抓取結束后點擊面板上的
refresh
藍色按鈕,檢測我們抓取的數據
如果你操作到這里並抓取成功的話,你會發現數據是全部抓取下來了,但是順序都是亂的。
我們這里先不管順序問題,因為這個屬於數據清洗的內容了,我們現在的專題是數據抓取。先把相關的知識點講完,再攻克下一個知識點,才是更合理的學習方式。
這期講了通過修改超鏈接的方式抓取了 250 個電影的名字。下一期我們說一些簡單輕松的內容換換腦子,講講 Web Scraper 如何導入別人寫好的爬蟲文件,導出自己寫好的爬蟲軟件。
上兩期我們學習了如何通過 Web Scraper 批量抓取豆瓣電影 TOP250 的數據,內容都太干了,今天我們說些輕松的,講講 Web Scraper 如何導出導入 Sitemap 文件。
前面也沒有說,SItemap 是個什么東西,其實它就是我們操作 Web Scraper 后生成的爬蟲文件,相當於 python 爬蟲的源代碼,導入 Web Scraper 一運行就可以爬取數據。學習了這一章節,就可以分享我們的設置好的爬蟲文件了。
導出 Sitemap
導出 Sitemap 很簡單,比如說我們創建的 top250 Sitemap,點擊 Sitemap top250
,在下拉菜單里選擇 Export Sitemap
,就會跳到一個新的面板。
新的面板里有我們創建的 top250 的 Sitemap 信息,我們把它復制下來,再新建一個 TXT 文件,粘貼保存就好了。
導入 Sitemap
導入 Sitemap 也很簡單,在創建新的 Sitemap 時,點擊 Import Sitemap
就好了。
在新的面板里,在 Sitemap JSON
里把我們導出的文字復制進去,Rename Sitemap
里取個名字,最后點擊 Import Sitemap
按鈕就可以了。
這期我們介紹了 Web Scraper 如何導入導出 Sitemap 爬蟲文件,下一期我們對上一期的內容進行擴展,不單單抓取 250 個電影名,還要抓取每個電影對應的排名,名字,評分和一句話影評。
在第 4 篇文章里,我講解了如何抓取單個網頁里的單類信息;
在第 5 篇文章里,我講解了如何抓取多個網頁里的單類信息;
今天我們要講的是,如何抓取多個網頁里的多類信息。
這次的抓取是在簡易數據分析 05的基礎上進行的,所以我們一開始就解決了抓取多個網頁的問題,下面全力解決如何抓取多類信息就可以了。
我們在實操前先把邏輯理清:
上幾篇只抓取了一類元素:電影名字。這期我們要抓取多類元素:排名,電影名,評分和一句話影評。
根據 Web Scraper 的特性,想抓取多類數據,首先要抓取包裹多類數據的容器,然后再選擇容器里的數據,這樣才能正確的抓取。我畫一張圖演示一下:
我們首先要抓取多個 container(容器),再抓取 container 里的元素:編號、電影名、評分和一句話影評,當爬蟲運行完后,我們就會成功抓取數據。
概念上搞清楚了,我們就可以講實際操作了。
如果對以下的操作有疑問,可以看 簡易數據分析 04 的內容,那篇文章詳細圖解了如何用 Web Scraper 選擇元素的操作
1.點擊 Stiemaps
,在新的面板里點擊 ID 為 top250
的這列數據
2.刪除掉舊的 selector,點擊 Add new selector
增加一個新的 selector
3.在新的 selector 內,注意把 Type 類型改為 Element(元素),因為在 Web Scraper 里,只有元素類型才能包含多個內容。
我們勾選的元素區域如下圖所示,確認無誤后點擊 Save selector 按鈕,就會回退到上一個操作面板。
在新的面板里,點擊剛剛創建的 selector 那行數據:
點擊后我們就會進入一個新的面板,根據導航我們可知在 container 內部。
在新的面板里,我們點擊 Add new selector,新建一個 selector,用來抓取電影名,類型為 Text,值得注意的是,因為我們是在 container 內選擇文字的,一個 container 內只有一個電影名,所以多選不要勾選,要不然會抓取失敗。
選擇電影名的時候你會發現 container 黃色高亮,我們就在黃色的區域里選擇電影名就好了。
點擊 Save selector 保存選擇器后,我們再創建三個選擇器,分別選擇編號、評分和一句話影評,因為操作和上面一模一樣,我這里就省略講解了。
排名編號:
評分:
一句話影評:
我們可以在面板里觀察我們選擇的多個元素,一共有四個元素:分別為 name、number、score 和 review,類型都是 Text,不需要多選,父選擇器都是 container。
我們可以點擊 點擊 Stiemap top250
下的 selector graph
,查看我們爬蟲選擇元素的層級關系,確認正確后我們再點擊 Stiemap top250
下的 Selectors
,回到選擇器展示面板。
下圖就是我們這次爬蟲的層級關系,是不是和我們之前理論分析的一樣?
確認選擇無誤后,我們就可以抓取數據了,操作在 簡易數據分析 04 、 簡易數據分析 05 里都說過了,忘記的朋友可以看舊文回顧一下。下圖是我抓取的數據:
還是和以前一樣,數據是亂序的,不過這個不要緊,因為排序屬於數據清洗的內容了,我們現在的專題是數據抓取。先把相關的知識點講完,再攻克下一個知識點,才是更合理的學習方式。
我們在Web Scraper 翻頁——控制鏈接批量抓取數據一文中,介紹了控制網頁鏈接批量抓取數據的辦法。
但是你在預覽一些網站時,會發現隨着網頁的下拉,你需要點擊類似於「加載更多」的按鈕去獲取數據,而網頁鏈接一直沒有變化。
所以控制鏈接批量抓去數據的方案失效了,所以我們需要模擬點擊「加載更多」按鈕,去抓取更多的數據。
今天我們講的,就是利用 web scraper 里的 Element click 模擬點擊「加載更多」,去加載更多的數據。
這次的練習網站,我們拿少數派網站的熱門文章作為我們的練習對象,對應的網址鏈接是:
https://sspai.com/tag/%E7%83%AD%E9%97%A8%E6%96%87%E7%AB%A0#home
為了復習上一個小節的內容,這次我們模擬點擊翻頁的同時,還要抓取多條內容,包括作者、標題、點贊數和評論數。
下面開始我們的數據采集之路。
2019-12-22 補充:
少數派官網改版,和我當初寫教程的時抓取的網站有些許不同,主要改動有以下幾點:
- 「加載更多」按鈕改為「更多」按鈕,而且在網頁全屏的情況下改為下拉自動加載,網頁寬度半屏的情況下為點擊「更多」按鈕翻頁,建議大家在半屏的情況下練習
- 只能抓取作者、標題和點贊數這 3 個數據,無法抓取評論數
- 網頁 UI 樣式有些許改動,但邏輯都是相通的,不影響教程學習和數據抓取
1.創建 sitmap
老規矩,第一步我們先創建一個少數派的 sitmap,取名為 sspai_hot,起始鏈接為 https://sspai.com/tag/熱門文章#home。
2.創建容器的 selector
通過上一節的內容,我們知道想在 web scraper 里想抓取多種類型的數據,必須先創建一個容器(container),這個容器包含多種類型的數據,所以我們第二步就是要創建容器的 selector。
要注意的是,這個 selector 的 Type 類型選為 Element click,翻譯成中文就是模擬點擊元素,意如其名,我們可以利用這種類型模擬點擊「加載更多」按鈕。
這種類型的 selector,會多出幾個選項,第一個就是 Click selector,這個就是選擇「加載更多」按鈕的,具體操作可見下圖的動圖。
還有幾個多出來的選項,我們一一解釋一下:
1.Click type
點擊類型,click more 表示點擊多次,因為我們要抓取批量數據,這里就選擇 click more,還有一個 click once 選項,點擊一次
2.Click element uniqueness
這個選項是控制 Web Scraper 什么時候停止抓取數據的。比如說 Unique Text,表示文字改變時停止抓取數據。
我們都知道,一個網站的數據不可能是無窮無盡的,總有加載完的時候,這時候「加載更多」按鈕文字可能就變成「沒有更多」、「沒有更多數據」、「加載完了」等文字,當文字變動時,Web scraper 就會知道沒有更多數據了,會自動停止抓取數據。
3.Multiple
這個我們的老朋友了,表示是否多選,這里我們要抓取多條數據,當然要打勾。
4.Discard initial elements
是否丟棄初始元素,這個主要是去除一些網站的重復數據用的,不是很重要,我們這里也用不到,直接選擇 Never discard,從不丟棄數據。
5.Delay
延遲時間,因為點擊加載更多后,數據加載需要一段時間,delay 就是等待數據加載的時間。一般我們設置要大於等於 2000,因為延遲 2s 是一個比較合理的數據,如果網絡不好,我們可以設置更大的數字。
3.創建子選擇器
接下來我們創建幾個子選擇器,分別抓取作者、標題、點贊數和評論數四種類型的數據,詳細操作我在上一篇教程中已經說明了,這里我就不詳細說明了。整個爬蟲的結構如下,大家可以參考一下:
4.抓取數據
按照 Sitemap spay_hot
-> Scrape
的操作路徑就可以抓取數據了。
今天我們學習了通過 Web Scraper 抓取點擊加載更多類型的網頁。實踐過程中,你會發現這種類型的網頁無法控制爬取數目,不像豆瓣 TOP250,明明白白就是 250 條數據,不多也不少。下一篇我們就聊聊,如何利用 Web Scraper,自動控制抓取的數目。
今天我們說說 Web Scraper 的一些小功能:自動控制 Web Scraper 抓取數量和 Web Scraper 的父子選擇器。
如何只抓取前 100 條數據?
如果跟着上篇教程一步一步做下來,你會發現這個爬蟲會一直運作,根本停不下來。網頁有 1000 條數據,他就會抓取 1000 條,有 10W 條,就會抓取 10W 條。如果我們的需求很小,只想抓取前 200 條怎么辦?
如果你手動關閉抓取數據的網頁,就會發現數據全部丟失,一條都沒有保存下來,所以說這種暴力的方式不可取。我們目前有兩種方式停止 Web Scraper 的抓取。
2019-10-26 補充:0.4.2 版本的 Web Scraper 已經支持實時保存,也就是說手動關閉抓取數據的網頁也可以保存數據了
1.斷網大法
當你覺得數據抓的差不多了,直接把電腦的網絡斷了。網絡一斷瀏覽器就加載不了數據,Web Scraper 就會誤以為數據抓取完了,然后它會自動停止自動保存。
斷網大法簡單粗暴,雖不優雅,但是有效。缺點就是你得在旁邊盯着,關鍵點手動操作,不是很智能。
2.通過數據編號控制條數
2019-10-26 補充:0.4.2 版本的 Web Scraper 改進了抓取方式,這種方法可能會失效
比如說上篇文章的少數派熱門文章爬蟲,container 的 Selector 為 dl.article-card
,他會抓取網頁里所有編號為 dl.article-card
的數據。
我們可以在這個 Selector 后加一個 :nth-of-type(-n+100)
,表示抓取前 100 條數據,前 200 條就為 :nth-of-type(-n+200)
,1000 條為 :nth-of-type(-n+1000)
,以此類推。
這樣,我們就可以通過控制數據的編號來控制需要抓取的數據。
抓取鏈接數據時,頁面跳轉怎么辦?
在上文抓取數據時,可能會遇到一些問題,比如說抓取標題時,標題本身就是個超鏈接,點擊圈選內容后打開了新的網頁,干擾我們確定圈選的內容,體驗不是很好。
其實 Web scraper 提供了對應的解決方案,那就是通過鍵盤來選擇元素,這樣就不會觸發點擊打開新的網頁的問題了。具體的操作面板如下所示,就是我們點擊 Done Selecting
的那個控制條。
我們把單選按鈕選擇后,會出現 S ,P, C 三個字符,意思分別如下:
S:Select,按下鍵盤的 S 鍵,選擇選中的元素
P:Parent,按下鍵盤的 P 鍵,選擇選中元素的父節點
C:Child,按下鍵盤的 C 鍵,選擇選中元素的子節點
我們分別演示一下,首先是通過 S 鍵選擇標題節點:
我們對比上個動圖,會發現節點選中變紅的同時,並沒有打開新的網頁。
如何抓取選中元素的父節點 or 子節點?
通過 P 鍵和 C 鍵選擇父節點和子節點:
按壓 P 鍵后,我們可以明顯看到我們選擇的區域大了一圈,再按 C 鍵后,選擇區域又小了一圈,這個就是父子選擇器的功能。
這是簡易數據分析系列的第 10 篇文章。
友情提示:這一篇文章的內容較多,信息量比較大,希望大家學習的時候多看幾遍。
我們在刷朋友圈刷微博的時候,總會強調一個『刷』字,因為看動態的時候,當把內容拉到屏幕末尾的時候,APP 就會自動加載下一頁的數據,從體驗上來看,數據會源源不斷的加載出來,永遠沒有盡頭。
我們今天就是要講講,如何利用 Web Scraper 抓取滾動到底翻頁的網頁。
今天我們的練手網站是知乎數據分析模塊的精華帖,網址為:
https://www.zhihu.com/topic/19559424/top-answers
這次要抓取的內容是精華帖的標題、答題人和贊同數。下面是今天的教程。
1.制作 Sitemap
剛開始我們要先創建一個 container,包含要抓取的三類數據,為了實現滾動到底加載數據的功能,我們把 container 的 Type 選為 Element scroll down
,就是滾動到網頁底部加載數據的意思。
在這個案例里,選擇的元素名字為 div.List-item
。
為了復習上一節通過數據編號控制條數的方法,我們在元素名后加個 nth-of-type(-n+100)
,暫時只抓取前 100 條數據。
然后我們保存 container 這個節點,並在這個節點下選擇要抓取的三個數據類型。
首先是標題,我們取名為 title,選擇的元素名為 [itemprop='zhihu:question'] a
:
然后是答題人名字 name 與 贊同數 like,選擇的元素名分別為 #Popover10-toggle a
和 button.VoteButton--up
:
2.爬取數據,發現問題
元素都選擇好了,我們按 Sitemap zhihu_top_answers
-> Scrape
-> Start craping
的路徑進行數據抓取,等待十幾秒結果出來后,內容卻讓我們傻了眼:
數據呢?我要抓的數據呢?怎么全變成了 null?
在計算機領域里,null 一般表示空值,表示啥都沒有,放在 Web Scraper 里,就表示沒有抓取到數據。
我們可以回想一下,網頁上的的確確存在數據,我們在整個的操作過程中,唯一的變數就是選擇元素這個操作上。所以,肯定是我們選擇元素時出錯了,導致內容匹配上出了問題,無法正常抓取數據。要解決這個問題,我們就要查看一下網頁的構成。
3.分析問題
查看一下網頁的構成,就要用瀏覽器的另一個功能了,那就是選擇查看元素。
1.我們點擊控制面板左上角的箭頭,這時候箭頭顏色會變藍。
2.然后我們把鼠標移動到標題上,標題會被一個藍色的半透明遮罩蓋住。
3.我們再點擊一下標題,會發現我們會跳轉到 Elements
這個子面板,內容是一些花花綠綠看不大懂的代碼
做到這里心里別發怵,這些 HTML 代碼不涉及什么邏輯,在網頁里就是個骨架,提供一些排版的作用。如果你平常用 markdown 寫作,就可以把 HTML 理解為功能更復雜的 markdown。
結合 HTML 代碼,我們先看看 [itemprop='zhihu:question'] a
這個匹配規則是怎么回事。
首先這是個樹形的結構:
- 先是一個名字為 h2 的標簽
<h2>...</h2>
,它有個class='ContentItem-title'
的屬性; - 里面又有個名為 div 的標簽
<div>...</div>
,它有個itemprop='zhihu:question'
的屬性; - div 標簽里又有一個 名字為 a 的標簽
<a>...</a>
; - a 標簽里有一行字,就是我們要抓取的標題:
如何快速成為數據分析師?
上句話從可視化的角度分析,其實就是一個嵌套的結構,我把關鍵內容抽離出來,內容結構是不是清晰了很多?
<h2 class='ContentItem-title'/> <div itemprop='zhihu:question'/> <a>如何快速成為數據分析師?</a> </div> </h2>
我們再分析一個抓取標題為 null 的標題 HTML 代碼。
我們可以很清楚的觀察到,在這個標題的代碼里,少了名為 div
屬性為 itemprop='zhihu:question'
的標簽!這樣導致我們的匹配規則匹配時找不到對應標簽,Web Scraper 就會放棄匹配,認為找不到對應內容,所以就變成 null 了。
找到原因后我們就好解決問題了。
4.解決問題
我們發現,選擇標題時,無論標題的嵌套關系怎么變,總有一個標簽不變,那就是包裹在最外層的,屬性名為 class='ContentItem-title'
的 h2
標簽。我們如果能直接選擇 h2
標簽,不就可以完美匹配標題內容了嗎?
邏輯上理清了關系,我們如何用 Web Scraper 操作?這時我們就可以用上一篇文章介紹的內容,利用鍵盤 P 鍵選擇元素的父節點:
放在今天的課程里,我們點擊兩次 P
鍵,就可以匹配到標題的父標簽 h2
(或 h2.ContentItem-title
):
以此類推,因為答題人名字也出現了 null,我們分析了 HTML 結構后選擇名字的父標簽 span.AuthorInfo-name
,具體的分析操作和上面差不多,大家可以嘗試一下。
我的三個子內容的選擇器如下,可以作為一個參考:
最后我們點擊 Scrape 爬取數據,檢查一下結果,沒有出現 null,完美!
5.吐槽時間
爬取知乎數據時,我們會發現滾動加載數據那一塊兒很快就做完了,在元素匹配那里卻花了很多時間。
這間接的說明,知乎這個網站從代碼角度上分析,寫的還是比較爛的。
如果你爬取的網站多了,就會發現大部分的網頁結構都是比較「隨心所欲」的。所以在正式抓取數據前,經常要先做小規模的嘗試,比如說先抓取 20 條,看看數據有沒有問題。沒問題后再加大規模正式抓取,這樣做一定程度上可以減少返工時間。
今天我們講講如何抓取網頁表格里的數據。首先我們分析一下,網頁里的經典表格是怎么構成的。
First Name
所在的行比較特殊,是一個表格的表頭,表示信息分類- 2-5 行是表格的主體,展示分類內容
經典表格就這些知識點,沒了。下面我們寫個簡單的表格 Web Scraper 爬蟲。
1.制作 Sitemap
我們今天的練手網站是
http://www.huochepiao.com/search/chaxun/result.asp?txtChuFa=�Ϻ�&txtDaoDa=����
爬蟲的內容是抓取上海到北京的所有列車時刻表。
我們先創建一個包含整個表格的 container,Type 類型選為 Table
,表示我們要抓取表格。
具體的參數如上圖所示,因為比較簡單,就不多說了。
在這個面板下向下翻,會發現多了一個不一樣的面板。觀察一下你就會發現,這些數據其實就是表格數據類型的分類,在這個案例里,他把車次、出發站、開車時間等分類都列了出來。
在 Table columns
這個分類里,每一行的內容旁邊的選擇按鈕默認都是打勾的,也就是說默認都會抓取這些列的內容。如果你不想抓取某類內容,去掉對應的勾選就可以了。
在你點擊 Save selector
的按鈕時,會發現 Result key 的一些選項報錯,說什么 invalid format
格式無效:
解決這個報錯很簡單,一般來說是 Result key 名字的長度不夠,你給加個空格加個標點符號就行。如果還報錯,就試試換成英文名字:
解決報錯保存成功后,我們就可以按照 Web Scraper 的爬取套路抓取數據了。
2.為什么我不建議你用 Web Scraper 的 Table Selector?
如果你按照剛剛的教程做下里,就會感覺很順利,但是查看數據時就會傻眼了。
剛開始抓取時,我們先用 Data preview
預覽一下數據,會發現數據很完美:
抓取數據后,在瀏覽器的預覽面板預覽,會發現車次
這一列數據為 null,意味着沒有抓取到相關內容:
我們下載抓取的 CSV 文件后,在預覽器里打開,會發現車次
的數據出現了,但出發站
的數據又為 null 了!
這不是坑爹呢!
關於這個問題我調查了半天,應該是 Web Scraper 對中文關鍵字索引的支持不太友好,所以會拋出一些詭異的 bug,因此我並不建議大家用它的 Table
功能。
如果真的想抓取表格數據,我們可以用之前的方案,先創建一個類型為 Element
的 container,然后在 container 里再手動創建子選擇器,這樣就可以規避這個問題。
上面只是一個原因,還有一個原因是,在現代網站,很少有人用 HTML 原始表格了。
HTML 提供了表格的基礎標簽,比如說 <table>
、 <thead>
、 <tbody>
等標簽,這些標簽上提供了默認的樣式。好處是在互聯網剛剛發展起來時,可以提供開箱即用的表格;缺點是樣式太單一,不太好定制,后來很多網站用其它標簽模擬表格,就像 PPT里用各種大小方塊組合出一個表格一樣,方便定制:
出於這個原因,當你在用 Table Selector 匹配一個表格時,可能會死活匹配不上,因為從 Web Scraper 的角度考慮,你看到的那個表格就是個高仿,根本不是原裝正品,自然是不認的。
3.總結
我們並不建議直接使用 Web Scraper 的 Table Selector,因為對中文支持不太友好,也不太好匹配現代網頁。如果有抓取表格的需求,可以用之前的創建父子選擇器的方法來做。
前面幾篇文章我們介紹了 Web Scraper 應對各種翻頁的解決方法,比如說修改網頁鏈接加載數據、點擊“更多按鈕“加載數據和下拉自動加載數據。今天我們說說一種更常見的翻頁類型——分頁器。
本來想解釋一下啥叫分頁器,翻了一堆定義覺得很繁瑣,大家也不是第一年上網了,看張圖就知道了。我找了個功能最全的例子,支持數字頁碼調整,上一頁下一頁和指定頁數跳轉。
今天我們就學學,Web Scraper 怎么對付這種類型的網頁翻頁。
其實我們在本教程的第一個例子,抓取豆瓣電影 TOP 排行榜中,豆瓣的這個電影榜單就是用分頁器分割數據的:
但當時我們是找網頁鏈接規律抓取的,沒有利用分頁器去抓取。因為當一個網頁的鏈接變化規律時,控制鏈接參數抓取是實現成本最低的;如果這個網頁進可以翻頁,但是鏈接的變化不是規律的,就得去會一會這個分頁器了。
說這些理論有些枯燥,我們舉個翻頁鏈接不規律的例子。
8 月 2 日是蔡徐坤的生日,為了表達慶祝,在微博上粉絲們給坤坤刷了 300W 的轉發量,微博的轉發數據正好是用分頁器分割的,我們就分析一下微博的轉發信息頁面,看看這類數據怎么用 Web Scraper 抓取。
這條微博的直達鏈接是:
https://weibo.com/1776448504/I0gyT8aeQ?type=repost
看了他那么多的視頻,為了表達感激,我們可以點進去出為坤坤加一份閱讀量。
首先我們看看第 1 頁轉發的鏈接,長這個樣子:
第 2 頁長這個樣子,注意到多了個 #_rnd1568563840036
參數:
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563840036
第 3 頁參數為 #_rnd1568563861839
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563861839
第 4 頁參數為 #_rnd1568563882276
:
https://weibo.com/1776448504/I0gyT8aeQ?type=repost#_rnd1568563882276
多看幾個鏈接你就可以發現,這個轉發網頁的網址毫無規律可言,所以只能通過分頁器去翻頁加載數據。下面就開始我們的實戰教學環節。
1.創建 SiteMap
我們首先創建一個 SiteMap,這次取名為 cxk
,起始鏈接為 https://weibo.com/1776448504/I0gyT8aeQ?type=repost。
2.創建容器的 selector
因為我們要點擊分頁器,外面的容器的類型我們選為 Element Click
,具體的參數解釋可以看下圖,我們之前在簡易數據分析 08詳細解釋過一次,這里就不多言了。
container 的預覽是下圖的樣子:
分頁器選擇的過程可以參看下圖:
3.創建子選擇器
這幾個子選擇器都比較簡單,類型都是文字選擇器,我們選擇了評論用戶名,評論內容和評論時間三種類型的內容。
4.抓取數據
按照 Sitemap cxk
-> Scrape
的操作路徑就可以抓取數據了。
5.一些問題
如果你看了我上面的教程立馬去爬數據,可能遇到的第一個問題就是,300w 的數據,難道我全部爬下來嗎?
聽上去也不太現實,畢竟 Web Scraper 針對的數據量都是相對比較小的,幾萬數據都算多的了,數據再大你就得考慮爬取時間是否太長,數據如何存儲,如何應對網址的反爬蟲系統(比如說冷不丁的跳出一個驗證碼,這個 Web Scraper 是無能為力的)。
考慮到這個問題,前面的自動控制抓取數量的教程你又看過的話,可能想着用 :nth-of-type(-n+N)
控制抓取 N 條數據。如果你嘗試了,就會發現這個方法根本沒用。
失效的原因其實涉及到一點點網頁的知識了,感興趣的話可以看看下面的解釋,不感興趣可以直接看最后的結論。
像我前面介紹的點擊更多加載型網頁和下拉加載型網頁,他們新加載的數據,是在當前頁面追加的,你一直下拉,數據一直加載,同時網頁的滾動條會越來越短,這意味着所有的數據都在同一個頁面。
當我們用 :nth-of-type(-n+N)
控制加載數量時,其實相當於在這個網頁設立一個計數器,當數據一直累加到我們想要的數量時,就會停止抓取。
但是對於使用翻頁器的網頁,每次的翻頁相當於刷新當前網頁,這樣每次都會設立一個計數器。
比如說你想抓取 1000 條數據,但是第 1 頁網頁只有 20 條數據,抓到最后一條了,還差 980 條;然后一翻頁,又設立一個新的計數器,抓完第 2 頁的最后一條數據,還差 980,一翻頁計數器就重置,又變成 1000 了......所以這個控制數量的方法就失效了。
所以結論就是,如果翻頁器類型的網頁想提前結束抓取,只有斷網的這種方法。當然,如果你有更好的方案,可以在評論里回復我,我們可以互相討論一下。
6.總結
分頁器是一種很常見的網頁分頁方法,我們可以通過 Web Scraper 中的 Element click
處理這種類型的網頁,並通過斷網的方法結束抓取。