Python爬取微信公众号文章、点赞数

article/2025/10/6 16:29:29

代码还是热乎的,只要你细心一步步的慢慢调试,绝壁没问题

前期准备

  1. 订阅号;
  2. Python;
  3. Fiddler;
  4. 微信账号;

流程

  1. 使用用微信公众号生成cookie
  2. 使用Fiddler抓取微信公众号数据, 获取阅读数
  3. 通过cookie请求公众号获取文章,再使用Fiddler抓取的数据获取阅读数
  4. 整理数据写入到数据库

效果

  1. 平均20s可爬取一篇文章。为了微信号、订阅号的安全 时间间隔长一点
  2. 可按日期爬取文章。
  3. 视频文章无法爬取。当然了代码优化优化应该也是可以的
  4. 订阅号会出现 搜索文章限制问题。换一个订阅号解决

操作

操作

  1. 获取订阅号Cookie
    1.1、基于Python调用chromedriver.exe, 打开URL
    1.2、输入账号、密码
    1.3、手动扫码
    1.4、生成cookie.txt 文件, 包含cookie信息
    在这里插入图片描述
  2. Fiddler抓取微信客户端公众号请求数据, 获取阅读量
    需要获取req_id 、 pass_ticket 、 appmsg_tojen、cookie 和user-agent
    在这里插入图片描述
    2、1 电脑登录微信(PC版)
    2、2 关注需要爬取的公众号
    2、3 设置Fiddler 并保存配置
    在这里插入图片描述
    微信客户端请求公众号文章, fiddler抓取到的数据req_id 、 pass_ticket 、 appmsg_tojen
    在这里插入图片描述
    在这里插入图片描述
    微信客户端请求公众号文章, fiddler抓取到的数据cookie 和user-agent

在这里插入图片描述

最后恢复Fiddler的配置,会报错的

END!!!前面的获取工作就结束了…

一、获取cookie

# -*- coding: utf-8 -*-import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')post = {}driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('订阅号账号')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('订阅号密码')# 自动输入密码后点击记住密码
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 扫码
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt', 'w+', encoding='utf-8') as f:f.write(cookie_str)print('cookie write ok ...')

二、获取文章数据(文章列表写入数据库)
在这里插入图片描述

