微信公众号爬虫方案分析(爬取文艺相处公众号)

之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标,所以考虑通过手机客户端利用 Python 爬微信公众号文章。

因为微信公众平台并没有对外提供 Web 端入口,只能通过手机客户端查看公众号文章,所以使用Fiddler来进行抓包,分析微信公众号相关操作的请求信息,后面通过Python 代码来模拟微信请求。

抓取公众号所有历史文章

使用 Fiddler 抓包方式,打开手机某个微信公众号历史文章列表,上拉加载更多,此时可以找到加载更多文章的 URL 请求地址:

分析response,几个字段信息:

ret:请求是否成功,0就表示成功

msg_count: 返回的数据条数

can_msg_continue: 是否还有下一页数据

next_offset: 下一次请求的起始位置

general_msg_list:真实数据

general_msg_list是历史文章里面的基本信息,包括每篇文章的标题、发布时间、摘要、链接地址、封面图等,而像文章的阅读数、点赞数、评论数、赞赏数这些数据都需要通过额外接口获取。

通过字段 can_msg_continue 确定是否继续抓取,再结合 next_offset 就可以加载更多数据,我们需要把 url 中可变的参数 offset 用变量来代替,递归调用直到 can_msg_continue 为 0 说明所有文章都爬取完了。

class WeiXinCrawler:

def crawl(self, offset=0):

"""

爬取更多文章

"""

# appmsg_token需刷新

url = "https://mp.weixin.qq.com/mp/profile_ext?" \

"action=getmsg&" \

"__biz=MzUzNTcwNDkxNA==&" \

"f=json&offset={offset}&" \

"count=10&is_ok=1&scene=124&uin=777&key=777&" \ "pass_ticket=z%2FYMNxHa1GuVS1pHj99nPCf1uwQrkEaSJeztTLDcQCGGJx%2BH5evDSY9ooI3nDLQx&" \

"wxtoken=&" \

"appmsg_token=954_X70f2Zp%252BnwCvfxt6YdRWgETK3fRaWtXY80tJfQ~~&x5=1&" \

"f=json".format(offset=offset)

# 从 Fiddler 获取最新的请求头参数

headers = """

省略

"""

# 将"Host: mp.weixin.qq.com"格式的字符串转换成字典类型转换成字典类型

headers = utils.headers_to_dict(headers)

response = requests.get(url, headers=headers, verify=False)

result = response.json()

if result.get("ret") == 0:

msg_list = result.get("general_msg_list")

logger.info("抓取数据:offset=%s, data=%s" % (offset, msg_list))

self.save(msg_list)

# 递归调用直到 can_msg_continue 为 0 说明所有文章都爬取完了

has_next = result.get("can_msg_continue")

if has_next == 1:

next_offset = result.get("next_offset") #下一次请求的起始位置

time.sleep(2)

self.crawl(next_offset)

else:

# 错误消息

logger.error("请求参数失效,请重新设置")

exit()

将爬取的文章存储到MongoDB

关于数据的存储有很多选择,最简单的方式就是直接保存到 csv 文件中,这种方式操作简单,适合数据量少的情况,Python的标准库 csv 模块就可以直接支持。如果遇到数据量非常大的情况,就必须要用到专业的数据库系统,既可以使用 MySQL 这样的关系型数据库,也可以使用 MongoDB 一类的文档型数据库。用Python 操作 MongoDB 非常方便,无需定义表结构就可以直接将数据插入,所以使用MongoDB 来存储数据。

连接数据库 # 连接 mongodb

connect('ssq_weixin', host='localhost', port=27017)

定义数据模型 class Post(Document):

"""

文章信息

"""

title = StringField() # 文章标题

content_url = StringField() # 文章链接

content = StringField() # 文章内容

digest = StringField() # 文章摘要

cover = URLField(validation=None) # 封面图

p_date = DateTimeField() # 推送时间

