Pyhton抓取公众号文章并以.CSV保存

227 阅读2分钟

起因

多月没联系的外文专业高中好友忽然联系我,说他部门的公众号文章要备份,问我有没有啥好办法。一听到这个我立马从床上坐了起来。这不禁让我想到了微信公众平台…………

付诸行动

立志要成为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('<.*?>|(&nbsp;)', '', 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的思维还有很大的提升空间。有写的不对的,欢迎指出改正。