起因
多月没联系的外文专业高中好友忽然联系我,说他部门的公众号文章要备份,问我有没有啥好办法。一听到这个我立马从床上坐了起来。这不禁让我想到了微信公众平台…………
付诸行动
立志要成为CV大师的我,第一件事肯定是在各大社交平台看有没有啥现成的啦,不出意料真被我找到了。普遍思路都是调用官方接口 => 保存为html文件 => 借助Easy CHM查看,大部分并没有以文本的形式保存下来,就算有也是没有文章具体内容的。还发现了没办法,最终还得自己编写符合自己需求的代码,一开始是通过beautifulsoup来将html转化,结果发现它已经out了,后来又发现了专门用来解析xml和html的lxml,结果安装了最新的版本(没办法,编译器是pyhton3.7),网上全是低版本的示例,只能硬着头皮查看官方的文档,好巧不巧正则表达式五个字出现在我的脑海里,二话不说直接删除将html转化的相关代码,直接把接口返回的content进行正则匹配,完美结束!
具体实现
# -*- coding:utf-8 -*-
"""
@Author: 佐达派
@Date: 2022 : 05 : 21
"""
import csv
import requests
import json
import re
def getGZHJson(appid, secret):
csv_writer1 = csv.writer(open('存储文件路径', 'a', encoding='utf-8', newline=""))
# 获取文章
path = " https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
url = path + "&appid=" + appid + "&secret=" + secret
result = requests.get(url)
token = json.loads(result.text)
access_token = token['access_token']
data = {
"type": "news",
"offset": 0,
"count": 1,
}
headers = {
'content-type': "application/json",
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 调用官方接口
url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=' + access_token
result = requests.post(url=url, data=json.dumps(data), headers=headers)
result.encoding = result.apparent_encoding
result = json.loads(result.text)
count = int(result['total_count'])
gzh_dict = {"news_item": []}
csv_writer1.writerow(["标题", "摘要", "内容"])
for i in range(0, count):
data['offset'] = i
result = requests.post(url=url, data=json.dumps(data), headers=headers)
result.encoding = result.apparent_encoding
result = json.loads(result.text)
for item in result['item'][0]['content']['news_item']:
temp_dict = {}
temp_dict['标题'] = item["title"]
temp_dict['摘要'] = item["digest"]
temp_dict['内容'] = item["content"]
realty = re.sub('<.*?>|( )', '', item["content"]).strip()
csv_writer1.writerow([item["title"], item["digest"], realty])
gzh_dict['news_item'].append(temp_dict)
return json.dumps(gzh_dict)
getGZHJson('AppID', 'AppSecret')
结语
一开始以为一个小时就绰绰有余了,可没想到前前后后花了三四个小时。还得是代码写得少,解决bug的思维还有很大的提升空间。有写的不对的,欢迎指出改正。