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

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+文章:

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

因為是在控制檯直接打印為了更好的格式化展示數據,使用了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 公眾號產出的文章數量:

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

歷年文章數量

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

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

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

每月發表文章數

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

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

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

詞雲

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

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

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

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

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

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

One more thing..

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

《瘋狂Python》

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

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

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

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

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

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

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

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

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

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

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

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

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

《智能問答與深度學習》

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

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

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


分享到:


相關文章: