python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...
对WebElement截图
WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。
WebDriver.PhantomJS自带的方法支持对整个网页截屏。
下面提供几种思路。
方式一
针对WebDriver.Chrome
通过WebDriver的js脚本注入功能,曲线救国。
1. 注入第三方html转canvas的js库(见下方推荐)
2. 获取元素html源码
3. 将html转换为canvas
4. 下载canvas
优点: 截取长图容易实现
缺点: 加载第三方库耗费时间,转换原理请参考这篇文章:
将 DOM 对象绘制到 canvas 中
方式二
针对WebDriver.Chrome
截取全图,自行裁剪、拼接
1. 获取元素位置、大小
2. 获取窗口大小
3. 截取包含元素的窗口
4. 进行相应的裁剪和拼接。
具体算法思路很清晰,但需要注意的细节较多。这里就不在赘述。示例代码请移步:
[Github]PythonSpiderLibs
优点: 不需太多js工作,python+少量js代码即可完成
缺点: 拼接等工作会被WebDriver的实现差异、图片加载速度等因素影响,需多加注意。 在保证截图质量的情况下,速度较慢
方式三
针对WebDriver.PhantomJS
由于接口实现的差异,PhantomJS相比于Chrome,可以截取到整个网页。所以获取指定元素的截图也就简单很多
截取网页全图
裁剪指定元素
driver = webdriver.Chrome()
driver.get('http://stackoverflow.com/')
driver.save_screenshot('screenshot.png')
left = element.location['x']
top = element.location['y']
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
im = Image.open('screenshot.png')
im = im.crop((left, top, right, bottom))
im.save('screenshot.png')
1
2
3
4
5
6
7
8
9
10
11
12
13
driver=webdriver.Chrome()
driver.get('http://stackoverflow.com/')
driver.save_screenshot('screenshot.png')
left=element.location['x']
top=element.location['y']
right=element.location['x']+element.size['width']
bottom=element.location['y']+element.size['height']
im=Image.open('screenshot.png')
im=im.crop((left,top,right,bottom))
im.save('screenshot.png')
优点: 实现简单
缺点: 对于高度太高的页面会导致文件过大,处理会有问题,我测试的最大图片尺寸是12.8M。
解决图片加载不完整的问题
我们先在首页上执行一段 JavaScript 脚本,将页面的滚动条拖到最下方,然后再拖回顶部,最后才截图。这样可以解决像上面那种按需加载图片的情况。
from
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
fromimportwebdriver
importtime
deftake_screenshot(url,save_fn="capture.png"):
browser=webdriver.Firefox()# Get local session of firefox
browser.set_window_size(1200,900)
browser.get(url)# Load page
browser.execute_script("""
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100);
} else {
window.scroll(0, 0);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
foriinxrange(30):
if"scroll-done"inbrowser.title:
break
time.sleep(10)
browser.save_screenshot(save_fn)
browser.close()
if__name__=="__main__":
take_screenshot("http://codingpy.com")
不同wewbdriver对某些方法的实现不同
Chrome和PhantomJS 的接口差异
抓知乎时的坑,
1. Chrome用WebElement.text可以正常得到值,用PhantomJS只能用 WebElement.get_attribute('innerHTML')
2. WebDriver.Chrome截图只能截当前屏幕区域。WebDriver.PhantomJS截图可以获取整个页面的长图。
其它还有一些坑等待发现
python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...相关推荐
- python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- python绘制简单城市剪影图_利用Python的folium包绘制城市道路图的实现示例
写在前面 很长一段时间内,我都在研究在线地图的开发者文档,百度地图和高德地图的开发者中心提供了丰富的在线地图服务,虽然有一定的权限限制,但不得不说,还是给我的科研工作提供了特别方便的工具,在博客前面我 ...
- python识图找图_利用python进行识别相似图片(二)
前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...
- python批量生成图_利用Python批量生成任意尺寸的图片
实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...
- python制作流动图_利用Python生成GIF动图
一.PIL库 1.PIL库的概括: PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库 ...
- python画互动图_利用Python画出运动图像
题目要求: 首先这里我们需要下载三个库:numpy,scipy,matplotlib 接着看题目,我的思路是依次求出X轴和Y轴的坐标连线并转换成曲线.:mgh=1/2mv2(势能全部转换成动能),另一 ...
- 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...
数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...
- python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码
利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...
- python制作心形照片墙_利用python生成照片墙的示例代码
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...
最新文章
- cad怎么卸载干净_百度软件中心助手怎么样干净卸载
- 基于SSM实现绿色有机产品直营网
- 【技术贴】解决 myeclipse打不开报错an error has occurred, see .
- 【Python】可视化配色方案自由啦 (Python版)
- Shell case esac语句
- 服务器被一堆系统登录_WIN10做天高服务器客户端登录出现“操作系统原因无法登录”...
- H5添加禁止缩放功能
- rpm包安装mysql数据库
- 探索MicroPython(三)--基础操作示例
- 百度地图2021十一大数据:全国高速拥堵里程超7000公里
- 拳王公社:网络引流的“4大核心秘诀“,让客户源源不断地加你
- mysql57包解压安装_mysql5.7解压包安装教程
- 指针变量本质(四十三)
- 别再透支你的社交信用了
- extjs tree下拉列表_Extjs中ComboBoxTree实现的下拉框树效果(自写)_extjs
- 计算机里面为什么只剩c盘,电脑只剩下C盘了,怎么处理
- YoungTalk-STM32入门100步-总篇
- 用户研究中的定性研究、定量研究
- 吴军《态度》读书笔记
- Linux安装Vmware Workstation