文章目录

  • 一、前言
  • 二、开始
    • (一)获取推送URL链接
    • (二)爬取网页并提取图片保存
      • 1.定义用于爬取推送图片的PictureSpider类
      • 2.定义get_url_text()方法
      • 3.定义search_pictures()方法
      • 4.定义download_pictues()方法
      • 5.定义save_picture()方法
      • 6.开始爬取与结果
      • 7.爬虫部分完整代码
    • (三)将图片批量导入PPT
      • 1.代码
      • 2.结果
  • 三、结语

一、前言

前两天在微信看到董付国老师的公众号“python小屋”发了一篇推送,标题是《学习Python+numpy数组运算和矩阵运算看这254页PPT就够了》。董老师把他课件中的254页PPT图片全部放在了这篇推送中。

我最近正在学习机器学习,并尝试把吴恩达老师《Deep Learning》课程中用Matlab实现的代码用Python重新实现。而想要用Python高效率地实现矩阵运算,就要求我尽快掌握Numpy库的用法,因此我十分想要这份PPT。然而想要获得这份PPT是有要求的:

But,36个赞对我来说有点难,我的微信好友压根就没几个……可我又实在想要这份PPT,怎么办?看来只能尝试写个脚本,把这些图片爬取下来并自动导入PPT了。这里给董老师道个歉,白嫖实属无奈,希望您能原谅~

最后的结果:

二、开始

(一)获取推送URL链接

想要爬取某个网页,自然要先获取它的URL链接。由于直接打开某篇推送微信会自动随机生成一个临时链接,所以这里我依然是用微信公众号后台获取了目标推送的URL。具体方式见我的另一篇文章用python爬取公众号文章。最后得到目标推送的链接:

https://mp.weixin.qq.com/s?__biz=MzI4MzM2MDgyMQ==&mid=2247493780&idx=1&sn=efde5d4ec9a5c04383b709ace1222518&chksm=eb8943cedcfecad84ffb4794d19cce4c7ae3344ffa0c361f646d10689717af33dab5da93332f#rd

(二)爬取网页并提取图片保存

1.定义用于爬取推送图片的PictureSpider类

这次的爬虫,我选择以 面向对象 的方式来实现。

首先定义一个专门用于爬取公众号推送中图片的类,命名为PictureSpider,在初始化时向其传入要爬取的推送的链接start_url,并设置爬虫的headers参数(这里我将CookieUser-Agent都保存在了"wechat.yaml"文件中,初始化时会自动读取):

class PictureSpider(object):def __init__(self,start_url):with open("wechat.yaml", "r") as file:file_data = file.read()self.config = yaml.safe_load(file_data) self.headers = {"Cookie": self.config['cookie'],"User-Agent": self.config['user_agent'] }self.start_url = start_url

2.定义get_url_text()方法

定义get_url_text()方法爬取推送,并返回推送的html内容:

def get_url_text(self):"""返回网页html内容parameter: url->str:网址return:r.text->str:网页内容"""r = requests.get(self.start_url,headers=self.headers)if r.status_code!=200:print("网页加载失败")else:return r.text

3.定义search_pictures()方法

定义search_pictures()方法提取推送中的图片,并返回一个列表,这个列表储存了该推送中所有图片的URL链接:

def search_pictures(self,text):""" 在网页中搜索图片urlparameter:text->str: 网页内容return:picture_url->list: 图片URL列表"""pictures_url = []re_image = re.compile('<img.*?src="(.*?)".*?>',re.S)pictures = re_image.finditer(text)for img in pictures:if img.group(1):pictures_url.append(img.group(1))return pictures_url

4.定义download_pictues()方法

定义download_pictues()方法,对pictures_url列表中的每一个URL进行遍历爬取,即下载图片内容,并调用save_picture()方法将图片保存在指定文件夹中:

def download_pictues(self,pictues_url,save_address):"""下载图片parameter:pictures_url->list: 储存图片url的列表save_address->str: 图片保存地址"""i = 1n = len(pictues_url)for url in pictues_url:r = requests.get(url,headers=self.headers)if r.status_code!=200:print(f"图片爬取失败,第{i}/{n}张")i += 1continueelse:self.save_picture(r,str(i),save_address)print(f"success,{i}/{n}")i += 1if i%5==0:time.sleep(1)

5.定义save_picture()方法

定义save_picture()方法,将图片以二进制形式写入文件保存:

def save_picture(self,r,name,save_address):""" 保存图片parameter:r->requests.Response: 图片url请求返回结果name->str: 图片保存名称save_adress->str: 图片保存地址"""with open(save_address+'\\'+name+'.jpg',"wb") as f:f.write(r.content)

6.开始爬取与结果

最后,实例化一个PictureSpider类,开始爬取:

