开发工具

python版本 : 3.6.4
相关模块:
pdfkit模块;
requests模块;
以及一些Python自带的模块。
抓包工具: fiddler


环境搭建

  1. python 环境
    安装Python并添加到环境变量,pip安装需要的相关模块即可。
  2. fiddler 环境
    去官网下载最新版本的安装包直接安装。
    fiddler官网

原理简介

首先,我们打开fiddler这个抓包软件,其界面如下:

然后,我们设置一下过滤规则以过滤掉没用的数据包,因为我们只想抓取微信相关的数据包而已,而不想其他没用的数据包干扰我们的分析,就像这样:

接着我们在电脑端登录微信,并随便找个公众号,查看它的历史文章列表。就像这样:

不断滚动鼠标滚轮,以查看该公众号更多的历史文章数据。此时,我们可以在fiddler里看到出现了类似如下图所示的情况:

显然,红框里的https请求应该就是获得该微信公众号发的文章相关的数据的请求了。现在,我们来分析一下这个请求。显然,该请求的链接地址构成为:

接着看看请求头,请求头的话在这能看到:

感觉有个user-agent就足够了:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1295.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat'}

接着看看cookies,在这(应该直接复制到代码里就行了):

最后,再看看发送这个请求需要携带哪些参数吧,在这:

即:

action
__biz
f
offset
count
is_ok
scene
uin
key
pass_ticket
wxtoken
appmsg_token
x5

经过测试,我们可以发现如下参数是可以固定的:

action
f
is_ok
scene
uin
key
wxtoken
x5

其他参数的含义我们则可以根据经验和简单的测试进行判断:

1.offset
控制翻页的偏移量参数
2.count
每页的文章数量
3.__biz
公众号标识, 不同的__biz对应不同的公众号
4.pass_ticket
应该是微信登录之后返回的参数吧,
去年尝试模拟登录微信网页版的时候看到返回的参数里就好像有它,
但是现在微信网页版已经被官方封了T_T。
5.appmsg_token
应该也是微信登录之后的一个标识参数吧, 而且和阅读的微信公众号
有关,查看不同的微信公众号时该值也是不同的。

前面三个可变参数都好解决,后面两个参数似乎就比较难办了。不过经过测试,我们可以发现pass_ticket其实是一个可有可无的参数,所以我们可以不管它。而appmsg_token的有效期至少有10几个小时,这段时间足够我们爬取目标公众号的所有文章了,所以直接复制过来就可以了,没必要浪费时间分析这玩意(随便想想也应该知道白嫖腾讯肯定没那么容易的T_T)。写个代码简单测试一下:

import requestssession = requests.Session()
session.headers.update(headers)
session.cookies.update(cookies)
profile_url = '前面抓包得到的请求地址'
biz = 'MzAwNTA5NTYxOA=='
pass_ticket = ''
appmsg_token = '1055_YAmuAw2QG7dM3aTwSVZVqgtRdct6ilAMTwlz7g'
params = {'action': 'getmsg','__biz': biz,'f': 'json','offset': '0','count': '10','is_ok': '1','scene': '123','uin': '777','key': '777','pass_ticket': pass_ticket,'wxtoken': '','appmsg_token': appmsg_token,'x5': '0'}
res = session.get(profile_url, params=params, verify=False)
print(res.text)

运行之后可以发现返回的数据如下:

看来是没啥问题,重新调整封装一下代码,就可以爬取该公众号所有文章的链接啦。具体而言,核心代码实现如下:

'''获得所有文章的链接'''
def __getArticleLinks(self):print('[INFO]: 正在获取目标公众号的所有文章链接...')fp = open('links_tmp.json', 'w', encoding='utf-8')article_infos = {}params = {'action': 'getmsg','__biz': self.cfg.biz,'f': 'json','offset': '0','count': '10','is_ok': '1','scene': '123','uin': '777','key': '777','pass_ticket': self.cfg.pass_ticket,'wxtoken': '','appmsg_token': self.cfg.appmsg_token,'x5': '0'}while True:res = self.session.get(self.profile_url, params=params, verify=False)res_json = res.json()can_msg_continue = res_json.get('can_msg_continue', '')next_offset = res_json.get('next_offset', 10)general_msg_list = json.loads(res_json.get('general_msg_list', '{}'))params.update({'offset': next_offset})for item in general_msg_list['list']:app_msg_ext_info = item.get('app_msg_ext_info', {})if not app_msg_ext_info: continuetitle = app_msg_ext_info.get('title', '')content_url = app_msg_ext_info.get('content_url', '')if title and content_url:article_infos[title] = content_urlif app_msg_ext_info.get('is_multi', '') == 1:for article in app_msg_ext_info.get('multi_app_msg_item_list', []):title = article.get('title', '')content_url = article.get('content_url', '')if title and content_url:article_infos[title] = content_urlif can_msg_continue != 1: breakelse: time.sleep(1+random.random())json.dump(article_infos, fp)fp.close()print('[INFO]: 已成功获取目标公众号的所有文章链接, 数量为%s...' % len(list(article_infos.keys())))