read_num = IntField(default=0) # 阅读数

like_num = IntField(default=0) # 点赞数

comment_num = IntField(default=0) # 评论数

reward_num = IntField(default=0) # 赞赏数

author = StringField() # 作者

u_date = DateTimeField(default=datetime.now) # 最后更新时间

获取文章标题、文章链接等信息存入数据库 @staticmethod

def save(msg_list):

msg_list = msg_list.replace("\/", "/")

data = json.loads(msg_list)

msg_list = data.get("list")

for msg in msg_list:

p_date = msg.get("comm_msg_info").get("datetime")

msg_info = msg.get("app_msg_ext_info") # 非图文消息没有此字段

if msg_info:

WeiXinCrawler._insert(msg_info, p_date)

multi_msg_info = msg_info.get("multi_app_msg_item_list")

for msg_item in multi_msg_info:

WeiXinCrawler._insert(msg_item, p_date)

else:

logger.warning(u"此消息不是图文推送,data=%s" % json.dumps(msg.get("comm_msg_info")))

@staticmethod

def _insert(item, p_date):

keys = ('title', 'author', 'content_url', 'digest', 'cover', 'source_url')

sub_data = utils.sub_dict(item, keys)

post = Post(**sub_data)

p_date = datetime.fromtimestamp(p_date)

post["p_date"] = p_date

logger.info('save data %s ' % post.title)

try:

post.save()

except Exception as e:

logger.error("保存失败 data=%s" % post.to_json(), exc_info=True)

获取阅读数、点赞数、赞赏数

点开一篇文章,通过 Fiddler 抓包分析,观察发现获取文章阅读数、点赞数的URL接口为:https://mp.weixin.qq.com/mp/getappmsgext ,后面有很多查询参数,请求方法为 POST。

取之前存取的 content_url 中的参数和获取点赞数的接口的body参数中,除了 chksm 其它几个参数都在,我们把 content_url 中的参数替换到body中 再来验证请求会不会正常返回数据。经过多次实验是ok的。

# 这个参数是从Fiddler中拷贝出 URL,然后提取出查询参数部分再转换成字典对象

# 稍后会作为参数传给request.post方法

data_url_params = {

将url中的查询参数转换为字典格式

}

body = '自己的请求体'

data = utils.str_to_dict(body, "&", "=") #将body的字符串转换为字典格式

data.update(content_url_params)

data_url = "https://mp.weixin.qq.com/mp/getappmsgext"

r = requests.post(data_url, data=data, verify=False, params=data_url_params, headers=headers)

开工:

if __name__ == '__main__':

crawler = WeiXinCrawler()

crawler.crawl()

for post in Post.objects(reward_num=0):

crawler.update_post(post)

time.sleep(5) #sleep时间稍微久点,防止出现301错误

可以愉快的爬取啦!

数据分析、可视化

后续可以利用Pandas对爬取的数据进行数据,通过Matplotlib 对数据进行可视化展示。时间有限暂时先不做了。