if __name__ == "__main__":url = "https://mp.weixin.qq.com/s?__biz=MzI4MzM2MDgyMQ==&mid=2247493780&idx=1&sn=efde5d4ec9a5c04383b709ace1222518&chksm=eb8943cedcfecad84ffb4794d19cce4c7ae3344ffa0c361f646d10689717af33dab5da93332f#rd"spider = PictureSpider(url)text = spider.get_url_text()pictures_address = spider.search_pictures(text)spider.download_pictues(pictures_address,"Numpy_PPT")

待爬取结束后,可以看到目标推送中的所有图片都被保存到了“Numpy_PPT”文件夹中,并被按顺序命名:

7.爬虫部分完整代码

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   picture_spider.py
@Time    :   2021/06/06 19:35:55
@Author  :   YuFanWenShu
@Contact :   1365240381@qq.com
'''# here put the import libimport requests
import yaml
import re
import os
import timeclass PictureSpider(object):def __init__(self,start_url):with open("wechat.yaml", "r") as file:file_data = file.read()self.config = yaml.safe_load(file_data) self.headers = {"Cookie": self.config['cookie'],"User-Agent": self.config['user_agent'] }self.start_url = start_urldef get_url_text(self):"""返回网页html内容parameter: url->str:网址return:r.text->str:网页内容"""r = requests.get(self.start_url,headers=self.headers)if r.status_code!=200:print("网页加载失败")else:return r.textdef search_pictures(self,text):""" 在网页中搜索图片urlparameter:text->str: 网页内容return:picture_url->list: 图片URL列表"""pictures_url = []re_image = re.compile('<img.*?src="(.*?)".*?>',re.S)pictures = re_image.finditer(text)for img in pictures:if img.group(1):pictures_url.append(img.group(1))return pictures_urldef download_pictues(self,pictues_url,save_address):"""下载图片parameter:pictures_url->list: 储存图片url的列表save_address->str: 图片保存地址"""i = 1n = len(pictues_url)for url in pictues_url:r = requests.get(url,headers=self.headers)if r.status_code!=200:print(f"图片爬取失败,第{i}/{n}张")i += 1continueelse:self.save_picture(r,str(i),save_address)print(f"success,{i}/{n}")i += 1if i%5==0:time.sleep(1)def save_picture(self,r,name,save_address):""" 保存图片parameter:r->requests.Response: 图片url请求返回结果name->str: 图片保存名称save_adress->str: 图片保存地址"""with open(save_address+'\\'+name+'.jpg',"wb") as f:f.write(r.content)if __name__ == "__main__":url = "https://mp.weixin.qq.com/s?__biz=MzI4MzM2MDgyMQ==&mid=2247493780&idx=1&sn=efde5d4ec9a5c04383b709ace1222518&chksm=eb8943cedcfecad84ffb4794d19cce4c7ae3344ffa0c361f646d10689717af33dab5da93332f#rd"spider = PictureSpider(url)text = spider.get_url_text()pictures_address = spider.search_pictures(text)spider.download_pictues(pictures_address,"Numpy_PPT")

(三)将图片批量导入PPT

1.代码

这部分使用到了“python-pptx”这个库,首先设置储存图片的文件夹路径,输入新建PPT的名字,然后自动将文件夹下的JPG图片按编号顺序写入PPT文件,最后保存:

import os
import pptx
from pptx.util import Inchespath = os.getcwd()
os.chdir(path+'\\Numpy_PPT')
ppt_filename = input('输入目标ppt文件名(无需后缀):')
full_ppt_filename = '{}.{}'.format(ppt_filename,'pptx')
ppt_file = pptx.Presentation()pic_files = [fn for fn in os.listdir() if fn.endswith('.jpg')]# 按图片编号顺序导入
for fn in sorted(pic_files, key=lambda item:int(item[:item.rindex('.')])):slide = ppt_file.slides.add_slide(ppt_file.slide_layouts[1])# 为PPTX文件当前幻灯片中第一个文本框设置文字,本文代码中可忽略slide.shapes.placeholders[0].text = fn[:fn.rindex('.')]# 导入并为当前幻灯片添加图片,起始位置和尺寸可修改slide.shapes.add_picture(fn, Inches(0), Inches(0), Inches(10), Inches(7.5))ppt_file.save(full_ppt_filename)

2.结果

运行脚本后,文件夹中生成了一个PPT文件:

可以看到,所有254张图片都被按顺序导入了进来,效果十分理想。

三、结语

有了上次爬取“北邮家教部”公众号的经验,这次代码写起来十分顺畅,一共花了一个多小时就完成了所有模块,效果也十分理想。啥也不说了,Python,yyds!

另外再次感谢董付国老师~ 董老师写的好几本书我都看完了,并且在去年完成了当时“小屋刷题”系统中的所有练习题。可以说,董老师和北航的嵩天老师就是我的Python引路人。

用python爬取公众号推送图片并保存为PPT相关推荐

  1. python爬取公众号文章如何获取发布时间

    python爬取公众号文章如何获取发布时间 在上一篇爬取公众号的文章中爬虫如何爬取微信公众号文章介绍了如何获取公众号的所有历史文章链接,但当我根据链接去爬取文章的时候,却遇到了一个小问题,就是文章的发 ...

  2. Python爬取公众号保存成Word

    Python爬取公众号 1. 相关工具 2. 实现原理 2.1 HTML解析 3. 编码 3.1 pip装包 3.2 HTML解析 3.3 下载图片 3.4 保存到word中 3. 结束语 1. 相关 ...

  3. 如何用python爬取公众号文章_Python+fiddler:爬取微信公众号的文章

    这几天师父有个小项目,挺有意思,如何使用python爬微信公众号中的新闻信息.大体流程如下.图1:流程 其实我们看到,这里并没有想象中的"智能"--依然需要手动刷公众号文章,然后才 ...

  4. python爬取公众号历史文章

    文章来源 学习网上以及自己修改. 参考链接: https://blog.csdn.net/d1240673769/article/details/75907152 目的 ''' 爬取公众号的历史文章信 ...

  5. python爬取公众号阅读量_公众号没做起来,那是你菜 | 爬取21个公众号数据后

    一直有爬公众号数据的想法,奈何 python 技术不足搁置许久. 最近刚好找到了一款可以爬取公众号数据的工具,一顿操作爬了21个公众号.废话不多说,分析过程 loading -- 第一次更新时间 冯大 ...

  6. 如何用python爬取公众号文章搜狗微信搜索_python如何爬取搜狗微信公众号文章永久链接的思路解析...

    这篇文章主要介绍了python如何爬取搜狗微信公众号文章永久链接的思路解析 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 本文主要讲解思路,代码部分请自行解决搜狗微信 ...

  7. python爬取公众号,用最简单的方式爬虫

    目标公众号:吃鸡搞笑视频 设备:python集成工具--pyCharm 之所以称之为最近单方式,是因为--代码少,效果好 这里只爬了公众号的标题和链接,先上效果 效果图 操作步骤: 1.先自己申请一个 ...

  8. 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  9. Python 爬取公众号文章链接并生成html

    微信不提供公众号分组管理,部分公众号内容优质但更新频率低,我们通过抓取特定公众号更新解决这个问题. 网上介绍的方法较多,参考各位大神的文章后,最后选择了通过公众号管理平台抓取的方法. 大体思路: 通过 ...

