Python之微信公众号自动化运营实践

初步想法:
1.抓取每日最新资讯,得到一个初步的文章列表及内容
2.利用AI工具重写去重,得到优化后的文章内容
3.通过自动化方法推送至公众号后台
4.审核修改后发送
重点在前3步,希望通过前3步减少前期内容准备工作,最后仅需确认即可发布。当然上面的方法仅适用于资讯类公众号,其他类型比如内容为王的公众号可能参考意义有限。

下面就开始吧!

首先第一步:抓取每日最新资讯

一、确定目标网站及爬虫规则

1.确定抓取的内容来源

1.1 主题是什么?
抓取的内容要与公众号主题切合
1.2 关键词是什么?
关键词是技术相关,比如:前端、后端、AI、互联网行业动态等。
1.3 网站是什么?
抓取的网站合法是前提!
爬取网站内容需要遵守相关法律和规定,并尊重网站的隐私政策和服务条款。在进行爬取之前,建议先查看网站的 robots.txt 文件,以了解网站是否允许爬取,并遵守网站的爬取规则

2.确定爬虫规则

示例一:IT之家:https://www.ithome.com/
(1)首先我们打开网站,打开控制台,刷新一下网页,可以看到网站采用的是服务端渲染(SSR:Server-Side Rendering)的方式

(2)接着我们查看一下网站的robots.txt文件,以了解网站是否允许爬取以及网站的爬取规则
在浏览器中输入 "https://www.ithome.com/robots.txt" 并访问该 URL

