爬虫系列-爬取公众号文章

爬虫系列-爬取公众号文章

目录

前言

目前主要爬取微信公众号的文章有以下三种方式:

  • 通过微信搜狗搜索,但是这只能根据微信公众号的的文章标题和公众号名字来进行搜索,而且时间不一,文章顺序很乱
  • 通过微信公众平台里的接口进行获取,可以通过指定公众号来查看所有的本公众号下的所有文章,这样就可以有序的爬取指定公众号里的文章数据了,这里需要你有一个自己的微信公众号
  • 通过WeWe RSS开源项目,把项目部署到本地,然后通过订阅公众号的方式来进行获取文章的数据。
这里要讲的是第二种方式,通过微信公众号平台来获取数据。

文章爬取

登录微信公众平台

这里需要先登录自己的微信公众平台,然后在首页下新的创作选择文章,点进去之后在正文添加超链接,然后再账号那一行选择要爬取的公众号,接着就会出现公众号发布过的文章,如下图:

在这里插入图片描述

查看数据来源

下面就是人民日报公众号发布过的文章列表,这里按F12查看数据来源,在下图可以看到文章数据来源的数据包,那接下来就要对这个url发送请求,然后对这些数据进行清洗,取我们想要的值即可,这里我以文章标题,url,以及文章正文获取这些字段为例:

在这里插入图片描述

分析数据

从下图可以看到,我们想要的文章的标题以及文章的地址放在字典中的publish_page—>publish_list—>publish_info—>appmsgex中,其中publish_page和publish_info字段是字符串,需要json格式化,所以我们想要的数据就知道怎么取了!

在这里插入图片描述

数据提取

""" 这里response.text是获取到的源码数据 create_time是时间戳,需要做个转换 """# 时间戳转换deftimestamp_to_date(timestamp):return time.strftime('%Y-%m-%d', time.localtime(timestamp)) data = json.loads(response.text) date_public = json.loads(data.get('publish_page')).get('publish_list') articles =[]for item in date_public: data_res = json.loads(item.get('publish_info')) appmsgex = data_res.get('appmsgex')for data_detail in appmsgex: title = data_detail.get('title',"") link = data_detail.get('link',"") create_time = timestamp_to_date(data_detail.get('create_time',"")) articles.append({'title': title,'link': link,'create_time':create_time})

除了爬取文章标题,发表时间等数据外,还需要爬取每个文章的正文数据,这里我们已经获取到了文章的url,所以只需要请求url,然后使用python的第三方parsel库用来解析数据:
这里有parsel库的使用:

从下图可以看到,文章正文的数据在id为js_content的div标签中,所以提取正文的代码如下:

""" 这里link为上一步获取的文章地址 """ headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0"} detail_article = requests.get(link,headers=headers) selectors = parsel.Selector(detail_article.text) data = selectors.xpath('//div[@id="js_content"]') data_detail = data.css('*::text').getall() page_info =" ".join(i for i in data_detail)
在这里插入图片描述

这里把爬取到的数据存到csv表格中,存储到csv文件中的代码如下:

""" 这里acticles是爬取到的数据以字典格式存到列表中 """# 1.创建文件对象withopen('articles.csv','w',newline='',encoding='utf-8')as f:# 2.构建表头 fieldnames =['title','link','time','content']# 3.创建写入对象 writer = csv.DictWriter(f, fieldnames=fieldnames)# 4.写入表头 writer.writeheader()# 5.写入数据for acticle in articles: writer.writerow(acticle)

源码

import requests import json from time import sleep import time import parsel import csv """ Cookie需要自己账号的Cookie """classFetchData:def__init__(self): self.cookies ={} self.headers ={'accept':'*/*','accept-language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','priority':'u=1, i','referer':'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=77&createType=0&token=1186604474&lang=zh_CN&timestamp=1758512686251','sec-ch-ua':'"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"','sec-ch-ua-mobile':'?0','sec-ch-ua-platform':'"Windows"','sec-fetch-dest':'empty','sec-fetch-mode':'cors','sec-fetch-site':'same-origin','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0','x-requested-with':'XMLHttpRequest'} self.params ={'sub':'list','search_field':'null','begin':'135','count':'5','query':'','fakeid':'MjM5MjAxNDM4MA==','type':'101_1','free_publish_type':'1','sub_action':'list_ex','fingerprint':'xxx','token':'xxx','lang':'zh_CN','f':'json','ajax':'1',} self.url ='https://mp.weixin.qq.com/cgi-bin/appmsgpublish'# 时间戳转换deftimestamp_to_date(self,timestamp):return time.strftime('%Y-%m-%d', time.localtime(timestamp))# 爬取数据defget_data(self): response = requests.get(self.url, params=self.params, cookies=self.cookies, headers=self.headers) data = json.loads(response.text) date_public = json.loads(data.get('publish_page')).get('publish_list') articles =[]for item in date_public: data_res = json.loads(item.get('publish_info')) appmsgex = data_res.get('appmsgex')for data_detail in appmsgex: title = data_detail.get('title',"") link = data_detail.get('link',"") create_time = self.timestamp_to_date(item.get('create_time')) detail_article = requests.get(link,headers=self.headers) selectors = parsel.Selector(detail_article.text) data = selectors.xpath('//div[@id="js_content"]') data_detail = data.css('*::text').getall() page_info =" ".join(i for i in data_detail) articles.append({'title': title,'link': link,'time': create_time,'content': page_info,}) sleep(1)# 1.创建文件对象withopen('articles.csv','w',newline='',encoding='utf-8')as f:# 2.构建表头 fieldnames =['title','link','time','content']# 3.创建写入对象 writer = csv.DictWriter(f, fieldnames=fieldnames)# 4.写入表头 writer.writeheader()# 5.写入数据for acticle in articles: writer.writerow(acticle)

