Python 爬取 6000 篇文章分析 CSDN 是如何進入微信 500 強的

注:先解釋義,網絡爬蟲指的是按照一定的規則,自動抓取萬維網信息的程序或者腳本。

要抓取微信公眾號文章,第一件事就是去找接口,之前都是在 Web 站點上去找。Chrome 的調試工具,能夠很清晰地看到所有的網絡請求,簡單的分析,就能找到對應的 API ,但是在移動端,這件事情顯然就變得複雜了很多。

Android 抓包

對於許多從事移動開發的朋友們來說,抓包是一個常用需求,在這裡,筆者簡要介紹一下基本步驟:

在你的個人電腦上安裝抓包軟件,推薦 Charles 和 Fiddler ,使用 Mac 的朋友建議使用 Charles ,使用 Windows 的朋友建議使用 Fiddler;將手機與電腦連接在同一個局域網中;在手機的 Wi-Fi 設置裡面,手動設置代理,使用你的個人電腦代理手機的網絡請求;代理請求,抓取 HTTPS。

眾所周知,HTTP 是進行明文傳輸的,可以很方便地看到上行與下行的數據。但是 HTTPS 使用的是加密傳輸,要看到上行與下行的數據,我們得事先知道通信的密碼,才能解密看到真實內容。

為了解決這個問題,抓包工具會作為一箇中間代理人,手機端與抓包工具進行通信,抓包工具再與服務端進行通信。手機端與抓包工具建立 HTTPS 請求使用的公鑰是抓包工具下發給他的。所以,為了能正常通信,需要安裝抓包工具生成的根證書。

通過上面兩步,你可以輕鬆地抓取到使用 HTTPS 的請求。稍加分析,就能找到微信公眾號文章列表獲取數據的接口,在這個地方,筆者就不再多做贅述。

現在,我們很輕鬆地就把 CSDN 好幾年的文章爬了下來。但是要想拿到文章的閱讀、點贊數,還需要去分析獲取這兩個數據的請求。經過仔細的分析,單從接口上來說,是可以獲取到閱讀、點贊數,但是獲取這兩項數據的請求,是微信客戶端發的,上行參數中進行了簽名和文章唯一 ID 的生成,找不到對應的生成算法。所以,此路不通。

為了能拿到這兩項數據,網絡上有一種方式的實現,使用的是 AnyProxy + MonkeyRunner ,筆者也是採用與之類似的方式:

AnyProxy + ADB Shell

AnyProxy 是一個基於 Node.js 的,可供插件配置的 HTTP/HTTPS 代理服務器。和上面提到的 Charles 、 Fiddler 類似,但更加適合開發者使用。

筆者使用 ADB Shell 中的命令,來模擬點擊,以自動化的形式打開微信公眾號中的文章。然後在啟動 AnyProxy ,使用它提供的插件配置的功能,拿到評論的數據,並寫入數據庫中。

varurl = require( "url")

module.exports = {

*beforeSendResponse(requestDetail, responseDetail)

{

try{

varpathName = url.parse(requestDetail.url).pathname

if(pathName == "/mp/getappmsgext") {

saveReadCount(requestDetail, responseDetail)

}

} catch(err) {

console.log( "err")

}

}

};

數據清洗與整理

在前面拿到的文章列表與點贊和評論數據中,保存的都是網絡請求的詳細數據,我們需要將所需的數據從原始數據中清洗出來,並將點贊數與請論數與文章關聯起來。

注: 微信公眾號的文章使用的是 __biz,mid,index 三個值來唯一確定一篇文章。

讀取文章列表原始數據,並解析數據。邏輯很簡單,代碼如下:

definsertInto(cursor, msg):

list = json.loads(msg)[ "list"]

forlistItem inlist:

ifnotlistItem.has_key( "app_msg_ext_info"):

continue

commMsgInfo = listItem[ "comm_msg_info"]

appMsg = listItem[ "app_msg_ext_info"]

addAppMsg(cursor, commMsgInfo, appMsg)

ifappMsg.has_key( "multi_app_msg_item_list"):

subAppMsg = appMsg[ "multi_app_msg_item_list"]

forsubAppItem insubAppMsg:

addAppMsg(cursor, commMsgInfo, subAppItem)

defgetCount(articId):

conn = sqlite3.connect( "wechat_read_cont.db")

conn.text_factory = str

cursor = conn.cursor()

articId = articId.replace( "=", "%3D")

selectSql = "select responseBody from read_cont where url = ""+ articId + """

cursor.execute(selectSql)

values = cursor.fetchall()

iflen(values) <= 0:

return"-1", "-1"

data = values[ 0]

appmsgstat = json.loads(data[ 0])[ "appmsgstat"]

conn.close()

returnappmsgstat[ "read_num"], appmsgstat[ "like_num"]

數據分析

經過前面一系列的處理,我們需要的數據已經存入了數據庫表中去了。經過艱難的爬取,數據終於到手,先來膜拜一下 10W+文章:

