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

  • 前言
  • 实现功能
  • 原代码-(无法实现功能)
  • 新代码-加入了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

app截图的方式有哪几种 python_selenium

总结

selenium元素截图的常见问题:

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

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