python微信点赞脚本_Python爬取微信公众号评论、点赞等相关信息相关推荐

  1. 深圳python数据分析师招聘_Python爬取智联招聘数据分析师岗位相关信息的方法

    Python爬取智联招聘数据分析师岗位相关信息的方法 发布时间:2020-09-23 23:23:12 来源:脚本之家 阅读:88 进入智联招聘官网,在搜索界面输入'数据分析师',界面跳转,按F12查 ...

  2. python 小爱音箱集成_python爬取京东小爱音响评论

    importrequestsfrom bs4 importBeautifulSoup as bsimportreimportpandas as pdfrom sqlalchemy importcrea ...

  3. python爬取微信公众号_Python爬取微信公众号(中间人代理法)

    1.环境:ubuntu16.04 + redis + mysql + python3.5 + anyproxy + android + pm2 + npm + node 一台爬虫服,python3环境 ...

  4. python微信爬取教程_python爬取微信文章方法

    本文给大家分享的是使用python通过搜狗入口,爬取微信文章的小程序,非常的简单实用,有需要的小伙伴可以参考下 本人想搞个采集微信文章的网站,无奈实在从微信本生无法找到入口链接,网上翻看了大量的资料, ...

  5. python爬取公众号文章_python爬取微信公众号历史文章

    前几天,朋友有一个爬取某些指定微信公众号的历史文章的需求,刚好自己闲的没事,也就试了一试.不算完美解决问题了吧,但是自己也无能为力了,毕竟腾讯那么牛,斗不过斗不过. 一.思路 看了一些别人的文章,综合 ...

  6. Python爬虫实战练习:爬取微信公众号文章

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:徐洲更 为了实现该爬虫我们需要用到如下工具 Chrome浏览器 Py ...

  7. python爬虫如何实现每天爬取微信公众号的推送文章

    python爬虫如何实现每天爬取微信公众号的推送文章 上上篇文章爬虫如何爬取微信公众号文章 上篇文章python爬虫如何爬取微信公众号文章(二) 上面的文章分别介绍了如何批量获取公众号的历史文章url ...

  8. python爬取网上文章_python 爬取微信文章

    本人想搞个采集微信文章的网站,无奈实在从微信本生无法找到入口链接,网上翻看了大量的资料,发现大家的做法总体来说大同小异,都是以搜狗为入口.下文是笔者整理的一份python爬取微信文章的代码,有兴趣的欢 ...

  9. python爬虫好友图片_Python爬取所有微信好友头像,制作微信好友图片墙

    今天咱就试试怎么爬取微信列表中所有好友的头像,并做成一张图片墙,代码不长,60 行就可以搞定. 核心是利用三个库:wxpy 库,用于获取好友头像然后下载 Pillow 库,用于拼接头像 Pyinsta ...

最新文章

  1. 《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展
  2. 二层交换网络_网络中的第2层交换
  3. 结构性约束事件聚合下的在线多目标跟踪方法
  4. hdu1596-find the safest road
  5. 飞机上终于能开着手机连 Wi-Fi 了,它背后的技术原理是什么?
  6. 内核抢占机制(preempt)
  7. 新网漫时代下的国漫“哥伦布”征程
  8. php项目收银系统,(三)设计模式之PHP项目应用(策略模式:商场收银系统)
  9. 小工具 | 横断面面积及土方量计算excel表格
  10. win10注册表WOW6432Node
  11. God--Ruby版的进程监控工具
  12. cisco(思科)交换机操作(基本查询命令)【一】
  13. 常系数非齐次微分方程特解及其通解求解
  14. 【吴恩达deeplearning.ai】3.2 特征点检测
  15. 关于软件界面设计、控件颜色搭配、一些实用建议(偷懒技巧)总结——针对C# WinForm/WPF技术
  16. 【第十篇】商城系统-性能测试
  17. RTL8189ES/ETV/FTV系列模块定频软件操作手册
  18. 第一个被赋予公明身份的机器人_机器人被赋予公民身份引发舆论关注
  19. 一篇文章了解爬虫的方方面面
  20. RUL论文复现:深度卷积神经网络在预测剩余寿命估计中的应用

热门文章

  1. unity 三消游戏源码展示图
  2. CodeForces 348D Turtles(LGV引理)
  3. 诺基亚E71更新程序下载地址
  4. RNA 15. SCI 文章中的融合基因之 FusionGDB2
  5. UE4使用Pawn控制旋转是个什么意思?
  6. lisp字体 加框_AutoLISP文字加上下划线
  7. BugKu msic方向 赛博朋克
  8. 1616网址导航php源码,1616上网导航_1616网址导航_我的个性化主页
  9. 山东专升本计算机第一章-计算机信息技术与计算机文化
  10. CF机器码--LOL机器码-LOL黑机器(本日最新教程依旧可用)