Python-网页元素截图-urllib模块中的urlretrieve方法

前言

我在试图爬一个网站的图片的时候,发现selenium中无法实现单个元素的截图(我也不知道是不是自己没有找对方法)。通过网上查找资料,最后放弃了使用selenium自带的截图功能,改用urllib模块中的urlretrieve方法来进行元素截图。速度还挺快的。

实现功能

对网页的元素进行截图。(只截某一个元素,而非网页截图)
下文都以百度的logo为例

原代码-(无法实现功能)

import selenium
from selenium import webdriver

url='https://www.baidu.com/'
b=webdriver.Chrome()
b.get(url)
imgEle = b.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/div[1]/img[1]')
b.save_screenshot('D:/baidu.png') #整个网页截图
#imgEle.screenshot_as_png('D:/baidu1.png') 
#理论上这个可以实现单个元素的截图,但是会报错,我也不知道为什么
b.quit()

新代码-加入了urllib模块中的urlretrieve方法

import selenium
from selenium import webdriver
from urllib.request import *

url='https://www.baidu.com/'
b=webdriver.Chrome()
b.get(url)
imgEle = b.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/div[1]/img[1]')
imgEleurl=imgEle.get_attribute('src')
savepath='D:/baidu1.png'
urlopen(imgEleurl)
urlretrieve(imgEleurl, filename=savepath)
b.quit()

分析

旧代码: 直接截图(但是没有办法进行元素截图)
新代码: 先获取图片元素的URL,然后保存图片元素
这个URL的值等于“右键->在新标签页中打开图片”的图片的网址:
这里百度logo的图片网址是https://www.baidu.com/img/bd_logo1.png
在这里插入图片描述

总结

selenium元素截图的常见问题:

  1. 没有办法截太完整的图片。有时候截到的图不完整。
    根据查到的资料,这个问题搭配着如下两个语句使用或许可以解决,但是我自己没有试过:
b.set_window_size(1200,2000)
b.execute_script("window.scrollBy(0,3000)")
  1. 根据我查到的资料,看到有的人是通过网页全屏截图在裁剪来实现同样的功能,需要配合使用Imgae模块,但我还没有尝试。
    大概的思路是:
    获取网页的整体图片保存到本地->
    获取目标元素的位置->
    获取目标元素的大小->
    根据目标元素的位置与大小,确定需要裁剪的四个边点的位置->
    对本地的元素进行裁剪->
    将裁剪后的图片保存到本地覆盖掉之前的全网页图片

不论是利用urllib保存图片,还是后续再裁剪,都是要配合其他的模块来实现,不知道只用selenium的话能不能实现单个元素的截图,我个人还是倾向于越简单越好,不喜欢用太多的模块或者库。不过感觉自己太菜了,知识也不系统,边学边忘,所以还没能力实现…
我改天研究一下,如果研究到了再更新这篇文章,如果研究不到的话,呃…就不更新了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值