可以看到 /ithome、/keywords/、/search/、/comment/、/*?*(不允许爬虫访问带有问号(?)的URL)、/?*(不允许爬虫访问根路径下带有问号(?)的URL)、/html/zixun这些路径禁止爬取

(3)点击网页发现/list路径不在robots.txt禁止路径内,符合爬虫规则。最终确定爬取的路径:​​​​​​https://www.ithome.com/list/和要爬取的内容:滚动新闻部分


 二、爬取数据

技术栈:python 

1.爬取文章类型及标题

python简单入门,可以参考下这篇博文:https://blog.csdn.net/bookssea/article/details/107309591

参照上面博文,稍微修改下代码,我们可以得到滚动新闻区域的 新闻类型、文章标题和时间excel表格。

 代码如下:

# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  # 网页解析,获取数据
import re  # 正则表达式,进行文字匹配`
import urllib.request, urllib.error  # 制定URL,获取网页数据
import xlwt  # 进行excel操作

findType = re.compile(r'\[(.*?)\]')
findTitle = re.compile(r'<a class="t".*target="_blank">(.*?)</a>', re.S)
findTime = re.compile(r'<i>(.*?)</i>')

def main():
    baseurl = "https://www.ithome.com/list/"  #要爬取的网页链接
    # 1.爬取网页
    datalist = getData(baseurl)
    savepath = "IT之家滚动新闻.xls"    #当前目录新建XLS,存储进去
    # 3.保存数据
    saveData(datalist,savepath)      


# 爬取网页
def getData(baseurl):
    datalist = []  #用来存储爬取的网页信息
    for i in range(0, 1):  # 调用获取页面信息的函数,1次
        html = askURL(baseurl)  # 保存获取到的网页源码
        # 2.逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
        datel_ul = soup.find("ul", class_="datel")
        for item in datel_ul.find_all("li"):  # 查找符合要求的字符串
            data = []  # 保存所有信息
            item = str(item)
            type = re.findall(findType, item)[0]  # 通过正则表达式查找
            data.append(type)
            title = re.findall(findTitle, item)[0]
            data.append(title)
            time = re.findall(findTime, item)[0]
            data.append(time)
            datalist.append(data)

    return datalist


# 得到指定一个URL的网页内容
def askURL(url):
    head = {  # 模拟浏览器头部信息,向服务器发送消息
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }
    # 用户代理,表示告诉服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)

    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html

# 保存数据到表格
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
    sheet = book.add_sheet('IT之家滚动新闻', cell_overwrite_ok=True) #创建工作表
    col = ("类型","文章标题","时间")
    for i in range(0,3):
        sheet.write(0,i,col[i])  #列名
    for i in range(0,50):
        data = datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])  #数据
    book.save(savepath) #保存

if __name__ == "__main__":  # 当程序执行时
    # 调用函数
     main()

 目前只拿到了文章标题,这显然是不行的,我们还需要文章内容,并且单页数据有50条,并不是所有类型的文章都是我们所需要的,需要筛选出合适的文章。

2.获取文章详情

点击文章标题会跳转一个新的页面,新页面里包含了文章的内容详情,我们需要模拟用户的点击操作来获取文章详情,这里用selenium来模拟用户操作。

from selenium import webdriver
driver = webdriver.Edge()

# 获取详情数据
def getDetail(baseurl):
    detailList = []  
    driver.get(baseurl)
    for i in range(0,3):
        element = driver.find_element(By.XPATH,f"//li[{i+1}]/a[@class='t']")
        element.click()
        # 获取打开的多个窗口句柄
        windows = driver.window_handles
        # 切换到当前最新打开的窗口
        driver.switch_to.window(windows[-1])
        selenium_page = driver.page_source
        detailSoup = BeautifulSoup(selenium_page, 'html.parser')
        content = detailSoup.find("div", class_="post_content")
        detailList.append(content.get_text())
        driver.close()
        driver.switch_to.window(windows[0])
    driver.quit()
    return detailList

拿到详情数据后可以将数据写入excel表格中,这样我们就得到了所有想要的数据。表格内容如下:

3.筛选符合要求的数据

文章有很多类型(【游戏之家】、【IT资讯】、【智车之家】......),并不是所有类型的文章都是我们感兴趣的,这里我们只取类型是IT资讯、软件之家、科学探索、VR之家......的数据。

在获取类型时加一个筛选逻辑,修改类型的匹配规则,并且不符合类型的数据不加入数组中。

findType = re.compile(r'\[(IT资讯|软件之家|科学探索|VR之家|智能时代)\]')

def getData(baseurl):
    datalist = []  #用来存储爬取的网页信息
    for i in range(0, 1):  # 调用获取页面信息的函数,1次
        html = askURL(baseurl)  # 保存获取到的网页源码
        # 2.逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
        datel_ul = soup.find("ul", class_="datel")
        for item in datel_ul.find_all("li"):  # 查找符合要求的字符串
            data = []  # 保存所有信息
            item = str(item)
            type_result = re.findall(findType, item)  # 通过正则表达式查找
            if not type_result:
                continue  # 如果 type_result 为空,则跳过当前迭代,进入下一次循环
            type = type_result[0]
            data.append(type)
            title = re.findall(findTitle, item)[0]
            data.append(title)
            time = re.findall(findTime, item)[0]
            data.append(time)
            href = re.findall(findHref, item)[0]
            data.append(href)
            datalist.append(data)
    return datalist

 同时在获取内容详情是也需要对应修改,只获取符合要求类型的内容详情。

// 将element的获取方式改为匹配详情链接
element = driver.find_element(By.XPATH,f'//a[@href="{datalist[i][3]}"]')

这样,我们就拿到符合要求的数据啦!


三、推送至公众号后台

1.获取access_token

调用上传至素材库接口前需先获取通用access_token,appid和secret可从微信公众号后台【设置与开发】-【基本配置】处获取,记得一定要把调用接口的IP地址加入白名单,并且等待10min后再本地调试,否则会报错40164拿不到access_token,代码如下:

import json
from urllib import parse, request
import time


## 此函数用于获取access_token,微信公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

# // 获取token
def get_wxCode_token():
    try:
        appid = ""
        secret = ""
        textmod = {"grant_type": "client_credential",
            "appid": appid,
            "secret": secret
        }
        textmod = parse.urlencode(textmod)
        header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}
        url = 'https://api.weixin.qq.com/cgi-bin/token'
        req = request.Request(url='%s%s%s' % (url, '?', textmod), headers=header_dict)
        res = request.urlopen(req)
        res = res.read().decode(encoding='utf-8')
        res = json.loads(res)
        access_token = res["access_token"]
        print('access_token:',(access_token,time.time()))
        return (access_token,time.time())
    except Exception as e:
        print(e)
        return False


if __name__ == '__main__':
    # 获取access_token,公众号后台需  添加 你的ip地址 为白名单
    get_wxCode_token()

2.上传至草稿箱 

使用新建草稿接口,微信开发者文档:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html

由于thumb_media_id(图文消息的封面图片素材id)是新建草稿接口的必传项,我们需要先得到一个thumb_media_id,这里使用新增其他类型永久素材接口:

接口调试工具调用接口新增一个图片素材 ,返回值可以拿到我们需要的media_id

最后,调用新建草稿接口,就可以把我们拿到的数据推送到推送到公众号后台了 。

def add_draft(access_token, title, content):
    url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token={}'.format(access_token)
    data = {
    "articles": [
        {
            "title": title,
            "content": content,
            "thumb_media_id": ''
        }
    ]}
    headers = {'Content-Type': 'application/json'}
    requests.post(url, data=json.dumps(data, ensure_ascii=False).encode('utf-8'), headers=headers)

大功告成! 


总结 

  1. 确定目标网站和公众号:确定你要爬取信息的目标网站和微信公众号。确保目标网站允许爬取并遵守相关的爬虫规则。

  2. 选择合适的编程语言爬虫框架:选择一种适合你的编程语言,如Python,并选择一个方便的爬虫框架,如Scrapy或BeautifulSoup。

  3. 编写爬虫代码:使用选定的编程语言和爬虫框架编写代码。首先,通过发送HTTP请求获取目标网页的HTML内容。然后,使用HTML解析技术从HTML内容中提取出你感兴趣的信息,如标题、发布日期、链接等。

  4. 设计数据存储方案:确定如何存储爬取的信息。你可以选择将数据保存到本地文件、数据库或云存储等。

  5. 设置定时任务:使用定时任务工具,如crontab(Linux)或Windows任务计划程序(Windows),设置每天自动运行爬虫程序的时间。

  6. 处理反爬机制:一些网站可能会采取反爬机制,如验证码、IP封锁等。你可以使用代理IP池、设置请求头信息、延时请求等方法来绕过反爬机制。

  7. 监控和错误处理:设置适当的日志记录和错误处理机制,以便在爬虫运行过程中及时发现和处理错误,确保爬虫的稳定性和可靠性。

请注意,在实施爬虫之前,你应该确保你遵守相关的法律法规和网站的爬虫规定,以确保合法使用爬虫技术。此外,尊重网站的隐私政策和数据使用规定,避免过度爬取或滥用爬取到的信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值