【Python爬虫】爬取微信公众号文章信息准备工作

有一天发现我关注了好多微信公众号,那时就想有没有什么办法能够将微信公众号的文章弄下来,而且还想将一些文章的精彩评论一起搞下来。参考了一些文章,通过几天的研究基本上实现了自己的要求,现在记录一下自己的一些心得。

整个研究过程如下:
1.了解微信公众号文章链接的组成,历史文章API组成,单个文章评论API组成,访问微信公众号的cookie组成;
2.分析历史文章API以及单个文章评论API的结构,构建爬虫进行爬取;
前面两点需要借助于抓包工具Fiddler,下面会详细介绍抓包结果的分析,上一篇文章有介绍“ Fiddler在PC/台式对Android进行抓包”
3.设计表结构,将爬虫获取的数据存入到mysql数据库;
4.对获取的数据库信息进行过滤整理,将相关内容输出,选择相应文章进行阅读并消化。

一、微信公众号图文消息的链接组成
微信公众帐号群发的图文消息一般情况下是在微信公众平台上编辑和产生的。
我们先从比较有名的公众号“逻辑思维”的图文消息看看一篇图文消息链接的组成元素:
逻辑思维有一篇每天60秒的文章【罗胖60秒:一个“智慧系统”是什么样的?】,在微信打开通过浏览器查看到链接
http://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&mid=3009217237&idx=2&sn=881c0a758a43348e2e7602110862f6ec&chksm=90460ec6a73187d00ebc007b1429609573ca42b9ef1dd74d860b4716f04b63661b15cbee2c6b&mpshare=1&scene=23&srcid=1202m2DVBW8OubvaR1DcXF0a#rd
上面链接中的参数有__biz,mid,idx,sn,chksm,mpshare,scene和srcid
其实主要参数只有__biz,mid,idx和sn四个参数,而这四个参数能唯一确定一篇微信公众平台的图文消息,所以以下链接就可以访问文章
https://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&mid=3009217237&idx=2&sn=881c0a758a43348e2e7602110862f6ec
这四个参数的含义是:
__biz可以认为是微信公众平台对外公布的公众帐号的唯一id,而这个__biz参数能用来生成公众帐号的二维码
mid是图文消息id,每篇文章这个消息id都唯一
idx是发布的第几条消息(1就代表是头条位置消息,2代表第二条)
sn是一个随机加密串(对于一篇图文消息是唯一的,如果你想问这个sn的生成规则是什么或者怎么破解,你基本上只能从微信公众平台开发团队才能得到答案)
另外,对于除了__biz之外的三个参数,mid/idx/sn 可以分别写成 appmsgid/itemidx/sign,比如还是之前文章,用如下链接一样可以访问到:
https://mp.weixin.qq.com/s?__biz=MjM5NjAxOTU4MA==&appmsgid=3009217237&itemidx=2&sign=881c0a758a43348e2e7602110862f6ec
其实在早期,只需要__biz, mid和idx三个参数即可确定一篇微信公众平台的图文消息,微信后来增加一个参数sn(sign),这样做的原因是:
微信公众平台的图文消息首先在后台保存为了一篇素材才能发布,而这个素材也会生成一个链接,在早期这个素材的链接就是后来要发布的文章的链接,而从上面这篇文章的链接你能猜出来,只需要改变mid(图文消息id)这个值,比如这篇文章的mid是10000382,对这个数字加上1或者2就极有可能是下一篇图文消息或者素材的链接,这样用户就有可能提前阅读到公众帐号已经写好并保存但还没群发的素材了。
所以分布文章时会加上一个随机生成的参数sn,确保文章无法被知道。


二、微信公众号历史文章API组成
在公众号主页,右上角有个人上半身图标,点击进入消息界面,下滑找到并点击“全部消息”,往下请求加载几次历史文章,然后回到Fiddler界面,不出意外的话应该可以看到这几次请求,可以看到返回的数据是json格式的,同时文章数据是以json字符串的形式定义在general_msg_list字段中:
https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5NjAxOTU4MA==&f=json&offset=10&count=10&is_ok=1&scene=126&uin=777&key=777&pass_ticket=pI3viTq3ke7q4XBuvPFfW04X1NN374CuTXRryqcWqIUGGXvrmHzytAth%2BMUWmDEv&wxtoken=&appmsg_token=985_CXzmkHn3e3dS9vsefAmdITS4irh69Rk351ye-w~~&x5=1&f=json


