admin 管理员组

文章数量: 887019

1.获取一些必要的信息

1.1获取cookie、fakeid、token三者的值

1.首先进入微信公众号平台,如果没有微信公众号则创建一个微信公众号。进入之后点击图文消息。

2.选择想要获取的公众号

3.选择完成之后就不要动了,按下F12,打开浏览器检查功能(我这里用的浏览器是Microsoft Edge)

4.将选择文章部分用滚轮向下滑动,直到出现如下图所示文件(若滑到最底部还没有那就点击下一页,一般就会弹出来了)

5.记录下cookie、fakeid、token三者的值


1.2撰写代码

!!!声明:使用爬虫需遵守相关法律法规,和网站的 robots.txt 文件规定,避免对网站服务器造成过大负担。!!!

import requests
import json
import math
import time
import random
from tqdm import tqdm
import pandas as pd

# 可选的User-Agent列表
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Safari/605.1.15",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Mobile Safari/537.36",
]

# 目标url
url = "https://mp.weixin.qq/cgi-bin/appmsg"
cookie = "这里填你的cookie"

headers = {
    "Cookie": cookie,
}

data = {
    "token": "这里填你的token",
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1",
    "action": "list_ex",
    "begin": "0",
    "count": "5",
    "query": "",
    "fakeid": "这里填你的fakeid",  # 自己的号,设置为空
    "type": "9",
}


def get_total_count():
    headers["User-Agent"] = random.choice(USER_AGENTS)  # 每次请求动态更改 User-Agent
    content_json = requests.get(url, headers=headers, params=data).json()
    count = int(content_json["app_msg_cnt"])
    return count


# 每 20 篇文章休息 5 分钟
def get_content_list(count, per_page=5, pause_after=20, pause_time=200):
    page = int(math.ceil(count / per_page))
    total_fetched = 0

    for i in tqdm(range(page), desc="获取文章列表"):
        data["begin"] = i * per_page
        headers["User-Agent"] = random.choice(USER_AGENTS)  # 每次请求动态更改 User-Agent
        content_json = requests.get(url, headers=headers, params=data).json()
        app_msg_list = content_json["app_msg_list"]
        total_fetched += len(app_msg_list)
        
        # 保存成json
        with open("content_list.json", "w", encoding="utf-8") as f:
            json.dump(app_msg_list, f, ensure_ascii=False, indent=4)

        # 实时将数据保存到 CSV 文件中
        for item in app_msg_list:
            title = item["title"]
            link = item["link"]
            create_time = time.strftime("%Y-%m-%d %H:%M", time.localtime(item["create_time"]))
            result = [[title, link, create_time]]
            df = pd.DataFrame(result, columns=['title', 'link', 'create_time'])
            df.to_csv("data.csv", mode='a', header=False, index=False, encoding='utf-8')  # 追加模式写入

        # 延长请求间隔时间,模拟更自然的行为
        delay = random.uniform(20, 30)  # 延迟10-20秒
        print(f"等待 {delay:.2f} 秒后继续...")
        time.sleep(delay)
        
        # 每爬取 pause_after 篇文章后,暂停 pause_time 秒
        if total_fetched >= pause_after:
            print(f"已爬取 {total_fetched} 篇文章,休息 {pause_time / 60} 分钟...")
            time.sleep(pause_time)  # 暂停 5 分钟(300秒)
            total_fetched = 0  # 重置计数器


if __name__ == "__main__":
    # 创建 CSV 文件并写入标题行
    df = pd.DataFrame(columns=['title', 'link', 'create_time'])
    df.to_csv("data.csv", mode='w', index=False, encoding='utf-8')

    count = get_total_count()
    get_content_list(count)

最后运行效果:

最终代码生成的csv文件,显示公众号发布文章的名称和发布文章的时间(这里是以我自己的公众号为例):


本文标签: 这一 爬虫 篇文章 历史文章 公众