Python爬取网上文章并发表到微信公众号

article/2025/10/28 8:04:29

前言

话说懒惰是人类进步的原动力,古人诚不欺我。最近在折腾一个微信公众号,开始的时候在网上找一些资源然后进行二次创作然后发表到微信公众号,但是这就要自己先把里面的图片下载下来然后文字也复制过来然后再慢慢的上传到微信公众号,干了几天以后发现这样效率太低了,每天都在干重复的事情,这作为一个程序员是不能忍受的,任何重复的事情都有实现自动化的价值,我们不能浪费生命在这种地方,废话不说,开搞。

一、需求与难点

  1. 从指定页面爬取数据
  2. 只爬取我们需要的内容(什么广告啊,导航那种是不要的)
  3. 然后把正文上传到微信公众号的草稿箱
  4. 微信的草稿箱接口只能放上传到微信里面的图片,所以我们要做一步额外的操作就是先把网页里面的图片提取出来上传到微信公众号里面,然后把正文里面的图片链接替换成微信公众号里面的 图片

二、使用到的工具和接口

  1. 上传封面图片到微信公众号 新增永久图文素材 | 微信开放文档 (qq.com)
  2. 上传正文图片到微信公众号
    ​http请求方式: POST,https协议 https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"
  3. 上传正文到公众号草稿箱 接口请求说明 | 微信开放文档 (qq.com)

  4. python 这边主要使用:requests,BeautifulSoup,json

三、实现步骤

1.分析网页

这个是我们要分析的网页截图:我们可以看出这个网页有自己的导航还有右边的推荐栏还有底部的导航,如果我们直接吧整个网页都扣下来上传到的微信公众号那无疑会给我们后期处理带来很多的工作,所以我们只需要正文也就是html里面的<article></article>里面的内容