以下介绍几个主要参数:
- __biz:相当于是当前公众号的id(唯一固定标志) 
- offset:文章数据接口请求偏移量标志(从0开始),每次返回的json数据中会有下一次请求的offset,这里一般是按10递增的 
- count:每次请求的数据量(亲测最多可以是10) ,所以可以固定为10
- pass_ticket:可以理解是请求票据,而且隔一段时间后(大概几个小时)就会过期,失效后都需要重新抓包替换
- appmsg_token:同样理解为非固定有过期策略的票据,失效后都需要重新抓包替换

三、微信公众号访问的cookie组成:

访问微信公众号历史文章,我们是需要登录的,我们可以通过构建cookie去跳过登录过程
通过访问微信公众号文章,我们通过Fiddler抓包可以看到cookie的相关信息

其中pass_ticket和wap_sid2不是固定的,经常有变化,失效了都需要重新抓包,而其他wxtokenkey,wxuin,devicetype,version等只要微信号不变,登录设备不变都不会改变。

四、微信公众号单个文章评论API组成
通过访问微信公众号文章,我们抓包可以得到文章评论的API,这个返回的也是json格式,评论存储在elected_comment
https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0&__biz=MjM5NjAxOTU4MA==&appmsgid=3009217642&idx=2&comment_id=578089232589930496&offset=0&limit=100&uin=777&key=777&pass_ticket=v+7PaoESYfMrxgXJpqOkfXV4Y2+gYNPPJfSSmzPXfeiuNrNiBeEcs+8b//Yit5sd&wxtoken=777&devicetype=android-26&clientversion=2607033b&appmsg_token=986_jbuKqpV9lCZ1cb787Tem5V5n6JKpU9TrOFUZRE5esVxnBK7IR-TsZiXLRNaO1tnfx4rkIk1xyFHRlqI7&x5=1&f=json

还是介绍一下其中的主要参数:
- __biz:和历史文章列表中一致,微信公众号ID
- comment_id:评论的id,一篇文章唯一
- appmsgid:图文消息ID,与文章有关(文章链接中的mid)
- pass_ticket:请求票据,同一时间段内历史文章API和单个文章评论API一致
- appmsg_token:非固定有过期策略的票据,同一时间段内历史文章API和单个文章评论API不一致
以上主要介绍了整个研究过程的第一点,下面将会分析历史文章API和单个文章评论API的返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js:堆栈和队列

JavaScript数组的栈和队列的操作方法。 堆栈和队列 要了解JavaScript数组的堆栈和队列方法的操作,需要先对堆栈和队列基础知识有所了解。在继续后面的内容之前,我们先简单的了解一下堆栈和队列的概念。 栈和队列都是动态的集合,在栈中&…

【Python爬虫】微信公众号历史文章和文章评论API分析

上一篇文章爬取微信公众号文章信息准备工作介绍了微信公众号历史文章和文章评论API的组成情况,历史文章API格式:https://mp.weixin.qq.com/mp/profile_ext?actiongetmsg&__bizMjM5NjAxOTU4MA&fjson&offset10&count10&is_ok1&sc…

MySql的Delete、Truncate、Drop分析

