如何通过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中dictionary items()系列函数的用法实例
Aug 21 Python
Python 26进制计算实现方法
May 28 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Python3 JSON编码解码方法详解
Sep 06 Python
Python hashlib常见摘要算法详解
Jan 13 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 Python
python退出循环的方法
Jun 18 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
python实现简单猜单词游戏
Dec 24 Python
Python中三种花式打印的示例详解
Mar 19 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
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
vue.js表格分页示例
2016/10/18 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python操作yaml说明
2020/04/08 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
sort命令的作用和用法
2012/11/04 面试题
Java程序员综合测试题
2014/04/25 面试题
公务员职务工作的自我评价
2013/11/01 职场文书
小学校园活动策划
2014/01/30 职场文书
安全环保标语
2014/06/09 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers