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

作者 | 罗昭成
责编 | 唐小引
本文首发于 CSDN 微信(ID:CSDNnews)

如何爬取微信公众号文章?

作者注:先解释义,网络爬虫指的是按照一定的规则,自动抓取万维网信息的程序或者脚本。

读过笔者之前写的文章的朋友,肯定会知道,要抓取微信公众号文章,第一件事就是去找接口,之前都是在 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 ,使用它提供的插件配置的功能,拿到评论的数据,并写入数据库中。

var url = require("url")
module.exports = {
    *beforeSendResponse(requestDetail, responseDetail)
    {
        try {
            var pathName = url.parse(requestDetail.url).pathname
            if(pathName == "/mp/getappmsgext") {
                saveReadCount(requestDetail, responseDetail)
            }
        } catch(err) {
            console.log("err")
        }
    }
};

数据清洗与整理

在前面拿到的文章列表与点赞和评论数据中,保存的都是网络请求的详细数据,我们需要将所需的数据从原始数据中清洗出来,并将点赞数与请论数与文章关联起来。

注: 微信公众号的文章使用的是 __biz,mid,index 三个值来唯一确定一篇文章。

读取文章列表原始数据,并解析数据。逻辑很简单,代码如下:

def insertInto(cursor, msg):
    list =  json.loads(msg)["list"]
    for listItem in list:
        if not listItem.has_key("app_msg_ext_info"):
            continue
        commMsgInfo = listItem["comm_msg_info"]
        appMsg = listItem["app_msg_ext_info"]
        addAppMsg(cursor, commMsgInfo, appMsg)
        if appMsg.has_key("multi_app_msg_item_list"):
            subAppMsg = appMsg["multi_app_msg_item_list"]
            for subAppItem in subAppMsg:
                addAppMsg(cursor, commMsgInfo, subAppItem)

通过文章中的相关信息,将阅读量与点赞数量关联到同一篇文章的数据中,解析阅读量与点赞数量有代码如下:

def getCount(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()
    if len(values) <= 0:
        return "-1", "-1"
    data = values[0]
    appmsgstat = json.loads(data[0])["appmsgstat"]
    conn.close()
    return appmsgstat["read_num"], appmsgstat["like_num"]

数据分析

经过前面一系列的处理,我们需要的数据已经存入了数据库表中去了。经过艰难的爬取,数据终于到手,先来膜拜一下 10W+文章:

10W+文章阅读信息

因为是在控制台直接打印为了更好的格式化展示数据,使用了prettytable , 数据处理的代码如下:

def getArticInfos(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", "Reac Count"])
    table.align["Title"] = "l" 
    table.align["Author"] = "l" 
    table.padding_width = 1
    totalCount = 0
    for item in values:
        readCount = int(item[3], 10)
        if  readCount >= min and readCount < max:
            table.add_row([str(item[0]), str(item[1]), str(item[2]), str(item[3])])
            totalCount += 1
    print table
    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 年年度计划的诺言。

Python可以用于爬取微信公众号的文章。有几种方式可以实现这一目标,其中一种方式是通过登录微信公众号平台,在里面搜索要爬取的公众号,然后进行抓包。另外一种方式是使用安卓模拟器进行抓包。还可以使用搜狗的微信模块来获取数据。 在使用第一种方式时,首先需要拥有一个微信公众号的账号。然后,通过工具如pycharm和fiddler等,登录微信公众号平台,进入创作管理,选择图文素材,然后创建或编辑文章。最后,通过添加引用和查找公众号文章等步骤,进行数据的爬取和收集。 在实现这些步骤之前,你需要了解微信公众号平台的主要功能和界面布局。主面板可以划分为七大块,每个块都有不同的功能。在后续的操作中,你可以使用Python代码来模拟微信请求,并实现数据的爬取分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [欢度国庆⭐️共享爬虫之美⭐️基于 Python 实现微信公众号爬虫(Python无所不能爬)](https://blog.csdn.net/xiejiachao/article/details/120573509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【爬虫】python爬取微信公众号](https://blog.csdn.net/qq_36269293/article/details/109244944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值