MySql的Delete、Truncate、Drop分析 相同点: truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据 不同点:  1. truncate 和 delete 只删除数据不删除表的结构(定义)   drop 语句将删除表的结构被依赖的约束(constrain)、触发器(…

【Python】Python简介和Python解释器

计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。 机器语言(二进制)→汇编语言→(前面两种语言是与硬件进行交互) →高级语言(面向过程语言(C语言)→面向对象语言&#xff09…

python 判断当前时间是否为零点

import time time_now int(time.time()) #unix时间time_local time.localtime(time_now) #转换为win_timedt time.strftime("%H:%M:%S", time_local)# 转换成新的时间格式(18:59:20)adt.split(:)b[]for a in dt.split(:):b.append(a)c.join(b)if c000000:print(是…

多任务场景下单线程异步多线程多进程

多任务的场景:1.爬取不同url的内容,爬取同一个url分页内容。比如:豆瓣图书 Top 250 https://book.douban.com/top250?start0 实现豆瓣图书Top250的抓取工作,并存入excel中,如果采用的串行爬取方式,每次爬完…

django 按天水平分表并插入数据

db pymysql.connect("localhost", "数据库管理员名", "数据库密码", "数据库名")cursor db.cursor()unix_time str(int(time.time()))win_time datetime.datetime.now().strftime(%Y%m%d)table_name engineeringdata win_timesq…

【Python】单线程异步多线程多进程实例

上一篇文章主要介绍了多任务场景下单线程异步、多线程、多进程如何选择,链接:多任务场景下单线程异步多线程多进程 这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联的10个任务 多进程版…

python及pycharm2018软件安装教程

python及pycharm2018软件安装教程 python 3.6.5及pycharm2018.1.1 Win版32/64位下载地址: https://pan.baidu.com/s/1KdECgnrARK4HubPeFSKCTw 密码:bwc5 Python及PyCharm简介: Python 是一种面向对象的解释型计算机程序设计语言。是纯粹的自由…

【Python爬虫】requests与urllib库的区别

我们在使用python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装,它们使用的主要区别: requests可以直接构建常用的get和post…

2059 - authentication plugin 'caching_sha2_password' -navicat连接异常问题解决

使用navicat 连接 mysql 8.0.11 报 "2059 - authentication plugin caching_sha2_password ..." 解决办法: 进入mysql命令行然后输入 ALTER USER root% IDENTIFIED WITH mysql_native_password BY root1;

【教育】世界上最伟大的25个教育法则

鱼缸法则 心灵的成长需要自由 一家公司里,职员把几条小鱼放在一个鱼缸里,好几年了,鱼竟然还是那么小,于是大家都认为这鱼就是小个头。一天鱼缸被打破了,就把它们养在院子塘里,没想这些鱼疯了似地长得很大…

mysql安装版安装

1、到mysql官网。选择windows,选择.msi文件。下载 2、双击安装。安装时选择server即可ok。 3、在输入密码时,切记勿用小键盘上的数字(可能会造成后期连接数据库密码错误) 4、安装完成后,打开sql命令行。输入密码校正…

【测试工具】在linux测试环境安装bug管理工具禅道

在我们测试中,为了方便管理测试流程,提交测试发现的bug,我们需要使用到bug管理工具。有些大公司可能会自己开发一些bug管理工具,但是我们也会用一些开源的bug管理工具,比如Bugzilla,Redmine,Tra…

PyCharm点击设置没反应,无法进行设置

首先检查下是不是装了中文汉化包resources_cn.jar 如果有的话,解决办法:1.更换一个汉化包或者将原来的resources_en.jar也放进lib目录下 2.将汉化包都删除,只留下原版的resources_en.jar 转载自https://blog.csdn.net/xiangshangbashaon…

【测试工具】在linux测试环境访问禅道数据库

上一篇文章我们介绍了如何在linux测试环境安装bug管理工具禅道,现在我们来介绍一下如何访问禅道的数据库,访问数据库有什么用呢?首先,我们可以更改我们安装后的管理系统的名称(改为自己公司名称)&#xff0…

在命令提示符(cmd)下怎样复制粘贴(详细版)

我们的命令提示符面板,不能选中复制。应该怎么办呢? 按照下面的方法即可解决 输入“cmd”,确认。 此时打开了cmd窗口,在图中位置右键选择“属性”。 4 在弹出的窗口中,勾选“快速编辑模式”。 5 复制方框1中的文字…

【Python】提升Python程序性能的好习惯2

掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费。 追求性能极限是一个有趣的游戏, 而过度优化就会变成嘲弄了。虽然Python授予你与C接口无缝集成的能力, 你必须问自己你花数小时的艰辛优化工作用户是否买帐. 另一方面, 牺牲代码的可…

python各种库安装

1、安装django pip install django 安装成功测试:进入cmd--》输入python--》输入import django-->输入 django.get_version(),若正常显示则说明安装成功 2、更新pip python -m pip install --upgrade pip 3、安装pymysql pip install pymysql 出现错误&…

【工具】SecureCRT安装和注册

SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。 SecureCRT支持SSH,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的理想工具。通过…