本篇文章小编给大家分享一下python实现对元素的长截图功能实例,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

一.目标

浏览网页的时候,看见哪个元素,就能截取哪个元素当图片,不管那个元素有多长

二.所用工具和第三方库

python ,PIL,selenium

pycharm

三.代码部分

长截图整体思路:

1.获取元素

2.移动,截图,移动,截图,直到抵达元素的底部

3.把截图按照元素所在位置切割,在所有图片中只保留该元素

4.拼接

如果driver在环境变量中,那么不用指定路径

b=webdriver.Chrome(executable_path=r"C:\Users\Desktop\chromedriver.exe")#指定一下driver

b.get("https://www.w3school.com.cn/html/html_links.asp")

b.maximize_window()#最大化窗口

打开网站

我们可以看见一个ID为maincontent的元素,宽度为850PX,长度为3828PX,这个长度必须使用才能长截图才能完整截下来

el=b.find_element_by_id("maincontent")#找到元素

我们还需要一个重要的参数,就是你电脑一次能截取多高的像素

先用下图代码获取一个图片

#fp为存放图片的地址

b.get_screenshot_as_file(fp)

也就是说用我电脑上截图的默认高度为614像素

所以我设置一个变量:

sc_hight=614

然后设置一下其他变量

count = int(el.size["height"] / sc_hight) # 元素的高度除以你每次截多少就是次数

start_higth = el.location["y"] # 元素的初始高度

max_px = start_higth + (count - 1) * sc_hight # for循环中最大的px

last_px = el.size["height"] + start_higth - sc_hight # 元素最底部的位置

surplus_px = last_px - max_px # 剩余的边的高度

img_path = [] # 用来存放图片地址

注释:

1.count为元素的高度/每次截取的高度,比如这次实例中元素高度为3828PX,我每次截614px,需要6.2次,int之后变成6,也就是截6次,还剩一点,那一点后面再说

2.start_higth为初始高度,这个没有什么可说的

3.max_px为循环结束后,到达的高度

4.last_px为元素最底部的高度

5.surplus_px就是移动6次后,还没有截取的高度

屏幕每次移动,移动sc_hight个像素,初始位置为(0,元素的Y值)

for i in range(0, count):

js = "scrollTo(0,%s)" % (start_higth + i * sc_hight) # 用于移动滑轮,每次移动614px,初始值是元素的初始高度

b.execute_script(js) # 执行js

time.sleep(0.5)

fp = r"C:\Users\wdj\Desktop\%s.png" % i # 图片地址,运行的话,改一下

b.get_screenshot_as_file(fp) # 屏幕截图,这里是截取是完整的网页图片,你可以打断点看一下图片

img = Image.open(fp=fp)

img2 = img.crop((el.location["x"], 0, el.size["width"] + el.location["x"], sc_hight)) # 剪切图片

img2.save(fp) # 保存图片,覆盖完整的网页图片

img_path.append(fp) # 添加图片路径

time.sleep(0.5)

print(js)

else:

js = "scrollTo(0,%s)" % last_px # 滚动到最后一个位置

b.execute_script(js)

fp = r"C:\Users\wdj\Desktop\last.png"

b.get_screenshot_as_file(fp)

img = Image.open(fp=fp)

print((el.location["x"], sc_hight - surplus_px, el.size["width"] + el.location["x"], sc_hight))

img2 = img.crop((el.location["x"], sc_hight - surplus_px, el.size["width"] + el.location["x"], sc_hight))

img2.save(fp)

img_path.append(fp)

print(js)

上面是把该元素的在页面都截完,并且剪切,把图片保存的路径放入img_path

最后一步:把所有截图都贴到新创建的图片中

new_img = Image.new("RGB", (el.size["width"], el.size["height"])) # 创建一个新图片,大小为元素的大小

k = 0

for i in img_path:

tem_img = Image.open(i)

new_img.paste(tem_img, (0, sc_hight * k)) # 把图片贴上去,间隔一个截图的距离

k += 1

else:

new_img.save(r"C:\Users\wdj\Desktop\test.png") # 保存

运行效果图:

说明完整的截取下来了

补充优化:

如果是个小元素怎么办,不用长截图就能截取的那种

因为很简单我就直接贴代码了

start_higth = el.location["y"]

js = "scrollTo(0,%s)" % (start_higth)

b.execute_script(js) # 执行js

time.sleep(0.5)

fp = r"C:\Users\wdj\Desktop\test.png" # 图片地址,运行的话,改一下

b.get_screenshot_as_file(fp)

img = Image.open(fp=fp)

img2 = img.crop((el.location["x"], 0, el.size["width"] + el.location["x"], el.size["height"])) # 剪切图片

img2.save(fp)

效果如下:

完整代码:

from selenium import webdriver

from PIL import Image

import time

def short_sc(el,b):

start_higth = el.location["y"]

js = "scrollTo(0,%s)" % (start_higth)

b.execute_script(js) # 执行js

time.sleep(0.5)

fp = r"C:\Users\wdj\Desktop\test.png" # 图片地址,运行的话,改一下

b.get_screenshot_as_file(fp)

img = Image.open(fp=fp)

img2 = img.crop((el.location["x"], 0, el.size["width"] + el.location["x"], el.size["height"])) # 剪切图片

img2.save(fp)

def long_sc(el,b):

count = int(el.size["height"] / sc_hight) # 元素的高度除以你每次截多少就是次数

start_higth = el.location["y"] # 元素的初始高度

max_px = start_higth + (count - 1) * sc_hight # for循环中最大的px

last_px = el.size["height"] + start_higth - sc_hight # 元素最底部的位置

surplus_px = last_px - max_px # 剩余的边的高度

img_path = [] # 用来存放图片地址

for i in range(0, count):

js = "scrollTo(0,%s)" % (start_higth + i * sc_hight) # 用于移动滑轮,每次移动614px,初始值是元素的初始高度

b.execute_script(js) # 执行js

time.sleep(0.5)

fp = r"C:\Users\wdj\Desktop\%s.png" % i # 图片地址,运行的话,改一下

b.get_screenshot_as_file(fp) # 屏幕截图,这里是截取是完整的网页图片,你可以打断点看一下图片

img = Image.open(fp=fp)

img2 = img.crop((el.location["x"], 0, el.size["width"] + el.location["x"], sc_hight)) # 剪切图片

img2.save(fp) # 保存图片,覆盖完整的网页图片

img_path.append(fp) # 添加图片路径

time.sleep(0.5)

print(js)

else:

js = "scrollTo(0,%s)" % last_px # 滚动到最后一个位置

b.execute_script(js)

fp = r"C:\Users\wdj\Desktop\last.png"

b.get_screenshot_as_file(fp)

img = Image.open(fp=fp)

print((el.location["x"], sc_hight - surplus_px, el.size["width"] + el.location["x"], sc_hight))

img2 = img.crop((el.location["x"], sc_hight - surplus_px, el.size["width"] + el.location["x"], sc_hight))

img2.save(fp)

img_path.append(fp)

print(js)

new_img = Image.new("RGB", (el.size["width"], el.size["height"])) # 创建一个新图片,大小为元素的大小

k = 0

for i in img_path:

tem_img = Image.open(i)

new_img.paste(tem_img, (0, sc_hight * k)) # 把图片贴上去,间隔一个截图的距离

k += 1

else:

new_img.save(r"C:\Users\wdj\Desktop\test.png") # 保存

b=webdriver.Chrome(executable_path=r"C:\Users\wdj\Desktop\chromedriver.exe")#指定一下driver

b.get("https://www.w3school.com.cn/html/html_links.asp")

b.maximize_window()#最大化窗口

# b.get_screenshot_as_file(fp)

sc_hight=614#你屏幕截图默认的大小,可以去截一张,去画图里面看看是多少像素,我这里是614像素

# b.switch_to.frame(b.find_element_by_xpath('//*[@id="intro"]/iframe'))

el=b.find_element_by_id("maincontent")#找到元素

if el.size["height"]>sc_hight:

long_sc(el,b)

else:

short_sc(el,b)

完整代码

有些特殊情况,比如截取的元素在iframe中,直接用driver.switch_to.frame(iframe元素)即可

