如何通过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 相关文章推荐
详解Python pygame安装过程笔记
Jun 05 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
pycharm安装和首次使用教程
Aug 27 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python求最大值最小值方法总结
Jun 25 Python
基于python使用tibco ems代码实例
Dec 20 Python
Python中bisect的使用方法
Dec 31 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 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
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php多重接口的实现方法
2015/06/20 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python中正则表达式的使用方法
2018/02/25 Python
Python图片的横坐标汉字实例
2019/12/04 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
Python print不能立即打印的解决方式
2020/02/19 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
个人素质的自我评价分享
2013/12/16 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
文员求职信
2014/07/15 职场文书
聘用意向书
2014/07/29 职场文书
个人四风对照检查材料
2014/09/26 职场文书
党小组考察意见
2015/06/02 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
详解Python牛顿插值法
2021/05/11 Python