如何通过50行Python代码获取公众号全部文章


Posted in Python onJuly 12, 2019

前言

我们平时阅读公众号的文章会遇到一个问题——阅读历史文章体验不好。

我们知道爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章。通过微信公众号的素材管理,获取公众号文章。缺点是需要申请自己的公众号。

如何通过50行Python代码获取公众号全部文章

今天介绍一种通过抓包PC端微信的方式去获取公众号文章的方法。相比其他的方法非常方便。

如何通过50行Python代码获取公众号全部文章

如何通过50行Python代码获取公众号全部文章

如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求 mp.weixin.qq.com/mp/xxx (公众号不让添加主页链接,xxx表示profile_ext) 这个接口。

经过多次测试分析,用到了以下几个参数

  • __biz : 用户和公众号之间的唯一id
  • uin :用户的私密id
  • key :请求的秘钥,一段时候只会就会失效
  • offset :偏移量
  • count :每次请求的条数

数据如下

{
 "ret": 0,
 "errmsg": "ok", # 请求状态
 "msg_count": 10, # 信息条数
 "can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
 "general_msg_list": "{"list":[]}", # 公众号文本信息
 "next_offset": 20, 
 "video_count": 1,
 "use_video_tab": 1,
 "real_type": 0,
 "home_page_list": []
}

部分代码如下

params = {
 '__biz': biz,
 'uin': uin,
 'key': key,
 'offset': offset,
 'count': count,
 'action': 'getmsg',
 'f': 'json'
 }
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
 }
 response = requests.get(url=url, params=params, headers=headers)
 resp_json = response.json()
 if resp_json.get('errmsg') == 'ok':
 resp_json = response.json()
 # 是否还有分页数据, 用于判断return的值
 can_msg_continue = resp_json['can_msg_continue']
 # 当前分页文章数
 msg_count = resp_json['msg_count']
 general_msg_list = json.loads(resp_json['general_msg_list'])
 list = general_msg_list.get('list')
 print(list, "**************")

最后打印的list就是公众号的文章信息详情。包括标题(titile)、摘要(digest)、文章地址(content_url)、阅读原文地址(source_url)、封面图(cover)、作者(author)等等...

输出结果如下:

[{
 "comm_msg_info": {
 "id": 1000000038,
 "type": 49,
 "datetime": 1560474000,
 "fakeid": "3881067844",
 "status": 2,
 "content": ""
 },
 "app_msg_ext_info": {
 "title": "入门爬虫,这一篇就够了!!!",
 "digest": "入门爬虫,这一篇就够了!!!",
 "content": "",
 "fileid": 0,
 "content_url": "http:XXXXXX",
 "source_url": "",
 "cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\/0?wx_fmt=jpeg",
 "subtype": 9,
 "is_multi": 0,
 "multi_app_msg_item_list": [],
 "author": "Python3X",
 "copyright_stat": 11,
 "duration": 0,
 "del_flag": 1,
 "item_show_type": 0,
 "audio_fileid": 0,
 "play_url": "",
 "malicious_title_reason_id": 0,
 "malicious_content_type": 0
 }
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]

获取数据之后,可以保存到数据库中,也可以将文章保存在PDF中。

1、保存在Mongo中

# Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
 app_msg_ext_info = i['app_msg_ext_info']
 # 标题
 title = app_msg_ext_info['title']
 # 文章地址
 content_url = app_msg_ext_info['content_url']
 # 封面图
 cover = app_msg_ext_info['cover']
 # 发布时间
 datetime = i['comm_msg_info']['datetime']
 datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
 mongo_wx.insert({
 'title': title,
 'content_url': content_url,
 'cover': cover,
 'datetime': datetime
 })

结果如下

如何通过50行Python代码获取公众号全部文章

2、导入到PDF文件中

Python3中常用的操作PDF的库有python-pdf和pdfkit。我用了pdfkit这个模块导出pdf文件。

pdfkit是工具包Wkhtmltopdf的封装类,因此需要安装Wkhtmltopdf才能使用。

可以访问 https://wkhtmltopdf.org/downloads.html 下载和操作系统匹配的工具包。

如何通过50行Python代码获取公众号全部文章

实现代码也比较简单,只需要传入导入文件的url即可。

安装pdfkit库

pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
 import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')

运行之后成功导出pdf文件。

如何通过50行Python代码获取公众号全部文章

完整代码

import requests
import json
import time
from pymongo import MongoClient
url = 'http://mp.weixin.qq.com/mp/xxx'(公众号不让添加主页链接,xxx表示profile_ext)
# Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
def get_wx_article(biz, uin, key, index=0, count=10):
 offset = (index + 1) * count
 params = {
 '__biz': biz,
 'uin': uin,
 'key': key,
 'offset': offset,
 'count': count,
 'action': 'getmsg',
 'f': 'json'
 }
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
 }
 response = requests.get(url=url, params=params, headers=headers)
 resp_json = response.json()
 if resp_json.get('errmsg') == 'ok':
 resp_json = response.json()
 # 是否还有分页数据, 用于判断return的值
 can_msg_continue = resp_json['can_msg_continue']
 # 当前分页文章数
 msg_count = resp_json['msg_count']
 general_msg_list = json.loads(resp_json['general_msg_list'])
 list = general_msg_list.get('list')
 print(list, "**************")
 for i in list:
 app_msg_ext_info = i['app_msg_ext_info']
 # 标题
 title = app_msg_ext_info['title']
 # 文章地址
 content_url = app_msg_ext_info['content_url']
 # 封面图
 cover = app_msg_ext_info['cover']
 # 发布时间
 datetime = i['comm_msg_info']['datetime']
 datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
 mongo_wx.insert({
 'title': title,
 'content_url': content_url,
 'cover': cover,
 'datetime': datetime
 })
 if can_msg_continue == 1:
 return True
 return False
 else:
 print('获取文章异常...')
 return False
if __name__ == '__main__':
 biz = 'Mzg4MTA2Nzg0NA=='
 uin = 'NDIyMTI5NDM1'
 key = '20a680e825f03f1e7f38f326772e54e7dc0fd02ffba17e92730ba3f0a0329c5ed310b0bd55b3c0b1f122e5896c6261df2eaea4036ab5a5d32dbdbcb0a638f5f3605cf1821decf486bb6eb4d92d36c620'
 index = 0
 while 1:
 print(f'开始抓取公众号第{index + 1} 页文章.')
 flag = get_wx_article(biz, uin, key, index=index)
 # 防止和谐,暂停8秒
 time.sleep(8)
 index += 1
 if not flag:
 print('公众号文章已全部抓取完毕,退出程序.')
 break
 print(f'..........准备抓取公众号第{index + 1} 页文章.')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
Python找出list中最常出现元素的方法
Jun 14 Python
浅谈Django REST Framework限速
Dec 12 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
python3.6环境安装+pip环境配置教程图文详解
Jun 20 Python
python每天定时运行某程序代码
Aug 16 Python
Python3运算符常见用法分析
Feb 14 Python
Python 在函数上添加包装器
Jul 28 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
python 实现逻辑回归
Dec 30 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 #Python
python pandas获取csv指定行 列的操作方法
Jul 12 #Python
Python3 执行Linux Bash命令的方法
Jul 12 #Python
Flask-WTF表单的使用方法
Jul 12 #Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 #Python
python的debug实用工具 pdb详解
Jul 12 #Python
Flask配置Cors跨域的实现
Jul 12 #Python
You might like
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
Vuejs 单文件组件实例详解
2018/02/09 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
vue配置接口域名方法总结
2019/05/12 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Keras 使用 Lambda层详解
2020/06/10 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
火灾现场处置方案
2014/05/28 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书