效果

在这里插入图片描述

共勉

你可以看起来菜,但你不能真的菜。

博客

  • 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感兴趣的同学可以关注一下,大家一起进步。
  • 之前在公众号发布了一个kali破解WiFi的文章,感兴趣的伙伴可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频,另外,up主最近在b站更新一些比较受欢迎的GitHub项目,感兴趣的伙伴们可以去看下:GitHub合集
  • 在GitHub上也在更新博客项目以及爬虫案例:

python资料

我这里整理了python的学习资料,关注公众号laity的渗透测试之路,回复python即可领取。

在这里插入图片描述

Read more

Centos7安装docker+redis+pgsql

服务器部署教程(Docker + PostgreSQL + Redis ) 环境:CentOS 7 x2 / 两台服务器均有 /data 大分区(94G) 一、服务器信息 服务器IP系统用途ad-db10.60.9.xCentOS 7数据库服务器(PostgreSQL)ad-app10.60.9.yCentOS 7应用服务器(Django + Redis) 系统账号 服务器用户名备注ad-dbbsadminsudo 免密权限ad-appbsadminsudo 免密权限 二、前置检查(两台服务器都要执行) 1. 查看系统版本 cat /etc/os-release 2. 查看资源状态 free-h# 内存df-h# 磁盘 nproc # CPU核心数 3. 确认 sudo 权限

By Ne0inhk
【2025 最新】 MySQL 数据库安装教程(超详细图文版):从下载到配置一步到位

【2025 最新】 MySQL 数据库安装教程(超详细图文版):从下载到配置一步到位

MySQL 作为开源关系型数据库的标杆,广泛应用于 Web 开发、数据分析等场景,是程序员必备的基础工具之一。本文针对 2025 年最新版本 MySQL(以 MySQL 8.4.7为例),详细讲解 Windows 10/11 系统下的下载、安装、配置全流程,同时涵盖常见问题排查,适合零基础新手快速上手。 一、安装前准备 1. 确认系统环境 * 操作系统:Windows 10(64 位)或 Windows 11(64 位) * 硬件要求:至少 2GB 内存,10GB 以上空闲磁盘空间 * 依赖环境:无需额外安装依赖(安装包自带必要组件) 2. 下载

By Ne0inhk

【使用 NVM 安装 Node.js 22 并配置国内镜像加速】

安装 NVM Windows用户可通过下载nvm-windows的.exe安装包完成安装。Linux或macOS用户使用以下命令: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh |bash 安装后需重新打开终端或执行source ~/.bashrc使配置生效。 配置国内镜像源 Windows系统在CMD/PowerShell中设置环境变量: set NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ Linux/macOS用户将以下内容添加到~/.bashrc或~/.zshrc: exportNVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ 执行source ~/.bashrc立即生效。 安装Node.js 22

By Ne0inhk
Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案

Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 第三方库 spa 的鸿蒙适配实战 - 打造单页应用架构、动态渲染路由状态及鸿蒙大屏多窗体验优化方案 前言 随着移动端交互的日益复杂,用户对 App 的流畅度要求已不仅仅停留在“帧率”上,更多的是关于页面切换的“无缝感”。单页应用(Single Page Application, SPA)模式,通过在一个长生命周期的视图内动态替换内容节点,有效地避免了频繁的页面推栈(Push/Pop)带来的布局重绘开销。 spa 库是 Flutter 生态中一个非常独特且高效的路由增强工具。它将路由状态抽象为一套可观察的树状结构,让开发者能像管理 Web 应用一样管理 Flutter 的页面状态。 在鸿蒙系统(OpenHarmony)适配实战中,面对折叠屏的灵活切换和平板的多窗协同,spa 提供了一种天然的“响应式分发”基座。

By Ne0inhk