想實現全網數據的清洗與聚合?從爬蟲做起
- 2019 年 11 月 20 日
- 筆記
實現資源聚合的必要性
試著去搜索網路上數據有多少,但是沒有明確的結果。但是我們可以明確感受到由於互聯網的快速發展,每天新產生的內容也越來越多,這其中我們真正需要的,也就1%或者更少。其餘的時間,我們都暴露在各類媒體的「推薦」或者「智慧演算法」之下。
那麼如何把屬於自己的時間奪回來,又不會「兩耳不聽窗外事,一心只讀聖賢書」呢?一個技術上可實現的路徑就是實現數據的清洗與聚合。或許表達不夠準確,但目的是相似的——去掉目標事件的重複內容,將剩下的內容按需呈現。
在過去,我們如果被「如何解決win10的自動更新」困擾,不同的搜索引擎會給出很多結果。


但是我們都明白,能夠適配你電腦的解決方案只有那麼一兩個。所以你要一個答案一個答案地試,一直到解決問題為止。
那如果你碰到是更複雜的問題呢?我希望有這麼一個聚合平台充當「人肉搜索引擎」,她在看遍了所有內容後,確定我的環境,隨後直接給出一個答案,而且這個答案還是正確的。進而,與當前的AI助手結合,提供每日簡報,以及決策支援。
爬蟲是實現聚合的第一步
目前碰到的技術問題大多都是在部落格上得到解決的,所以數據也要從部落格爬起,我選擇的第一個部落格平台是CSDN。

首先梳理下爬蟲的邏輯。很簡單,第一個爬蟲不需要太高深的知識。我們就是模擬一個瀏覽器的數據請求,把網頁下載下來;構建一個正則表達式,把有用的文字抽取出來;打開一個文件,把文字寫進去。
先驗知識
CSDN的頁面是有規律的。
首先,知道作者ID就可以構造出文章列表,結構為prefix + id + /article/list/ + list_number. 注意文章列表的下一頁標籤是js動態生成的,可以順序增加list_number, 直到返回404錯誤,表明文章列表結束,避開執行js。

其次,關鍵詞、文章ID、文章內容使用的html標籤都一致,便於爬取。
數據請求

請求一個網頁數據是很簡單的。我們這是使用的是socket和urlib兩個模組,注意先import 進來,並且urllib直接導入request類,即import urllib.request as request.
設置header之後傳入Request,隨後使用urlopen方法打開一個網路鏈接,之後再調用read方法讀取頁面內容。當然,這裡有些異常處理流程,只是做了錯誤原因輸出,並沒有實現從故障中恢復。
數據有效內容提取
正則表達式是最基礎也最強大的工具。首先import re, 然後使用compile方法與findall方法。


這裡的正則表達式使用.去匹配任意除換行符之外的任意字元;用(.)去返回我們想要的數據。
數據存儲

在使用類似方法得到文章id、關鍵詞、是否原創、標題之後,把正文部分作為單獨文件寫入到磁碟,把文章的屬性資訊與對應的磁碟文件名寫入到config.json文件。每一個作者id對應一個config.json文件,方便後期自動化處理。
結果

本次爬取測試後共抓取1W博文 ,後期的深入方向是內容去重,優化方向是自動化爬蟲(如自動獲取用戶ID、異常自動修復實現7x24h運行、雲端部署、爬取圖片)。
註:本文只是分享idea,並展示測試成果,詳細的指導請求助於教程類網站。