# -*- coding: utf-8 -*-import time, datetime
import json
import requests
import re
import random
import MySQLdb#设置要爬取的公众号列表
gzlist=['ckxxwx']
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )# 数据的开始日期 - 结束日期
start_data = '20190630';
end_data = '20190430'# 使用cursor()方法获取操作游标
cursor = db.cursor()# 获取阅读数和点赞数
def getMoreInfo(link, query):pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"if query == 'ckxxwx':appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"mid = link.split("&")[1].split("=")[1]idx = link.split("&")[2].split("=")[1]sn = link.split("&")[3].split("=")[1]_biz = link.split("&")[0].split("_biz=")[1]# 目标urlurl = "http://mp.weixin.qq.com/mp/getappmsgext"# 添加Cookie避免登陆操作,这里的"User-Agent"最好为手机浏览器的标识headers = {"Cookie": phoneCookie,"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400"}# 添加data,`req_id`、`pass_ticket`分别对应文章的信息,从fiddler复制即可。data = {"is_only_read": "1","is_temp_url": "0","appmsg_type": "9",'reward_uin_count': '0'}params = {"__biz": _biz,"mid": mid,"sn": sn,"idx": idx,"key": '777',"pass_ticket": pass_ticket,"appmsg_token": appmsg_token,"uin": '777',"wxtoken": "777"}# 使用post方法进行提交content = requests.post(url, headers=headers, data=data, params=params).json()# 提取其中的阅读数和点赞数if 'appmsgstat' in content:readNum = content["appmsgstat"]["read_num"]likeNum = content["appmsgstat"]["like_num"]else:print('请求参数过期!')# 歇10s,防止被封time.sleep(10)return readNum, likeNum#爬取微信公众号文章,并存在本地文本中
def get_content(query):#query为要爬取的公众号名称#公众号主页url = 'https://mp.weixin.qq.com'#设置headersheader = {"HOST": "mp.weixin.qq.com","User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"}#读取上一步获取到的cookieswith open('cookie.txt', 'r', encoding='utf-8') as f:cookie = f.read()cookies = json.loads(cookie)#登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,从这里获取token信息response = requests.get(url=url, cookies=cookies)token = re.findall(r'token=(\d+)', str(response.url))[0]time.sleep(2)#搜索微信公众号的接口地址search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'#搜索微信公众号接口需要传入的参数,有三个变量:微信公众号token、随机数random、搜索的微信公众号名字query_id = {'action': 'search_biz','token' : token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'query': query,'begin': '0','count': '5'}#打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headerssearch_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)#取搜索结果中的第一个公众号lists = search_response.json().get('list')[0]#获取这个公众号的fakeid,后面爬取公众号文章需要此字段fakeid = lists.get('fakeid')#微信公众号文章接口地址appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'#搜索文章需要传入几个参数:登录的公众号token、要爬取文章的公众号fakeid、随机数randomquery_id_data = {'token': token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'action': 'list_ex','begin': '0',#不同页,此参数变化,变化规则为每页加5'count': '5','query': '','fakeid': fakeid,'type': '9'}#打开搜索的微信公众号文章列表页appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)#获取文章总数if appmsg_response.json().get('base_resp').get('ret') == 200013:print('搜索公众号文章操作频繁,!!!')max_num = appmsg_response.json().get('app_msg_cnt')#每页至少有5条,获取文章总的页数,爬取时需要分页爬num = int(int(max_num) / 5)#起始页begin参数,往后每页加5begin = 0  # 根据内容自定义while num + 1 > 0 :query_id_data = {'token': token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'action': 'list_ex','begin': '{}'.format(str(begin)),'count': '5','query': '','fakeid': fakeid,'type': '9'}print('正在翻页:--------------',begin)time.sleep(5)#获取每一页文章的标题和链接地址,并写入本地文本中query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)fakeid_list = query_fakeid_response.json().get('app_msg_list')for item in fakeid_list:content_link=item.get('link')content_title=item.get('title')update_time=item.get('update_time')timeArray = time.localtime(update_time)DataTime = time.strftime("%Y%m%d", timeArray)print(DataTime)Yearsmonth = time.strftime("%Y%m", timeArray)if DataTime <= start_data:if DataTime <= end_data:mark = '1'print('END....')break  # 退出# 阅读数 点赞数readNum, likeNum = getMoreInfo(item['link'], query)print(readNum, likeNum, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))mark = '0'# SQL 插入语句sql = """INSERT INTO `wechat_urls` (`title`, `url`, `data_date`, `gzname`, `read_num`, `like_num`) VALUES ('""" + content_title + """', '""" + content_link+ """', '""" + DataTime+ """', '""" + query+ """', '""" + str(readNum)+ """', '""" + str(likeNum)+ """');"""try:# 执行sql语句print(sql)cursor.execute(sql)# 提交到数据库执行db.commit()except:# Rollback in case there is any errordb.rollback()elif DataTime >= start_data:mark = '2'print('END....')break  # 退出time.sleep(5)if mark == '0':num -= 1begin = int(begin)begin += 5time.sleep(3)elif mark == '1':break  # 退出elif mark == '2':num -= 1begin = int(begin)begin += 1time.sleep(20)# 关闭数据库连接# db.close()if __name__=='__main__':try:#登录之后,通过微信公众号后台提供的微信公众号文章接口爬取文章for query in gzlist:#爬取微信公众号文章,并存在本地文本中print("开始爬取公众号:"+query)get_content(query)print("爬取完成")except Exception as e:print(str(e))

console日志
在这里插入图片描述

三、读取URL列表, 文章数据写入数据库

from urllib.request import urlopen
import MySQLdb
import requests
from pyquery import PyQuery as pq
import time, datetime# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()# 写入数据
def insert_contents(title, url, data_date, gzname, read_num, like_num):# 抓取页码内容,返回响应对象response = requests.get(url)response.encoding = 'utf-8'# 将html构建为Xpath模式doc = pq(response.text)js_content = doc('#js_content').text()# SQL 插入语句sql = """INSERT INTO `wechat_reptile_data`.`wechat_datas` (`title`, `content`, `gzh`, `data_date`, `read_num`, `like_num`) VALUES ('""" + title + """', '""" + js_content + """', '""" + gzname + """', '""" + data_date + """', '""" + str(read_num) + """', '""" + str(like_num) + """');"""try:# 执行sql语句print('===>>>', data_date+' : '+gzname)cursor.execute(sql)# 提交到数据库执行db.commit()except:# Rollback in case there is any errordb.rollback()time.sleep(1)# 更新数据
def update_contents(title, url, data_date, gzname):# SQL 更新语句sql = """UPDATE wechat_urls SET state = '1' WHERE title = '"""+title+"""' AND data_date = '"""+data_date+"""' AND gzname = '"""+gzname+"""'"""try:# 执行SQL语句cursor.execute(sql)# 提交到数据库执行db.commit()except:# 发生错误时回滚db.rollback()time.sleep(1)# SQL 查询语句
sql = "select * from wechat_urls where state='0';"
try:# 执行SQL语句cursor.execute(sql)# 获取所有记录列表results = cursor.fetchall()for row in results:title = row[0]url = row[1]data_date = row[2]gzname = row[3]read_num = row[4]like_num = row[5]insert_contents(title, url, data_date, gzname, read_num, like_num)update_contents(title, url, data_date, gzname)
except:print("Error: unable to fecth data")

