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

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

前言

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

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

转载请说明出处内容投诉
CSS教程网 » 爬虫系列-爬取公众号文章

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买