发布:2020/9/24 15:40:56作者:管理员 来源:本站 浏览次数:991
selenium的截图功能在chrome下无法实现,但是可以操作滚动条来一屏一屏的截图,然后再合并成一张图,合并图片的代码在网上找的,十分感谢那位朋友,具体解决方案如下:直接上代码:
def capture(base_url, pix_w, pix_h, filename):
"""chrome截屏
base_url- 要截屏的url
pix_w- 窗口宽
pix_h- 窗口高
filename-生成截图的文件名
"""
try:
driver = webdriver.Chrome()
driver.set_window_size(pix_w, pix_h+89)
driver.get(base_url)
time.sleep(2)
img_list = []
i = 0
while i<20:
#滚屏
js="var q=document.body.scrollTop="+ str(i*pix_h)+";"
driver.execute_script(js)
js1 = "return document.body.scrollHeight.toString()+','+document.body.scrollTop.toString()"
js1_result = driver.execute_script(js1)
real_scroll_h, real_top = js1_result.split(',')[0], js1_result.split(',')[1]
#real_scroll_h, real_top 是当前滚动条长度和当前滚动条的top,作为是否继续执行的依据,由于存在滚动条向下拉动后会加载新内容的情况,所以需要以下的判断
#如果这次设置的top成功,则继续滚屏
if real_top == str(i*pix_h):
i += 1
driver.save_screenshot('static/capture/wap/wap-'+filename + str(i)+'.png')
img_list.append('static/capture/wap/wap-'+filename + str(i)+'.png')
last_t = real_top
else:
#如果本次设置失败,看这次的top和上一次记录的top值是否相等,相等则说明没有新加载内容,且已到页面底,跳出循环
if real_top != last_t:
last_t = real_top
else:
driver.save_screenshot(filename + str(i+1)+'.png')
img_list.append(filename + str(i+1)+'.png')
break
image_merge(img_list, "", filename+'.png')
except Exception,e:
print e
def image_merge(images, output_dir, output_name='merge.jpg', restriction_max_width=None, restriction_max_height=None):
"""垂直合并多张图片
images - 要合并的图片路径列表
ouput_dir - 输出路径
output_name - 输出文件名
restriction_max_width - 限制合并后的图片最大宽度,如果超过将等比缩小
restriction_max_height - 限制合并后的图片最大高度,如果超过将等比缩小
"""
def image_resize(img, size=(1500, 1100)):
"""调整图片大小
"""
try:
if img.mode not in ('L', 'RGB'):
img = img.convert('RGB')
img = img.resize(size)
except Exception, e:
pass
return img
max_width = 0
total_height = 0
# 计算合成后图片的宽度(以最宽的为准)和高度
for img_path in images:
if os.path.exists(img_path):
img = Image.open(img_path)
width, height = img.size
if width > max_width:
max_width = width
total_height += height
# 产生一张空白图
new_img = Image.new('RGB', (max_width, total_height), 255)
# 合并
x = y = 0
for img_path in images:
if os.path.exists(img_path):
img = Image.open(img_path)
width, height = img.size
new_img.paste(img, (x, y))
y += height
if restriction_max_width and max_width >= restriction_max_width:
# 如果宽带超过限制
# 等比例缩小
ratio = restriction_max_height / float(max_width)
max_width = restriction_max_width
total_height = int(total_height * ratio)
new_img = image_resize(new_img, size=(max_width, total_height))
if restriction_max_height and total_height >= restriction_max_height:
# 如果高度超过限制
# 等比例缩小
ratio = restriction_max_height / float(total_height)
max_width = int(max_width * ratio)
total_height = restriction_max_height
new_img = image_resize(new_img, size=(max_width, total_height))
if not os.path.exists(output_dir):
os.makedirs(output_dir)
save_path = '%s/%s' % (output_dir, output_name)
new_img.save(save_path)
for img_path in images:
os.remove(img_path)
return save_path
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4