为什么要用Python爬取公众号文章?探索数据获取与信息提取的便捷方法

一、为什么要用python爬取公众文章?

为什么要用Python爬取公众号文章?探索数据获取与信息提取的便捷方法

该问题实际上是关于爬取公众号文章的用途是什么,以及能给我们带来哪些便利。

首先,进行公众文章爬取时需遵守相关法律法规及网站使用规定,还要尊重知识产权和个人隐私。微信公众号是一个内容分发平台,其上面的信息极为丰富。因为微信拥有巨大的用户基数且被广泛应用,所以许多个人、企业、机构都选择在微信公众号上发布信息和内容。但是,有时我们欲查找某特定主题的文章时,却需浏览大量不相关的内容。这一步能够缩短获取信息的过程,甚至可直接提取出所需信息。从更高层面来讲,使用 Python 爬取公众文章有如下几个原因:

公众文章蕴含着丰富的信息,通过爬取这些文章能够获取大量的数据,这些数据可用于分析、研究或其他用途。

编写爬虫程序可以实现自动化。利用爬虫程序能够自动化地获取公众文章。这样做可以避免手动进行复制粘贴的操作。并且还能节省时间和人力成本。

数据分析方面,爬取的公众文章能够用于数据分析工作。比如可以进行文本挖掘,还可以进行情感分析,以及进行关键词提取等操作,通过这些能够从中发现有价值的信息。

数据存储方面,通过爬取公众文章,能够把数据保存至本地或者数据库里,这样便于后续进行数据处理与管理。

监测方面:爬取公众文章可用于舆情监测,从而知晓特定主题的趋势。

1. 环境配置(前期准备)。

Chrome 浏览器。Python 3 具有特定的语法知识。Python 有 Requests 库。存在一个微信公众号,获取链接的方式是爬取程序利用了微信公众号后台编辑素材界面,原理是当插入超链接时,微信会调用专门的 API。

(二)代码分步实现 (1)利用公众号获取API

首先登录微信公众号,接着点击素材管理,之后点击新建图文消息,再点击上方的超链接。

第二步,进行按 F12 这个操作,接着打开 Chrome 的开发者工具,然后选择 Network。

第三步,在之前的超链接界面里,进行点击操作,点击的内容是「选择其他公众号」,接着输入你需要爬取的公众号,比如人民日报。

此时之前的 Network 会刷新出一些链接,这些链接当中以“appmsg”开头的就是我们需要分析的内容。

(2)解析我们所请求的url

找寻到的——请求的URL如下所示:

在微信平台中,通过特定的链接 https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=143406284&lang=zh_CN&f=json&ajax=1 来进行相关操作,该链接可用于获取特定类型的信息,起始位置为 0,数量为 5,且需根据相应的 fakeid 等参数进行请求,语言设置为中文 zh_CN,以 json 格式返回数据并通过 ajax 进行加载。

它分为三个部分

(3)获取模拟登陆公众号所需要配置的信息

我们不断浏览下一页,发现每次只有 begin 会变动,每次增加 5,也就是 count 的值。然后,我们用 Python 来获取同样的资源,但是直接运行如下代码是无法获取到资源的。

import requests
url 为 "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=1957521839&lang=zh_CN&f=json&ajax=1"
requests.get(url).json() 
基础响应中,返回码为 200003,错误信息为“无效会话”。

浏览器能获取资源是因为登录了微信公众号后端。Python 没有登录信息,所以它的请求是无效的。我们需要在 requests 中设置 headers 参数,把 Cookie 和 User-Agent 传入其中,以模拟登陆。

每次头信息内容会变动,所以我把这些内容放在单独的文件“wechat.yaml”里,信息情况如下:

cookie:  ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...

之后只需要读取即可。

# 读取cookie和user_agent
import yaml
打开名为"wechat.yaml"的文件,并以只读模式进行读取操作。
    file_data = file.read()
通过 yaml 的 safe_load 方法来加载 file_data 从而得到 config 。
headers = {
config 中的 "cookie" 对应的值为 "Cookie"
配置中的“user_agent”被用于“User-Agent”。
}
使用 requests 库的 get 方法获取指定的 url ,同时设置 headers 为传入的 headers ,并将 verify 参数设置为 False ,然后将获取到的响应转换为 JSON 格式的数据。

(4)解析返回的jason

在编程领域,“JSON”意味着 JavaScript 对象表示法(JavaScript Object Notation)。JSON 是一种被广泛应用的数据交换格式,通常用于前端与后端之间的数据传输。它凭借简单的键-值对结构来呈现数据,具备易于阅读和解析的特点。JSON 格式常用于日志记录。

在返回的 JSON 里,我们能看到每个文章的相关信息,包括标题、摘要、链接、推送时间和封面地址等。其中,appmsgid 是每一次推送的唯一标识,而 aid 是每篇推文的唯一标识。

实际上,除了 Cookie 之外,URL 中的 token 参数也会被用于限制爬虫。所以,上述代码很有可能输出为{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}} 。并且,要获取所有文章的 json 文件。

接着我们写一个循环,获取所有文章的JSON,并进行保存。

import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
    file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
    "Cookie": config['cookie'],
    "User-Agent": config['user_agent'] 
}
# 请求参数
该 url 为 "https://mp.weixin.qq.com/cgi-bin/appmsg" 。
begin = "0"
params = {
    "action": "list_ex",
    "begin": begin,
    "count": "5",
"fakeid"的值为 config 中的"fakeid"
    "type": "9",
config 中的“token”被赋值给了“token”这个变量。
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1"
}
# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:
    begin = i * 5
    params["begin"] = str(begin)
    # 随机暂停几秒,避免过快的请求导致过快的被查到
让程序暂停一段时间,这个时间是随机生成的整数,范围在 1 到 10 之间。
使用 requests 库发送 GET 请求,请求的 URL 为指定的 url,请求头为 headers,请求参数为 params,并且设置 verify 为 False,将返回的响应存储在 resp 中。
    # 微信流量控制, 退出
如果 resp.json() 中['base_resp']['ret'] 的值等于 200013 。
打印“频率控制,停在”加上将 begin 转换为字符串后的结果,即打印“频率控制,停在”加上 str(begin)的结果
        break
    
    # 如果返回的内容中为空则结束
如果 resp.json() 中['app_msg_list']的长度为 0 。
        print("all ariticle parsed")
        break
        
将 resp.json() 添加到 app_msg_list 中。
    # 翻页
    i += 1

在上述代码里,我把 fakeid 和 token 都保存在了“wechat.yaml”文件当中。之所以这样做,是因为 fakeid 是每个公众号所独有的标识符,并且 token 会时常发生变动。这些信息既能够通过对 URL 进行解析而获取,也可以从开发者工具里进行查看。

在爬取一段时间后,就会遇到如下的问题:

基础响应中,错误信息为“freq control”,返回码为 200013。

此时你在公众号后台尝试插入超链接时就能遇到如下这个提示:

公众号存在流量限制,一般要等 30 到 60 分钟才能继续。要完美处理此问题,或许需要申请多个公众号,可能要与微信公众号的登录系统斗智斗勇,或许还得设置代理池。

只想爬取公众号的信息,需要等待一个小时。之后重新登录公众号,获取到 cookie 和 token,接着就可以运行了。

(6)将结果以JSON格式保存。

# 保存结果为JSON
json_name 等于 "mp_data_{}".format(str(begin)),也就是将 begin 转换为字符串后与 "mp_data_" 拼接起来形成的字符串。
打开名为 json_name 的文件,以写入模式进行操作,将其赋值给变量 file 。
使用 json.dumps 函数将 app_msg_list 进行序列化处理,设置缩进为 2 以美化输出,同时确保输出的字符为非 ASCII 编码,然后将处理后的结果通过 file.write 方法写入文件中。

可以提取文章的标识符、标题、URL 以及发布时间这四列信息,然后将其保存为 CSV 格式。

info_list = []
for msg in app_msg_list:
    if "app_msg_list" in msg:
在 msg["app_msg_list"] 中遍历每个 item 。
info 等于用 format 方法将 str(item["aid"])、item["title"]、item["link"]、str(item["create_time"]) 进行格式化后的结果,具体为 "{}","{}","{}","{}" 这种形式
            info_list.append(info)
# save as csv
打开名为“app_msg_list.csv”的文件并以写入模式进行操作,将其赋值给变量 file 。
使用 file 的 writelines 方法,将 info_list 中的元素用换行符 "\n" 连接起来并写入文件。

(三)全部代码

以下是改写后的句子:代码如下,使用时需谨慎,其使用方法为运行 python wechat_parser.py 以及 wechat.yaml 。

import json
import requests
import time
import random
import os
import yaml
import sys
if len(sys.argv) < 2:
    print("too few arguments")
    sys.exit(1)
yaml_file = sys.argv[1]
if not os.path.exists(yaml_file):
    print("yaml_file is not exists")
    sys.exit(1)
    
with open(yaml_file, "r") as file:
    file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
    "Cookie": config['cookie'],
    "User-Agent": config['user_agent'] 
}
# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
    "action": "list_ex",
    "begin": begin,
    "count": "5",
    "fakeid": config['fakeid'],
    "type": "9",
    "token": config['token'],
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1"
}
# 存放结果
if os.path.exists("mp_data.json"):
    with open("mp_data.json", "r") as file:
        app_msg_list = json.load(file)
else:
    app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = len(app_msg_list) 
while True:
    begin = i * 5
    params["begin"] = str(begin)
    # 随机暂停几秒,避免过快的请求导致过快的被查到
    time.sleep(random.randint(1,10))
    resp = requests.get(url, headers=headers, params = params, verify=False)
    # 微信流量控制, 退出
    if resp.json()['base_resp']['ret'] == 200013:
        print("frequencey control, stop at {}".format(str(begin)))
        break
    
    # 如果返回的内容中为空则结束
    if len(resp.json()['app_msg_list']) == 0:
        print("all ariticle parsed")
        break
        
    app_msg_list.append(resp.json())
    # 翻页
    i += 1
# 保存结果为JSON
json_name = "mp_data.json"
with open(json_name, "w") as file:
    file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

三、插件爬取公众号的文章

使用谷歌插件 webscraper ,可以自行抓取自己感兴趣的公众号 。这种抓取不受时间和地点的限制 ,随时随地都能进行 。并且它的入手非常简单 ,是免费的 。

(一) 实现环境配置

Webscraper 运行在谷歌浏览器之中,因此我们实际需要安装两个软件。

安装步骤:不用写代码的爬虫课-1环境配置_腾讯视频

(二)抓取数据步骤

我未曾尝试过此操作过程。大家可以查看这个资料,即不写代码,也能够抓取任意公众号(简书)。

)探索一下。

他(参)山(考)之(引)石(用)

Python 进行爬虫实战练习,目的是爬取微信公众号的文章,该练习在知乎上有相关内容。

「2」公众号接口的问题与解决_-CSDN博客

Python 可以用来爬取微信公众号的文章和评论。这在 CSDN 博客中有相关介绍。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

32阅读

外国教程python,python编程教学视频

2026年09月02日

26阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

27阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读