最新文章

  1. 别光发Paper,搞点实际问题
  2. 供SAPI中TTS功能用使的Win8.1语言包安装
  3. 表的插入、更新、删除、合并操作_6_通过多表关联插入
  4. 【BZOJ】2655: calc 动态规划+拉格朗日插值
  5. 建库建表设置统一编码
  6. L1-017 到底有多二 (15 分)
  7. 实现四台服务器的负载均衡
  8. 如何修复苹果Mac中的快速视频播放错误
  9. 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)...
  10. .9图片处理报错Error: java.lang.RuntimeException: Crunching Cruncher ic_coupon2.9.png failed, see logs
  11. 基于深度学习的图像修复—心中无码
  12. java for 死循环_一个Java For语句死循环的例子源码
  13. 量子测量 量子计算 量子通讯 概述
  14. 360数科知微实验室发布反诈报告:揭秘黑灰产数据流转真相
  15. android高仿苹果计算器,安卓仿苹果计算器(内附完整源码)要点解析.docx
  16. 等等!python和鸭子是什么关系?
  17. thinkphp5.1生成错误日志文件以及Evn的使用
  18. android模拟器横屏快捷键,Android模拟器横屏切换方法
  19. SpringBoot 导出Word文档(doc\docx) Office无法打开,WPS正常等坑
  20. 岛屿数量JAVA_LeetCode刷题 463. Island Perimeter 岛屿的周长 Java

热门文章

  1. c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇
  2. Android初学之------Android Studio 运行java程序
  3. MOSFET驱动电路
  4. 邮件协议(POP3、IMAP、SMTP)
  5. ECMAScript 2016(ES7) 的新特性总结
  6. ES6,ES7,ES8,ES9,ES10新特性一览
  7. 1521端口已被占用解决方案
  8. R语言使用glmnet包拟合lasso-cox回归模型(生存时间和结果标签)、lasso-cox模型进行特征筛选、plot函数可视化cv.glmnet模型获得的最佳lambda曲线位置及其1个标准差线
  9. 欧几里得算法(扩展欧几里得、欧拉定理、费马小定理)
  10. Linux怎样关闭防火墙?