前言
目前主要爬取微信公众号的文章有以下三种方式:
- 通过微信搜狗搜索,但是这只能根据微信公众号的的文章标题和公众号名字来进行搜索,而且时间不一,文章顺序很乱
- 通过微信公众平台里的接口进行获取,可以通过指定公众号来查看所有的本公众号下的所有文章,这样就可以有序的爬取指定公众号里的文章数据了,这里需要你有一个自己的微信公众号
- 通过WeWe RSS开源项目,把项目部署到本地,然后通过订阅公众号的方式来进行获取文章的数据。
这里要讲的是第二种方式,通过微信公众号平台来获取数据。
文章爬取
登录微信公众平台
这里需要先登录自己的微信公众平台,然后在首页下新的创作选择文章,点进去之后在正文添加超链接,然后再账号那一行选择要爬取的公众号,接着就会出现公众号发布过的文章,如下图:
查看数据来源
下面就是人民日报公众号发布过的文章列表,这里按F12查看数据来源,在下图可以看到文章数据来源的数据包,那接下来就要对这个url发送请求,然后对这些数据进行清洗,取我们想要的值即可,这里我以文章标题,url,以及文章正文获取这些字段为例:
分析数据
从下图可以看到,我们想要的文章的标题以及文章的地址放在字典中的publish_page—>publish_list—>publish_info—>appmsgex中,其中publish_page和publish_info字段是字符串,需要json格式化,所以我们想要的数据就知道怎么取了!
数据提取
"""
这里response.text是获取到的源码数据
create_time是时间戳,需要做个转换
"""
# 时间戳转换
def timestamp_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库的使用:
- 爬取美国公司案例-parsel库教学篇(Xpath的详细使用)
- 爬取东方财富网-parsel教学篇(正则表达式的详细使用+实例)
- 爬取二手房案例–parsel教学篇(CSS选择器)
从下图可以看到,文章正文的数据在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.创建文件对象
with open('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
"""
class FetchData:
def __init__(self):
self.cookies = {}
self.headers = {
'a***ept': '*/*',
'a***ept-language': 'zh-***,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.***/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=77&createType=0&token=1186604474&lang=zh_***×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_***',
'f': 'json',
'ajax': '1',
}
self.url = 'https://mp.weixin.qq.***/cgi-bin/appmsgpublish'
# 时间戳转换
def timestamp_to_date(self,timestamp):
return time.strftime('%Y-%m-%d', time.localtime(timestamp))
# 爬取数据
def get_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.创建文件对象
with open('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即可领取。