运行之后,我们就可以获得目标公众号的所有文章链接啦:

现在,我们只需要根据这些文章链接来爬取文章内容就行啦。这里我们借助python的第三方包pdfkit来实现将每篇文章都保存为pdf格式的文件。具体而言,核心代码实现如下:

'''下载所有文章'''
def __downloadArticles(self):print('[INFO]: 开始爬取目标公众号的所有文章内容...')if not os.path.exists(self.savedir):os.mkdir(self.savedir)fp = open('links_tmp.json', 'r', encoding='utf-8')article_infos = json.load(fp)for key, value in article_infos.items():print('[INFO]: 正在抓取文章 ——> %s' % key)pdfkit.from_url(value, os.path.join(self.savedir, key+'.pdf'), configuration=pdfkit.configuration(wkhtmltopdf=self.cfg.wkhtmltopdf_path))print('[INFO]: 已成功爬取目标公众号的所有文章内容...')

注意,使用pdfkit前需要先安装wkhtmltox。如下图所示:

运行的效果大概是这样子的:


全部源码

根据自己的抓包结果修改cfg.py文件:

## cfg.py
# 目标公众号标识
biz = 'MzAwNTA5NTYxOA=='
# 微信登录后的一些标识参数
pass_ticket = ''
appmsg_token = '1055_YAmuAw2QG7dM3aTwSVZVqgtRdct6ilAMTwlz7g~~'
# 安装的wkhtmltopdf.exe文件路径
wkhtmltopdf_path = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
## articlesSpider.py
import os
import time
import json
import pdfkit
import random
import requests
import warnings
warnings.filterwarnings('ignore')'''微信公众号文章爬取类'''
class articlesSpider(object):def __init__(self, cfg, **kwargs):self.cfg = cfgself.session = requests.Session()self.__initialize()'''外部调用'''def run(self):self.__getArticleLinks()self.__downloadArticles()'''获得所有文章的链接'''def __getArticleLinks(self):print('[INFO]: 正在获取目标公众号的所有文章链接...')fp = open('links_tmp.json', 'w', encoding='utf-8')article_infos = {}params = {'action': 'getmsg','__biz': self.cfg.biz,'f': 'json','offset': '0','count': '10','is_ok': '1','scene': '123','uin': '777','key': '777','pass_ticket': self.cfg.pass_ticket,'wxtoken': '','appmsg_token': self.cfg.appmsg_token,'x5': '0'}while True:res = self.session.get(self.profile_url, params=params, verify=False)res_json = res.json()can_msg_continue = res_json.get('can_msg_continue', '')next_offset = res_json.get('next_offset', 10)general_msg_list = json.loads(res_json.get('general_msg_list', '{}'))params.update({'offset': next_offset})for item in general_msg_list['list']:app_msg_ext_info = item.get('app_msg_ext_info', {})if not app_msg_ext_info: continuetitle = app_msg_ext_info.get('title', '')content_url = app_msg_ext_info.get('content_url', '')if title and content_url:article_infos[title] = content_urlif app_msg_ext_info.get('is_multi', '') == 1:for article in app_msg_ext_info.get('multi_app_msg_item_list', []):title = article.get('title', '')content_url = article.get('content_url', '')if title and content_url:article_infos[title] = content_urlif can_msg_continue != 1: breakelse: time.sleep(1+random.random())json.dump(article_infos, fp)fp.close()print('[INFO]: 已成功获取目标公众号的所有文章链接, 数量为%s...' % len(list(article_infos.keys())))'''下载所有文章'''def __downloadArticles(self):print('[INFO]: 开始爬取目标公众号的所有文章内容...')if not os.path.exists(self.savedir):os.mkdir(self.savedir)fp = open('links_tmp.json', 'r', encoding='utf-8')article_infos = json.load(fp)for key, value in article_infos.items():print('[INFO]: 正在抓取文章 ——> %s' % key)key = key.replace('\\', '').replace('/', '').replace(':', '').replace(':', '') \.replace('*', '').replace('?', '').replace('?', '').replace('“', '')  \.replace('"', '').replace('<', '').replace('>', '').replace('|', '_')pdfkit.from_url(value, os.path.join(self.savedir, key+'.pdf'), configuration=pdfkit.configuration(wkhtmltopdf=self.cfg.wkhtmltopdf_path))print('[INFO]: 已成功爬取目标公众号的所有文章内容...')'''类初始化'''def __initialize(self):self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1295.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat'}self.cookies = {'wxuin': '913366226','devicetype': 'iPhoneiOS13.3.1','version': '17000c27','lang': 'zh_CN','pass_ticket': self.cfg.pass_ticket,'wap_sid2': 'CNK5w7MDElxvQU1fdWNuU05qNV9lb2t3cEkzNk12ZHBsNmdXX3FETlplNUVTNzVfRmwyUUtKZzN4QkxJRUZIYkMtMkZ1SDU5S0FWQmtSNk9mTTQ1Q1NDOXpUYnJQaDhFQUFBfjDX5LD0BTgNQJVO'}self.profile_url = 'https://mp.weixin.qq.com/mp/profile_ext'self.savedir = 'articles'self.session.headers.update(self.headers)self.session.cookies.update(self.cookies)'''run'''
if __name__ == '__main__':import cfgspider = articlesSpider(cfg)spider.run()

