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

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

目录

前言

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

  • 通过微信搜狗搜索,但是这只能根据微信公众号的的文章标题和公众号名字来进行搜索,而且时间不一,文章顺序很乱
  • 通过微信公众平台里的接口进行获取,可以通过指定公众号来查看所有的本公众号下的所有文章,这样就可以有序的爬取指定公众号里的文章数据了,这里需要你有一个自己的微信公众号
  • 通过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

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学 * 引言:块——HDFS存储的核心抽象 * 一、HDFS默认块大小 * 1.1 版本演进与默认值 * 1.2 查看和验证块大小 * 1.3 配置文件中的设置 * 二、为什么HDFS采用块存储? * 2.1 核心设计思想 * 2.2 详细解析:为什么块存储如此重要? * **2.2.1 减少寻址开销,提升I/O效率** * **2.2.2 支持超大文件,超越单机限制** * **2.2.3 简化存储设计,降低元数据复杂度** * **2.2.4 便于数据复制,增强容错性** * **2.2.5 支持数据本地性,

By Ne0inhk

Python调用CosyVoice实战指南:从API封装到异常处理全解析

最近在项目中接入了CosyVoice的语音合成服务,发现官方文档虽然清晰,但真要集成到生产环境,还是有不少坑要踩。今天就把我的实战经验整理成笔记,分享给同样在摸索的开发者朋友们。 CosyVoice是一款功能强大的语音合成服务,它能将文本转换成自然流畅的语音。其核心在于提供了高质量的多种音色选择,并且支持流式音频输出。典型的应用场景非常广泛,比如为有声内容创作提供配音、为智能客服或语音助手生成应答语音,以及为各类应用增加语音播报功能。 在实际调用其HTTP API的过程中,我遇到了不少“陷阱”,总结下来主要有以下五点: 1. 鉴权Token过期与刷新:API调用依赖Access Token,而Token有有效期。新手容易在代码中写死一个Token,或者每次调用都申请一个新Token,前者会导致服务突然中断,后者则会产生不必要的开销和延迟。 2. 流式响应处理不当:CosyVoice返回的是音频二进制流。如果像处理普通JSON响应一样直接response.json(),会报错。更关键的是,需要正确处理分块接收(chunked)的数据,并写入文件或进行后续流式播放,内存管理不当容

By Ne0inhk

Python 程序打包exe加入授权码和注册机

一、总体思路 软件授权方案大概分成两个部分:程序本体 和 注册机。 当用户启动程序时,程序会检验本地的 授权文件 是否合法,若验证通过,则直接进入程序,若未找到授权文件或者授权文件校验失败,则进入重新授权流程。进入授权流程时,程序先扫描本机运行环境,生成 机器码 ,然后提示用户找管理员获取授权码;用户将机器码发送给管理员,管理员将机器码输入 注册机 中,生成与该机器码唯一绑定的 授权码 后,发送给用户;用户在程序中输入授权码,验证通过后正式进入程序,并在本地生成授权文件。 下面是我的软件授权方案的流程图。 以上便是我这套软件授权方案的总体思路,接下来,我会教大家如何用 python 来实现它。 二、实现过程 实现这套授权机制,我们需要解决以下几个小问题。 1. 如何使授权码与机器唯一绑定,仅在本台机器上有效? 2. 如何生成验证码,以及如何验证授权码是否有效? 3. 如何保护自己的授权码不那么容易被人破解? 带着这些问题,我们继续往下看。

By Ne0inhk

Python 和 PyTorch 的核心区别(零基础秒懂)

很多零基础同学会把 Python 和 PyTorch 搞混,核心结论先摆清楚:Python 是一门通用编程语言,PyTorch 是基于 Python 开发的、专门用于深度学习的 “工具库 / 框架” —— 就像 “普通话” 和 “医学专用术语 + 手术工具包” 的区别:普通话是沟通的基础,手术工具包只能用在医学场景,且必须用普通话才能操作。 下面从本质、定位、功能、依赖关系 4 个维度讲透区别,配通俗例子和代码对比,零基础也能理解。 一、核心本质:先搞懂 “是什么” 概念PythonPyTorch本质通用编程语言(和 Java、C++ 同级)基于 Python 的深度学习专用库 / 框架(和 NumPy、Pandas 同级,只是聚焦深度学习)

By Ne0inhk