为什么要用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 博客中有相关介绍。