带大家写一波微信公众号的爬取相关推荐

  1. 带大家写一波微信公众号的爬取!谁说微信爬不了的!

    开发工具 python版本 : 3.6.4 相关模块: pdfkit模块: requests模块: 以及一些Python自带的模块. 抓包工具: fiddler 环境搭建 python 环境 安装Py ...

  2. 微信公众号文章爬取方法整理

    微信公众号文章爬取方法整理 1.用python爬取 http://blog.csdn.net/d1240673769/article/details/75907152 实现方法:通过微信提供的公众号文 ...

  3. python3实现微信公众号文章爬取

    基于搜狗微信的文章爬取 前言:文章仅用于学习交流,不足之处欢迎小伙伴指正! 一.功能介绍: 已实现功能: 1.爬取搜狗微信上的分类一栏的所有事件及其他的所有标题事件和加载更多,返回文章链接与标题,并存 ...

  4. python微信爬取教程_[python]微信公众号文章爬取

    [python]微信公众号文章爬取 需求 爬取一些微信公众号的文章 数据来源 1.搜狗微信搜索,可以搜索微信公众号文章,但只能显示该公众号最近十篇的文章 2.通过个人微信公众号中的素材管理,查看其他微 ...

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

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

  6. 微信公众号批量爬取——Java版

    最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很 ...

  7. 微信公众号文章爬取 java

    通过订阅号的方式抓取,频率和次数都会有限制. 代码只是初稿,简单写的测试类.投入实际使用还需做出一些整理(注). public class PersonSubscriptionTest {privat ...

  8. 微信公众号文章爬取下载各种格式

    微信公众号阅读成为许多人每天的日常习惯,相信在每天关注的微信公众号中,总会有一些作者在持续地输出优质内容. 这些内容也许是你所处领域的精华,也许其中的观点启人深思,也许是单纯地喜欢上了某个大V的文字. ...

  9. 使用WebCollector爬虫框架进行微信公众号文章爬取并持久化

    〇.Java爬虫框架有哪些? 1.nutch:Apache下开源爬虫项目,适合做搜索引擎,分布式爬虫只是其中一个功能,功能丰富,文档完整. 2.heritrix:比较成熟,用的人较多,有自己的web管 ...

最新文章

  1. 数据蒋堂 | JOIN简化 - 消除关联
  2. C++ algorithm库中的几个常用函数(swap,reverse,sort)
  3. Salesforce平台入门
  4. 审计文件的作用以及记录的内容,审计日志的记录,以及审计日志包括的内容
  5. 09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
  6. openfire消息通知推送_APP消息推送功能之前端后台设计
  7. 赋值给集合_ArrayList集合源码
  8. oracle的删除的row如何,Oracle 删除大表中部分数据
  9. 互联网日报 | 滴滴全球日订单首次突破5000万;抖音直播间将不支持第三方来源商品;拼多多“开学季”上线...
  10. HTTP协议 (四) 缓存
  11. Python开发环境Linux配置
  12. 微信小程序-跟学笔记
  13. 别样的唐诗宋词汇——基于Python的量化分析挖掘尝试
  14. HDU 3709 Balanced Number 枚举+数位DP
  15. Java快逸报表展现demo_快逸报表操作积累.docx
  16. Access操作必须使用一个可更新的查询
  17. java从文本中提取姓名、身份证、电话、地址
  18. JS的IE和Firefox兼容性汇编(原作:hotman_x)
  19. springboot+Rabit实战一:(Rabbit MQ windows 环境搭建)
  20. 全志F1C100s主线linux入坑记录 (1)linux系统移植

热门文章

  1. 作业帮测试开发工程师面试经验
  2. LSM-Tree 与 RocksDB
  3. 玩游戏一般用什么硬盘
  4. JZOJ 5904【NOIP2018模拟10.15】刺客信条
  5. cocos2dx3.2 实现splash屏幕图片秀滚动
  6. [小说]倩女幽魂(非学术)
  7. 增长黑武器|LTD荣获“2023中国工业数字化赋能奖先锋”
  8. python使用pybarcode 生成一维码
  9. 生成Swagger2静态文档
  10. 报错java.lang.ClassCastException: XXXXXXX.Application cannot be cast to android.app.MyApplicati