前言

当要获取页面上的图片,我们常规的做法是:

在图片上点击鼠标右键,
然后选择 图片另存为,
弹出保存窗口,
选择或输入保存的位置,
点击 确定 按钮即可。

那么,如果我们想要使用python在脚本中实现该怎么做呢?
这里提供四种解决思路,
以我女神的美美照为例:

图片url的获取方式我就不说了

方案一

利用urlretrieve()函数链接到 图片url 直接储存图片

urlretrieve是urllib库中的一个函数
urllib库是python的内置包,不需要下载安装
urllib包含了四个模块分别是:
request:基本的http请求模块,用来模拟发送请求。
error:异常处理模块,捕获请求中的异常,然后进行重试或其他的操作以保证程序不会意外终止。
parse:一个根据模块,提供了如拆分、解析、合并等的许多URL处理方法。
robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些不能。

而urlretrieve就在urllib的request模块中。
代码实现:

from urllib.request import urlretrieve# img_url为图片链接,
# file_name为文件储存路径及文件名
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
file_name = '我的女神周冬雨.jpeg'#如果没有传入file_name,则urlretrieve会在Temp文件夹中生成一个临时文件。
urlretrieve(img_url, file_name)

使用这种方法大部分网页图片就都能储存了,但是也存在部分网站会因为反爬而拒绝掉你的访问。

方案二

通过requests直接写入图片
requests底层框架使用的是urllib3,整体在语法上相对简单一些
代码实现:

import requests# img_url为图片链接,
# file_name为文件储存路径及文件名
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
file_name = '我的女神周冬雨.jpeg'res=requests.get(img_url)
with open(file_name ,'wb') as f:f.write(res.content)

因为selenium本身是没有下载图片的模块的,所以以上方法还可以和selenium结合使用。
先通过url_path = driver.find_element_by_xpath(path).get_attribute("src")获取图片地址,再调用上诉方法

方案三

利用selenium截图获取图片
和上面两种方法不同的是,这种方法主要是为了针对反爬(例如由无数小图拼接而成的验证码)而进行的物理手段获取。
代码实现:

from selenium import webdriver
from PIL import Image
from io import BytesIO# img_url为图片链接,
# file_name为文件储存路径及文件名,这里注意图片文件必须以 png 格式保存,
# 如果需要以jpeg的格式保存需逐行写入(类似方案二)
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
filename = '女神周冬雨.png'driver = webdriver.Chrome()
driver.get(img_url)
# 网页中图片的定位(也可用其他方式定位)
img = driver.find_element_by_tag_name('img')
# 获取图片位子和宽高
location = img.location
size = img.size
# 返回左上角和右下角的坐标
top,bottom,left,right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width']
# 截取整张网页图片
screenshot = driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
# 将网页中需要的图片通过坐标裁剪出来
screenshot = screenshot.crop((left, top, right, bottom))
screenshot.save(file_name)
driver.close()

由于是截图,所以舍弃了对图片清晰度的要求,图片会存在一定的失真(验证码图例)

滑块验证码完整项目链接:https://blog.csdn.net/weixin_43715458/article/details/99732804

方案四

这个方法,emmm…就是最原始的物理保存法了,将我们本文开头熟知的操作用脚本模拟实现。

在图片上模拟点击鼠标右键,
然后模拟点击 图片另存为,
在弹出保存窗口中,
模拟选择或输入保存的位置,
模拟点击 确定 按钮即可。
想不到吧?又回到了那个钻木取火的年代!

这个方法需要用到两个非常见库:
pyautogui用于传入键盘指令
pyperclip用于操作剪贴板
这里强调一下,我这里使用的是 win10 系统,由于不同操作系统的快捷键和窗口布局可能不一样,
如果你的计算机是xp、win7、mac、linux或其他操作系统,则需要根据自己的电脑快捷键自行对脚本进行调整。
另外,也有朋友和我反应,他的电脑在执行脚本后,系统不会自动将活动程序切换到selenium浏览器,导致后续的键盘指令没有传递给浏览器,这里有个解决方案是通过模拟alt+tab来切换活动程序。只需要在selenium启动的时候切换一次就可以了

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import pyperclip
import pyautogui
from time import sleep# img_url为图片链接;
# file_name储存用文件名,这里默认储存位置
# 如果需要指定储存位置,需同样用物理方法在弹出的储存窗口中点击选择路径,
# 这里以保存至桌面为例
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
file_name = '我的女神周冬雨.jpeg'
file_path = '桌面'driver = webdriver.Chrome()
driver.get(img_url)
ele=driver.find_element_by_tag_name('img')
# 移动鼠标至图片然后敲击鼠标右键
# 如果你的电脑不会自动将进程切换至selenium浏览器,可以通过以下命令进行切换活动进程
# pyautogui.hotkey('alt', 'tab')
ActionChains(driver).move_to_element(ele).context_click(ele).perform()
# 执行键盘指令时,必须保证此刻的活动任务是selenium的浏览器
# 然后敲击 V 图片另存为(v)的快捷键是V
pyautogui.typewrite('v')
# 单击图片另存之后等1s输入文件名
sleep(1)
# 将文件名传给剪贴板
pyperclip.copy(file_name)
# ctrl + v 粘贴文件名
pyautogui.hotkey('ctrl', 'v')#下面4行代码是设置文件路径,输完文件名后按6下TAB切到路径栏,
pyautogui.typewrite(['tab','tab','tab','tab','tab','tab','enter'])
pyperclip.copy(file_path)
pyautogui.hotkey('ctrl', 'v')
pyautogui.typewrite(['enter'])# alt + s 保存
pyautogui.hotkey('alt', 's')
driver.close()