代码是东拼西凑写出来的还没来得及优化

看见一年前发布的这个文章,有部分同学比较感兴趣,我就找了找源码
源码我发布到了CSDN的下载站
Reptile_Wechat_Data.rar
源码包内包含了全部的源码、Sql文件、配置文件
代码、数据结构一直没有优化
参考就好


http://chatgpt.dhexx.cn/article/3mVuDG5Q.shtml

相关文章

如何爬取微信公众号文章(二)

在如何爬取微信公众号&#xff08;一&#xff09;中完成了将爬取公众号文章的元数据存入数据库&#xff0c;其中包括文章的连接、标题、发布时间、摘要和封面图片等信息。下面介绍如何根据文章链接来爬取文章内容。 开发环境 windows 7 x64python3.7 (Anaconda)vscode 编辑器…

如何爬取微信公众号文章(一)

微信公众号是目前最为流行的自媒体之一&#xff0c;上面有大量的内容&#xff0c;如何将自己感兴趣的公众号内容爬取下来&#xff0c;离线浏览&#xff0c;或者作进一步的分析呢&#xff1f; 下面我们讨论一下微信公众号文章的爬取。 环境搭建 windows 7 x64python3.7 (Anac…

Python 爬虫之微信公众号

Python 爬虫之微信公众号 源代码放在文末。 本次爬虫需要的工具如下: selenium 驱动器对应浏览器的 webdriver一个微信订阅号在 2017 年 6 月左右,微信官方发布一篇文章 https://mp.weixin.qq.com/s/67sk-uKz9Ct4niT-f4u1KA,大致意思就是以后发布文章的时候可以插入其他公…

公网访问局域网家用nas

提到外网访问不得不说说家里局域网的搭建结构了&#xff0c;就拿大众最常用的方式举例&#xff0c;网络运营商的光纤入户&#xff0c;通过运营商提供的光猫直接pppoe进行拨号&#xff0c;再连接自己的路由器&#xff0c;分配至各网口。 自从上次充当灵魂画手被嘲笑了以后就改用…

外网访问群晖NAS VMM搭建Openwrt的admin界面

偶然在网上看到很多的帖子使用群晖搭建openwrt搭建旁路由,心血来潮体验了一把,记录一下自己的搭建的整个过程,并最终实现外网访问Openwrt的admin界面。 本人使用的群晖nas DS220+,其他品牌未尝试。 一、前期配置 1、先在套件中心下载VMM(Virtaul Machine Manager) 2、下…

2022年10月 cpolar软件实现内网穿透连接群晖NAS

前言 1.cpolar简介 cpolar是一款拥有远程控制和内网穿透功能的软件。而且还可以监控端口的HTTP请求&#xff0c;利用实时的cpolar Web UI开发者工具&#xff0c;让您调试代码更容易。您可以监听所有隧道上的HTTP消息包&#xff0c;分析消息包的结构内容&#xff0c;找出问题点…

群晖内网穿透 实现外网快速访问 无需公网

有群晖的情况下&#xff0c;在内网我们可以通过ip正常访问我们的群晖/NAS;但是我们想要在外网访问的时候该怎么办&#xff0c;没有公网ip&#xff0c;扯专线太贵&#xff0c;自己搭建太麻烦。这无疑是个难题&#xff1b; 今天&#xff0c;小编找到了一款免费的内网穿透工具来实…

通过公网+域名访问家里的群晖服务器

公网域名访问群晖服务器 前言准备的东西如何判断你家里的宽带是公网IP通过公网IP网访群晖&#xff0c;端口映射申请域名和DDNS添加DDNS映射写在最后 前言 最近换了个工作&#xff0c;然后有代码的托管需求。想想用GitHub太卡了&#xff0c;国内的开源托管网站因为一些国人的素…

猫盘群晖外部网络访问的三种方法:公网IP、内网穿透、qc的实际评测