2. 调用接口

  1. 我们先来看上传草稿API接口
    接口请求说明
    http 请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN调用示例{"articles": [{"title":TITLE,"author":AUTHOR,"digest":DIGEST,"content":CONTENT,"content_source_url":CONTENT_SOURCE_URL,"thumb_media_id":THUMB_MEDIA_ID,"show_cover_pic":1,"need_open_comment":0,"only_fans_can_comment":0}//若新增的是多图文素材,则此处应还有几段articles结构]
    }
    请求参数说明
    参数是否必须说明
    title标题
    content图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤
    thumb_media_id图文消息的封面图片素材id(必须是永久MediaID)

    可以看出这个接口的参数有3个必须的,那么接下来我们就去网页的代码里面看看怎么拿到这3个参数

  2. 分析网页我们可以得到我们要的title就在class = 'entry-title'的a标签里面,而且我们还可以拿到文章的摘要在class=‘entry-summary’的div里面
  3. 所以我们首先抓取这个页面然后拿到title和摘要
        baseUrl = 'https://www.test.com'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57'}res = requests.get(baseUrl, verify=False, headers=headers)root_soup = BeautifulSoup(res.content, 'html.parser')title = root_soup.select('.entry-title')[0].textsummary = root_soup.select('.entry-summary p')[0].textprint(title)print(summary)
  4. 接下来要准备搞定封面,这下开始用到微信公众号接口,但是在使用公众号接口之前我们要先获取一个token,来使我们有权限访问公众号的API接口,获取token的文档在这里:微信开放文档 (qq.com)
  5. 通过分析正文我们知道这个文章有很多图片,那我们就把第一个图片单做封面,先定义一个上传封面的方法
    def updFm(path, file_name):base_folder = 'D:\\tempDir\\'file_path = '{}{}.jpg'.format(base_folder, file_name)res = requests.get(path, verify=False)with open(file_path, 'wb') as f:f.write(res.content)url = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={}&type={}'.format(access_token, 'image')request_file = {'media': ('{}.jpg'.format(file_name), open(file_path, 'rb'), 'image/jpeg')}vx_res = requests.post(url=url, files=request_file)obj = json.loads(vx_res.content)print(obj)return obj['media_id']
    
  6. 然后获取正文里面所有的图片,把第一个传入到这个方法里面获取封面id
        content_soup = root_soup.select('.entry-content')[0]imgs = content_soup.select('.wp-block-image')fmId = updFm(imgs[0].img['src'], title)
  7. 接下来我们在定义一个上传正文其他图片的方法,因为其他图片需要返回的url不是media_id,所以调的另外一个接口
    def updImg(url):base_folder = 'D:\\tempDir'res = requests.get(url, verify=False)file_name = '{}.jpg'.format(random.randint(10000, 99999))with open(base_folder + file_name, 'wb') as f:f.write(res.content)vx_img_url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'request_file = {'media': (file_name, open(base_folder + file_name, 'rb'), 'image/jpeg')}data = {'access_token': access_token}vx_res = requests.post(url=vx_img_url, files=request_file, data=data)obj = json.loads(vx_res.content)print(obj)return obj['url']
  8.  然后把正文里面的图片全部上传到微信公众号号的素材库并替换到正文里面的图片地址
        for img_content in imgs:img_content.noscript.decompose()current_url = img_content.img['data-original']upd_url = updImg(current_url)img_content.img['src'] = upd_urlimg_content.img['data-original'] = upd_url
  9. 最后我们就可以开始准备上传文章到草稿箱,还是先定义方法,因为草稿接口的标题和摘要有长度限制所以这个方法开始做了一个限制如果长度超过了就截取字符串
    def updCG(title, summary, content, fmId):if len(title) > 64:title = title[:63]if len(summary) > 120:summary = summary[:119]url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token='+access_tokendata = {"articles": [{"title": title,"author": '作者',"digest": summary,"content": content,"show_cover_pic": 1,"need_open_comment": 0,"only_fans_can_comment": 0,"thumb_media_id": fmId}]}vx_res = requests.post(url=url, data=json.dumps(data, ensure_ascii=False).encode("utf-8"))obj = json.loads(vx_res.content)print(obj)return obj['media_id']
  10. 然后再总方法里面调用我们的上传草稿的方法
     print(content_soup.prettify())updCG(title, summary, content_soup.prettify(), fmId)
  11. 查看结果,可以看到文章已经自动提交到草稿箱,接下里我们就可以进去进行二次创作进行发表了


 

总结

这个总共实现下来也就100多行代码半天就能搞定,其实这个主要还是需要你去分析网页,因为每个网站的情况都是不一样的,后面的技术实现都大同小异,我们在生活中也会遇到很多这种需要一直机械重复的事情,这时候我们只要稍微在多费一点脑力就可以后面节省很多时间,我们掌握一些其他人不会的东西,那就做一些不一样的事情吧,技术改变生活不是吗。


http://chatgpt.dhexx.cn/article/afGlGkj4.shtml

相关文章

如何用CSDN发布文章

CSDN怎么写博客&#xff1f; 1、首先打开CSDN官网&#xff0c;进行注册或者登录 2、登录后点击右上角的创作中心 3、进入以后点击左上角的发布 4、可以开始写入你要写的内容&#xff0c;先写入标题 5、然后再写你要写的内容&#xff0c;左侧写内容&#xff0c;右侧可以预览&a…

Hexo博客发表文章、草稿、添加分类和标签

写在前面 本文主要写了hexo的配置&#xff0c;关于博客标题这些配置HEXO已经有了很详细的介绍了&#xff0c;这里不再赘述&#xff0c;本文主要记录一些我个人认为小白比较容易有疑问的地方&#xff0c;也就是博客的主要功能&#xff0c;发表文章、添加文章分类和标签。文章可…

Springboot+Vue实现发表文章功能

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 效果图 前端编辑页面 文章列表页面 文章详情页面 环境介绍 JDK&#xff1a;1.8 数据库&#xff1a;Mysql5.6 前端&#xff1a;Vue 后端&#xff1a;SpringBoot 核心代码介绍 AtricleCtrle.class RestController RequestMa…

使用hexo发布文章

前言: 如何用指令去创建一篇文章,然后发布? .我们先来看一下hexo的目录结构,了解每个目录的作用,这将让我们对hexo的运行原理有一个大概的认识,对于我们后面美化主题是有帮助的, 然后再来创建文章,并发布到本地服务器,最后查看效果. 一、Hexo的目录分析: &#xff11;&#…

微信公众号发布

微信公众号如何发文章 输入微信公众号 打开百度浏览器&#xff0c;搜索栏输入微信公众号&#xff0c;点击百度一下。 打开微信公众平台 页面显示搜索结果&#xff0c;页面选择微信公众平台官方链接点击打开。 扫一扫二维码 进入微信公众平台页面&#xff0c;使用你的微信扫一扫…

软件测试培训:等价类划分法概述

等价类划分法是一种常用的黑盒测试方法&#xff0c;它主张从大量数据中选择一部分数据用于测试&#xff0c;即尽可能使用最少的测试用例覆盖最多的数据&#xff0c;以发现更多的软件缺陷。 一个程序可以有多个输入&#xff0c;等价类划分就是将这些数据按照输入需求进行分类&am…

等价类划分法+边界值法

一、测试用例&#xff08;案例&#xff09; 1.1 定义&#xff1a; ​ 是在测试执行之前&#xff0c;由测试人员编写的指导测试过程的重要文档&#xff0c;主要包括&#xff1a;用例编号、测试目的、测试步骤&#xff08;用例描述&#xff09;&#xff0c;预期结果 1.2 介绍编…

什么是等价类划分法?

1.等价类划分法&#xff1f; 等价类划分是把所有可能输入的数据分为若干个区域&#xff0c;然后从每个区域中取少量有代表性的数据进行测试即可。 等价类 &#xff1a;何为等价类&#xff0c;某个输入域的集合&#xff0c;在这个集合中每个输入条件都是等效的。 2.分类 一般…

等价类划分法实验

一、使用等价类划分法分析三角形问题 要求一&#xff1a;需包含有效等价类及无效等价类划分表格 以及 测试用例表格 要求二&#xff1a;代码实现 实现 方式一&#xff1a;设计 三个输入框 一个判断按钮 点击按钮后显示结果 实现方式二&#xff1a;Java控制台进行测试判断【本实…

解决typora beta版本过期提示

现在beta版的typora打开都会有这个弹窗提示&#xff0c;想要把弹窗提示解决其实很简单&#xff0c;只要按照下面这个办法解决就可以了。 winr打开运行窗口&#xff0c;输入regedit&#xff0c;点确定打开注册表&#xff0c;依次展开计算机\HKEY_CURRENT_USER\SOFTWARE\Typora&…

Beta版本发布说明

2 Beta版本发布说明 2.1 列出这一版本的功能 Beta版本基于Alpha版本&#xff08;实现博主登录、发布博文、设置博客、搜索博文、点击标签显示相应博文、点击分类显示相应博文、留言功能&#xff09;上&#xff0c;主要新增以下几个功能&#xff1a; Message页面的信息推送功能、…

Elasticsearch5.0 beta版本安装错误

转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer 写在前边的话 elasticsearch的alpha版本早已经在github上了&#xff0c;但是beta版本却是最近才正式发布&#…

【AIGC】Photoshop AI Beta版本安装使用(永久免费)

AIGC 大爆发 Adobe近日宣布&#xff0c;Photoshop&#xff08;测试版&#xff09;应用程序发布了生成式AI绘图&#xff0c;这是世界上第一个创意和设计工作流程的副驾驶&#xff0c;为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持&#xff0c;Adobe的…

Beta版本软件使用说明

北京航空航天大学计算机学院 远航1617 小组 产品版本&#xff1a; Beta版本 产品名称&#xff1a;Crawling is going on 文档作者&#xff1a;杨帆 文档日期&#xff1a;2013/12/24 1. 引言 1.1 编写目的 编写本使用说明的目的是充分叙述本软件所能实现的功能及其…

Beta版本测试报告以及Beta版本发布说明

Beta版本测试报告 请根据团队项目中软件的需求文档、功能说明、系统设计和Beta阶段的计划安排&#xff0c;写出软件的测试过程和测试结果&#xff0c;并回答下述问题。 在测试过程中总共发现了多少bug&#xff1f;每个类别的bug分别为多少个&#xff1f;bug的分类&#xff1a; …

Beta版本测试报告

新发现的问题&战略调整&#xff1a; 这里的问题主要包含两种&#xff1a; 优化问题和不影响整体使用的bug&#xff0c;主要针对即时聊天以及UI交互部分&#xff1b;我们安排六位同学两两组队&#xff0c;在一周时间内分别对产品进行覆盖性的体验测试&#xff0c;提出了以…

微软发布 Windows 11 首个 Beta 版本

近日&#xff0c;微软向开发频道发布了 Windows 11 Insider Preview Build 22000.100&#xff0c;在没有发现重大问题之后&#xff0c;微软现在又向更稳定的 Beta 频道发布了同样的版本&#xff0c;这也是 Windows 11 首个 Beta 频道的预览版。微软建议那些想尝试 Windows 11 版…

软件版本号讲解:什么是Alpha, Beta, RC,Release

1. 软件版本阶段说明 Alpha版: 此版本表示该软件在此阶段主要是以实现软件功能为主&#xff0c;通常只在软件开发者内部交流&#xff0c;一般而言&#xff0c;该版本软件的Bug较多&#xff0c;需要继续修改。Beta版: 该版本相对于α版已有了很大的改进&#xff0c;消除了严重的…

WhiteHole Base beta版本正式发布!

体验 当前版本为基础测试版本&#xff0c;测试效果可以前往演示视频查看&#xff1a;https://www.bilibili.com/video/BV18Y411D7sA/?spm_id_from333.999.0.0&vd_source641e71dfd1a118fb834c4a5d156688d5 在线体验地址为&#xff1a; http://47.100.239.95 数据将保存~ …

版本详解:Beta、Dev、Canary、Stable、Chromium等版本

以Edge浏览器为例&#xff0c;各个版本有着不同的区别&#xff0c;或者说各个版本是测试版&#xff1a; 以Edge浏览器来说&#xff1a; Canary(金丝雀)版本浏览器&#xff0c;命名金丝雀&#xff0c;以为着“版本金贵且易碎”&#xff0c;这意味着该版本会融入很多新功能或者说…