因為是在控制檯直接打印為了更好的格式化展示數據,使用了prettytable , 數據處理的代碼如下:

defgetArticInfos(min, max):

conn = sqlite3.connect( 'wechat.db')

conn.text_factory = str

cursor = conn.cursor()

cursor.execute( "select title, author, datetime, readCount from messages")

values = cursor.fetchall()

table = PrettyTable([ "Title", "Author", "Time", "Read Count"])

table.align[ "Title"] = "l"

table.align[ "Author"] = "l"

table.padding_width = 1

totalCount = 0

foritem invalues:

readCount = int(item[ 3], 10)

ifreadCount >= min andreadCount < max:

table.add_row([str(item[ 0]), str(item[ 1]), str(item[ 2]), str(item[ 3])])

totalCount += 1

printtable

print"Total Count:"+ str(totalCount)

conn.close()

if__name__ == '__main__':

getArticInfos( 100001, 100002)

10W+ 已經成為了微信公眾號文章的重要指標。在一個用戶總量並不是很大的程序員圈子裡面。產出如此多的 10W+ 文章,真的是行業翹楚啊。

聽小道消息說,CSDN 是 2017 年下半年才著重開始運營公眾號,恰巧,爬取的數據有 CSDN 全量文章數據,總計 6000 篇,所以我們可以對比看看 CSDN 公眾號產出的文章數量:

歷年文章數量

從上圖可以看出,2018 年 CSDN 公眾號差不多產出 2000 篇文章,平均每天產出至少 6 篇文章。不得不說,一個專業的技術媒體,他的實力是不容小看的。當然,CSDN 的編輯大大們,也辛苦了。感謝你們為我們貢獻了如此多的知識內容。

回過頭來,再來看一下從 2017 年到 2018 年,數據的增長趨勢是什麼樣子的。如下圖:

每月發表文章數

從上圖可以看到從 2017 年 9 月份開始,文章總數開始增加,甚至出現直接翻倍的情況,說明 CSDN 開始投入人力資源運營公眾號,2018 年春節,文章數量略有減少,年後文章數量開始增多,最多的時候,一個月產出了 236 篇文章,真是佩服得五體投地。

2018 年都已經結束,CSDN 都發表了 2000 篇左右的文章。這些文章都有些什麼內容?拿到標題,使用“Jieba”分詞,製作詞雲圖,如下圖所示:

詞雲

我們可以明確地看到,隨著 AlphaGo 橫空出世,機器學習、人工智能在技術領域崛起,未來已來深入人心。機器學習讓 Python 這門編程語言在更多的開發者面前展現出來,從圖中也可以看到,Python 在 CSDN 的文章中出現頻率也非常高,CSDN 深度為千萬開發者解析,想開發者所想,手動為他們點贊。

不僅如此,不管是正面的科技大佬 "馬雲"、“馬化騰”,還是負面的科技大佬“賈躍亭”等都頻繁地出現在我們的視野中,CSDN 的小姐姐們也在第一時間為我們提供科技界的新聞趣事。

2019 年剛剛開始。準備好迎接新的一年了嗎?沒準備好也沒關係,反正 2019 年都會來的。

最後為所有小夥伴們送上一句至理名言:

我 2019 年的目標就是搞定 2018 年那些原定於 2017 年完成的安排,不為別的,只為兌現我 2016 年時要完成的 2015 年年度計劃的諾言。

One more thing..

關注私信我“學習”免費獲取Python教程視頻

《瘋狂Python》

從零開始,Python 編程從入門到實踐一網打盡。網絡爬蟲、大數據分析與展現、併發編程等一個不漏。

《Redis 深度歷險:核心原理與應用實踐》

本書作者老錢在使用 Redis 上積累了豐富的實戰經驗,可以幫助更多後端開發者更快、更深入地掌握 Redis 技能,還能幫助讀者更輕鬆地通過技術面試,進入心儀企業。

《Netty進階之路:跟著案例學Netty》

Netty 將Java NIO 接口封裝,提供了全異步編程方式,是各大 Java 項目的網絡應用開發必備神器。

本書作者是國內 Netty 技術的先行者和佈道者,本書是他繼《Netty木又威指南》之後的又一力作。

《你也能看得懂的Python算法書》

本書面向算法初學者,首先介紹當下流行的編程語言 Python,詳細講解 Python 語言中的變量和循序、分支、循環三大結構,以及列表和函數的使用,為之後學習算法打好基礎。

然後以通俗易懂的語言講解雙指針、哈希、深度優先、廣度優先、回溯、貪心、動態規劃和至短路徑等經典算法。

《智能問答與深度學習》

本書由淺入深地介紹了人工智能在文本任務中的應用。不但介紹了自然語言處理、深度學習和機器閱讀理解等基礎知識,還簡述了信息論、人工智能等的發展過程。

關注私信我“學習”免費獲取Python教程視頻