數據採集的另外一種思路 - 瀏覽器腳本注入

昨天想去極客時間把購買的一個專欄裏的數據扒下來,發現以前寫的python腳本不能用了,緣由是他們網站作了限流、也加了http時間戳的一些校驗。咱們能夠將以前的python腳本進行改進,用ip代理池來處理限流,尋找時間戳驗證的規則就能夠解決。

可是此次咱們用了另外的一種爬蟲的思路,就是咱們直接寫一些js腳本,在對方的網站裏運行,去請求相應的接口,從而獲得想要的數據。node

這種思路其實見過不少例子,以前有一個很火的,qq空間自動點讚的腳本,看過它的源碼,其實很簡單,就是直接去操做dom,而後觸發一些事件。python

另一個很火的例子,github上很火的一個repo, fuckZhihu,聽說是winter當年退知乎時寫的,將本身在知乎的數據保存下來。mysql

下面是此次實踐的內容:git

獲取文章id集合

剛進入專欄的時候會有一個獲取左側文章列表集合的請求,在這個接口裏,咱們就能獲取到當前專欄的全部請求。github

image.png

這個專欄大概有50多篇文章,由於限流的緣由,咱們分紅兩次進行請求。ajax

注入FileSaver.js

FileSaver是一個運行在瀏覽器中,將數據下載爲json或者excel文件的庫。sql

image.png

咱們在這裏建立一個script標籤,並將這個標籤插入到文檔中。數據庫

image.png

我在這裏寫了一個方法downloadJson,咱們將等會獲取到的數據傳到這裏來,就能夠下載這個json文件了。json

建立請求

建立ajax請求,請求文章詳情的接口。數組

image.png

這裏咱們用原生的js來寫的,是一個post請求,res就是咱們獲得這個接口的返回值,咱們將須要的數據從這個返回值中取出來就能夠了。

上面說的是單個請求的實現。多個請求的實現以下圖所示。

image.png

而後咱們將數據保存一下:

image.png

全部的結果都放在rs這個數組中了。

下載數據

咱們將全部數據放在了一個數組中,在最後一次請求結束的時候,執行咱們寫好的downloadJson方法進行下載就能夠了。

image.png

導入數據庫

json文件導入數據庫網上有不少的工具,我此次是用以前寫好的腳本。

這個腳本在個人github上面,是用nodejs寫的,地址:tomysql.js

最後

咱們此次沒用通用的作法,模擬請求,或者模擬瀏覽器,而是直接利用瀏覽器來採集數據,固然也要根據實際狀況去選擇用哪一種作法。

完整的腳本: geek.js

相關文章
相關標籤/搜索