目录 具体过程概述内网穿透公网IPQuickconnect(QC&#xff09;结语 具体过程 概述 最近想入手一个NAS&#xff0c;由于我是新手入门&#xff0c;就选择入手了便宜的猫盘。我的猫盘是白群晖系统所以支持QC的功能&#xff0c;因此对目前猫盘群晖的DiskStation Manager&#xff…

特征值和特征矩阵

写一点对矩阵特征值和特征矩阵的理解 1. A是一个矩阵&#xff0c;它作用在向量v上。如果A是2阶对角阵的话&#xff0c;它起到的作用是将向量v在横纵方向拉伸 2. 当A是一个普通2阶矩阵时&#xff0c;它对v的拉伸不再是横纵方向&#xff0c;而是任意方向的&#xff0c;这取决于实…

三阶矩阵求特征值的快速算法

一般的三阶矩阵求特征值其实是解析不了的&#xff0c;因为特征方程对应的是三次方程&#xff0c;对于一般的三次方程&#xff0c;是很难求解的。要想方程有三个整数根&#xff0c;并且能够不用完全暴力展开三阶行列式这样的矩阵实际是很特殊的。 1.某一行有两个0的情况是最好算…

用R求矩阵的特征值和特征向量

最近在学习多元统计分析的主成分分析时&#xff0c;发现需要经常计算矩阵的特征值和特征向量&#xff0c;自己就找了下用R来做计算的函数。 我们可以用sigen()函数来计算特征对。 #创建一个矩阵 a <- matrix(c(11,sqrt(3)/2,3/2,sqrt(3)/2,21/4,5*sqrt(3)/4,3/2,5*sqrt(3)/…

怎么算特征值和特征矩阵?

怎样更通俗的理解特征值和特征矩阵&#xff1f; 设A是一个n阶矩阵&#xff0c;若数和n维非零列向量满足&#xff0c;数称为A的特征值&#xff0c;x称为A对应于特征值的特征向量。此时叫做特征多项式&#xff0c;若特征多项式为0则称为A的特征方程&#xff08;齐次线性方程组&a…

矩阵特征值和特征向量的求取

最近项目中有一个模块需要求矩阵的最大特征值和特征值对应的特征向量&#xff0c;无奈&#xff0c;又重新将以前学习的这方面的知识重新温习了一遍&#xff0c;感觉还是当时学的不够深&#xff0c;所以谢谢感悟&#xff0c;顺便对知识点进行一个总结。 首先特征值和特征向量的…

matlab如何求矩阵特征值

根据线性代数理论&#xff0c;特征值与特征向量只存在于方阵。如下所示为一方阵A&#xff1a; 在matlab输入矩阵&#xff1a; A [1 2 4; 4 0 7 9 1 3]; 查阅matlab help可以知道&#xff0c;利用eig函数可以快速求解矩阵的特征值与特征向量。 格式&#xff1a;[V,D] eig(A) 说…

delphi 连接轻量级数据库 sqlite3

环境: windows7-64, delphi7, sqlite3 最近搞个小工具&#xff0c;要用到轻量级数据库。以前小型数据库是用mdb的&#xff0c;但连接mdb 需要odbc的支持。 对环境依赖性很大&#xff0c;于是换了一种传说中的轻量级数据库。 sqlite 很小巧&#xff0c;delphi 7 连接sqlite…

轻量级数据库sqlite,spring boot+sqlite的配置详解 (一)

spring bootsqlite的配置&#xff0c;及成功运行详解 sqlite数据库的安装与调试 首先&#xff0c;通过sqlite官方地址下载对应的安装包 https://www.sqlite.org/download.html 下载对应版本的安装包和工具包 解压后会得到这几个文件&#xff0c;将这几个文件放在同一目录下 …

腾讯云——轻量数据库服务

轻量数据库服务采用腾讯云自研的新一代云原生数据TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。 定制内核&#xff1…

轻量级关系数据库SQLite的安装和SpringBoot整合

简介 SQLite是轻量级的关系型数据库&#xff0c;适用于中小型应用场景&#xff1a;如安卓、网站、终端设备。并且轻量&#xff08;服务端1M&#xff09;、方便移植&#xff08;只需要移动*.db文件到另外一台电脑&#xff09; 安装 官网链接&#xff1a;https://www.sqlite.o…

HarmonyOS之数据管理·轻量级偏好数据库的应用

一、简介 ① 基本概念 轻量级偏好数据库主要提供轻量级 Key-Value 操作&#xff0c;支持本地应用存储少量数据&#xff0c;数据存储在本地文件中&#xff0c;同时也加载在内存中的&#xff0c;所以访问速度更快&#xff0c;效率更高。轻量级偏好数据库属于非关系型数据库&…