爬虫系列-爬取公众号文章
目录
前言
目前主要爬取微信公众号的文章有以下三种方式:
- 通过微信搜狗搜索,但是这只能根据微信公众号的的文章标题和公众号名字来进行搜索,而且时间不一,文章顺序很乱
- 通过微信公众平台里的接口进行获取,可以通过指定公众号来查看所有的本公众号下的所有文章,这样就可以有序的爬取指定公众号里的文章数据了,这里需要你有一个自己的微信公众号
- 通过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×tamp=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即可领取。