尾声

周冬雨真可爱呀~
啊!我裂开了

python 实现获取与下载网页中图片的四种方案相关推荐

  1. Unity中图片去色两种方案

    Unity中图片去色两种方案 方案1:新建shader,改变图集的去色 方案2:通过改变NGUI的shader来实现改变sprite的color值去色 https://github.com/dingx ...

  2. C# 网络编程之webBrowser获取网页url和下载网页中图片

    该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试下载网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识.正则表达式实现浏览.获取url.下 ...

  3. 极速系列04—python批量获取word/PDF/网页中的表格

    这里写目录标题 1 python批量获取word中的表格 目的: 1.1 简介 1.2 读取word文档内容 方法一 方法二 2 python批量获取PDF中的表格 目的: 2.1 简介 2.2 读取 ...

  4. python 单例模式的实现方法_python中单例模式的四种实现方式

    配置文件settings.py IP='100.0.0.2' PORT=3302 方式一:绑定给类的方法 class Mysql: __instance = None def __init__(sel ...

  5. 下载网页中的所有资源

    下载网页中的所有资源 看过一篇关于下载网页中图片的文章,它只能下载以http头的图片,我做了些改进,可以下载网页中的所有连接资源,并按照网页中的目录结构建立本地目录,存放资源.  download.a ...

  6. go语言并发下载电影和视频,根据m3u8索引url下载视频.下载网页中的图片,可以从当前页向下搜索层数.

    一,根据URL的m3u8索引,下载视频文件. 二,下载网页中的图片. 为了家里小朋友,要下载一个视频,放在电视上看. 所以利用一点时间,写了这个简单下载程序.如果视频有加密,会对其解密. 最近下点图片 ...

  7. 如何下载网页中的图片

    http://qzher.com/?p=218 如何下载网页中的图片 发表日期 2016年4月25日 by qzher https://tuchong.com/1181287/12974705/ 怎么 ...

  8. php如何获取图片地址,js如何直接获取网页中图片地址

    这次给大家带来js如何直接获取网页中图片地址,js直接获取网页中图片地址的注意事项有哪些,下面就是实战案例,一起来看一下. 第一种方法:js通过正则实现/** * 获取html代码中图片地址 * @p ...

  9. 每天定时打开某个网页_纯技术分享,不借助任何工具下载网页中的视频、音乐等~...

    有好软件就要与大家分享,我是阿喵,阿喵每天会定时推送出安卓手机.苹果手机.电脑相关.学习等优质软件,如果各位觉得软件不错,点击右下角"在看"!必看:点击查看左下角最近公众号改版,文 ...

最新文章

  1. laravel实现数据库读写分离配置或者多读写分离配置
  2. pytorch笔记 torch.clamp(截取上下限)
  3. 综合评价模型的缺点_视频/图像质量评价综述(一)
  4. .NET设计模式(8):适配器模式(Adapter Pattern)
  5. 分类与监督学习,朴素贝叶斯分类算法
  6. 操作系统上机作业--使用系统调用实现mycp
  7. groovy环境搭建,配置报错
  8. LINUX下载编译SDL2
  9. matlab连接散射点,使用小波散射做信号分类
  10. 【深度学习】训练集、测试集和验证集
  11. KOYO 光洋PLC
  12. 汇编1-地址总线、数据总线与控制总线详解
  13. mysql 按照年龄段分组查询
  14. Tomcat启动之后遇到“ran out of the normal time range, it consumed [2000] milliseconds.”?
  15. 数组遍历,forEach(),ever(),some()
  16. 一个比较稳定的PLC通讯模块设计
  17. VC++调用IcmpSendEcho函数实现对远端地址的ping检测(附源码)
  18. learn opencv-使用OpenCV的自动红眼删除
  19. 机器学习考点---过拟合与欠拟合、CNN原理......
  20. java基于微信小程序的公交线路查询系统 uniapp 小程序

热门文章

  1. 第三部分 :简单句的补充(限定词/形容词/介词短语)
  2. 攻防世界 web webshell
  3. Stable Diffusion 图像生成测试
  4. Solr DIH使用说明
  5. C++ sort() 排序函数
  6. 王桂林 C++基础与提高 练习题——格式时钟输出(实时的,精确到秒)
  7. Opencv 基础(四):使用OpenCV进行图像旋转和平移
  8. CentOS常用命令50个含示例
  9. execute与executeUpdate的区别(学习笔记)
  10. Can not issue executeUpdate() for SELECTs