带大家写一波微信公众号的爬取

开发工具

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58626.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信公众号开发之关键词回复

微信公众号开发详细教程 公众号的关键词回复是一个最基本的功能&#xff0c;大部分的关键词回复可以在授权的第三方平台(微微校、腾讯微校等)去进行管理&#xff0c;配置开发服务器之后&#xff0c;微信平台的自动回复和自定义菜单会失效&#xff0c;而在开发服务器里面管理这…

外汇天眼:使用 MT4 进行交易的最佳方式

在外汇交易方面&#xff0c;MT4是最受欢迎的软件之一。它提供了广泛的功能和工具&#xff0c;可用于进行有利可图的交易。 在本文中&#xff0c;我们将熟悉 Metatrader 4&#xff0c;并了解一些使用它进行交易的最佳方式。 让我们从基础开始。 Metatrader 4 基础知识 Metatr…

期货从入门到高深之手动交易---软件的使用2

上期说了新手如何选择期货交易软件&#xff0c;这集来说说软件的使用规则 首先我们找到你所开户的期货公司官网在其下载栏里下载 例如 一般来说&#xff0c;你在哪家开的户&#xff0c;软件下载好了之后直接会显示这家期货公司的坐席号&#xff0c;如下图所示 接着进入界面&a…

期货开户加一分高交返靠谱吗?

接下来讲讲手续费的标准。目前对于新人来说期货公司的选择确实有一些复杂&#xff0c;交易者可以经过对比选择最适合自己的期货公司&#xff0c;对比一下手续费。 一、手续费加一分 期货手续费交易所手续费期货公司佣金 交易所手续费是固定不变的&#xff0c;是交易所直接收…

正大国际期货:如何提升外盘恒指交易技巧?

一、心态的调整 首要最难做到的是心态的调整。人的情绪是多变的&#xff0c;如果你没有一颗平静的心&#xff0c;在这个行业成功的几率很小。赚钱不骄傲&#xff0c;亏钱不沮丧&#xff0c;没有人能完全地做到&#xff0c;但是我们要尽量去做到。赚钱不必欣喜若狂&#xff0c;…

正大国际期货:恒指操作技巧之交易中五种绝佳的开仓思路分析

很多人总是亏损&#xff0c;其实最重要的原因之一是没有一个优势的概率系统&#xff0c;正大IxxxuanI经过了解之后&#xff0c;对目前市面上概率系统进行总结&#xff0c;现将以下几种优势的概率系统归纳罗列如下&#xff0c;有缘者定可举一反三&#xff0c;或可为你细化和改良…

想炒期货是如何开户的?

随着互联网时代的到来&#xff0c;如今95%的期货交易者都采用网上开户&#xff0c;可以在网上找到更优质的期货公司进行开户&#xff0c;一般开户使用手机或者电脑开户都可以&#xff0c;实际开户中用手机的可能要多一些。 那这里可能没有做过的会有疑问&#xff0c;为什么不是…

三种最常用的期货交易系统,99%的人都不知道

作为一个有多年交易经验的期货交易者&#xff0c;我发现大部分的交易者竟然一直在用错误的交易理念去做交易。当然&#xff0c;在做交易初期&#xff0c;我也是一样。只不过我后来找到了对的路。坦白说&#xff0c;我找到正确的交易系统&#xff0c;并不是因为我聪明&#xff0…

chatgpt赋能python:Python怎么做选择题?

Python怎么做选择题&#xff1f; 作为一种最广泛使用的编程语言之一&#xff0c;Python被广泛应用于数据科学、机器学习、人工智能、Web开发等领域&#xff0c;而我们今天要聚焦的是Python如何实现选择题的功能。 选择题是什么&#xff1f; 选择题是一种常见的考试题型&…

保姆级教程:Spring Cloud 集成 Seata 分布式事务