python如何截长图_python如何实现对元素的长截图功能 python实现对元素的长截图功能实例...相关推荐

  1. python实现图片拼接长图_Python 拼接多张尺寸大小不一样的图片制作长图

    from os import listdir from PIL import Image # 获取当前文件夹下所以图片 ims = [Image.open('../images/%s' % fn) f ...

  2. python画k线图_python画k线图

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! import datetime import pandas_datareader ...

  3. python怎么变成动图_python可以做动图吗

    ImageMagick 是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,P ...

  4. python matplotlib画折线图_python使用matplotlib绘制折线图教程

    matplotlib简介 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序 ...

  5. python numba 转灰度图_Python数据预处理:Dask和Numba并行化加速!

    如果你善于使用Pandas变换数据.创建特征以及清洗数据等,那么你就能够轻松地使用Dask和Numba并行加速你的工作.单纯从速度上比较,Dask完胜Python,而Numba打败Dask,那么Num ...

  6. python画k线图_Python绘制K线图

    不管是对量化分析师还是普通的投资者来说,K线图(蜡烛图)都是一种很经典.很重要的工具.在K线图中,它会绘制每天的最高价.最低价.开盘价和收盘价,这对于我们理解股票的趋势以及每天的多空对比很有帮助. 一 ...

  7. python分析数据走势图_python绘制趋势图的示例

    import matplotlib.pyplot as plt #plt用于显示图片 import matplotlib.image as mping #mping用于读取图片 import date ...

  8. python画k线图_Python+pyqtgraph:跟我学如何绘制股票K线图

    引言 pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView ...

  9. python微信爬取教程_PYTHON爬虫之旅系列教程之【利用Python开发微信公众平台一】...

    感谢大家的等待,好啦,都准备好瓜子.板凳,老司机要发车啦-- 本系列课程讲述"PYTHON爬虫之旅",具体大纲可参考:[PYTHON爬虫之旅]概要目录. 本节课讲述如何利用Pyth ...

  10. python必须用电脑吗_Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”...

    点击上方" 杰哥的IT之旅 ",选择" 星标 "公众号 重磅干货,第一时间送达 晓查 编译整理 量子位 报道 | 公众号 QbitAI Python已经成为全球 ...

最新文章

  1. 用Kotlin打造一个Router
  2. 互联网协议IP抓包分析 -- wireshark
  3. 51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
  4. AJAX 信息查询管理
  5. UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  6. 解决http://localhost:3000/favicon.ico 的404 问题(含案例解析)
  7. Linux文件(目录)命名规则
  8. mysql 5.6.23 免安装_MYSQL 免安装版的环境配置
  9. python编程入门-Python编程:从入门到实践 PDF 中文扫描版
  10. “互联网+”创新创业计划书(二)
  11. Markdown 简历模版, typroa 一键简历生成
  12. 做电脑技术员几年的心得
  13. 重大建设项目土地勘测定界涉及基本农田怎么计算
  14. 2022年最新最全最牛的编程语言排名,让人大开眼界
  15. solidity[4]-pure与view剖析
  16. 《30天自制操作系统》学习笔记--Mac环境搭建
  17. 计算机专业浙大对比中科大,浙大,东南大学,中科大通信专业比较!!!!!!!!...
  18. 深圳神牛python培训_请教神牛_字符串hash
  19. 数据挖掘竞赛预测模型——五折交叉验证
  20. python批量修改文件名

热门文章

  1. kindle不能接收qq邮箱超大附件
  2. POJ-3207-TwoSAT
  3. android 经纬度 谷歌,android:GPS获取location经纬度并用谷歌解析为地理位置名称
  4. 编程语言和脚本语言是什么
  5. android 歌曲的流派信息,音乐流派分类介绍.doc
  6. 使用Syncthing文件同步工具在两台Windows server服务器实现文件同步(实战)
  7. 密码找回逻辑漏洞总结
  8. 全外显子组生信分析流程-4-数据质控
  9. 基因分型分析之全外显子组分析
  10. matlab 色彩的范围,Matlab - 将2个颜色条设置为带有色彩图和良好范围的2个图例...