点击关注公众号&#xff0c;Java干货及时送达&#x1f447; 环境搭建 Nacos搭建 最新版本快速搭建 使用Mysql模式 Nacos直接启动即可。控制台默认账号密码是nacos/nacos&#xff0c;Mysql账户密码有两个 root/root 和 nacos/nacos。 Seata搭建 Seata版本1.5.0 快速搭建 Seata1.…

《AI绘画工具保姆级指南手册--以Midjourney为例【含国内中文版】》

大家下午好&#xff0c;近期陆陆续续有很多饱子私信我&#xff0c;表达出非常热切的心情&#xff0c;想要学习关于AIGC领域的AI绘画&#xff0c;毕竟AI绘画工具真的很火&#xff1b;这是前一阵给大家分享了《AIGC之文本生成指南手册 --以ChatGPT为例》&#xff0c;感兴趣饱子可…

Ai口播几天涨粉20w项目拆解(保姆级教程)

这几天看老妈在刷某音&#xff0c;看到她总是刷到一些小朋友的视频。声音很可爱&#xff0c;凑过去一看原来是一个小和尚在说一些祝福话。仔细一看其实是一个Ai人物在口播。然后到某书上一搜索。好家伙&#xff01;整屏幕都是。而且不乏一二十万粉丝账号的。每个账号发布的视频…

史上最详细使用copliot AI保姆级教程来了

目录 概述 第一步:注册 第二步:使用 第三步:copliot基本用法 第四步:copliot成功案列 概述 Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方…

公司入职一个阿里大佬,把SpringBoot项目启动从420秒优化到了40秒!

大家好&#xff0c;我是老赵 0.背景 公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓慢&#xff0c;常常需要6-7分钟才能暴露端口&#xff0c;严重降低开发效率。通过 SpringBoot 的 SpringApplicationRunListener 、BeanPostProcessor 原理和源码调试等手段排查发…

SpringBoot 统一功能处理

大家好&#xff0c;我是老赵 前言 接下来是 Spring Boot 统⼀功能处理模块了&#xff0c;也是 AOP 的实战环节&#xff0c;要实现的课程⽬标有以下 3 个&#xff1a; 统⼀⽤户登录权限验证统⼀数据格式返回统⼀异常处理 接下我们⼀个⼀个来看。 一、用户登录权限效验 ⽤户登录权…

目标检测算法——YOLOv5/YOLOv7改进结合轻量型Ghost模块

>>>深度学习Tricks&#xff0c;第一时间送达<<< 论文题目&#xff1a;《GhostNet&#xff1a;More Features from Cheap Operations》论文地址&#xff1a; https://arxiv.org/pdf/1911.11907v1.pdf 由于内存和计算资源有限&#xff0c;在嵌入式设备上部署…

苹果最新动态 苹果推送 iOS 14 正式版发布

苹果发布会此次虽然没有公布新手机&#xff0c;预计是在国庆期间吧&#xff0c;不过发布会上还是公布了一些信息&#xff0c;下面给大家整理下苹果的最新动态&#xff0c;一起来看看&#xff01; 苹果推送 iOS 14 正式版 9 月 17 日&#xff0c;苹果正式推送了 iOS 14、iPadOS…

彩票走势图xcode源码

#源码介绍 此份彩票走势图源码是用xcode写的&#xff0c;需要的小伙伴自取哦。 #效果展示 #源码已上传阿里云oss&#xff0c;彩票走势图传送门 来自&#xff1a;https://12580code.com/631.html

iOS 14 大改还有神秘硬件登场,苹果 WWDC20 今夜线上发布

来源 | 网易科技 头图 | CSDN付费下载自视觉中国 受全球疫情影响&#xff0c;科技数码行业元气大伤&#xff0c;当工厂停工、发布会转线上、产品推迟上市成为常态&#xff0c;我们也渐渐习惯了在电脑前默默的等待&#xff0c;享受云上狂欢。此前苹果已经公布&#xff0c;今年 W…