selenium截取图片到的位置和实际不同问题

本文介绍了一种使用Python和Selenium自动识别并破解京东网站滑块验证码的方法,通过图像处理和机器学习技术,实现了对验证码图片的二值化、降噪处理及滑块位置的精确计算。

from PIL import Image,ImageGrab
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from collections import Counter
import time

二值化

def sharp(image):
w, h = image.size
tem = 0
for i in range(w):
for j in range(h):
tem += image.getpixel((i, j))

pixel_ave = tem / w / h
for i in range(w):
    for j in range(h):
        p = image.getpixel((i, j))
        if p > pixel_ave:
            image.putpixel((i, j), 255)
        else:
            image.putpixel((i, j), 0)

return image

#获得图片的像素点集
def getPointList(i, j, Range):
for x in range(i - Range, i + Range + 1):
for y in range(j - Range, j + Range + 1):
if x == i and y == j: continue
yield (x, y)

### Python Selenium 截取整个网页的图片 为了使用 Python Selenium 截取整个网页的截图,可以采用以下方法。由于默认的 `save_screenshot()` 方法仅能截取可视区域的内容,因此需要额外的操作来确保整个页面被完全捕捉。 --- #### 方法一:滚动窗口并拼接图像 通过控制浏览器滚动条的位置,逐步拍摄多个部分的画面并将它们组合成一张完整的图片。 ```python from selenium import webdriver import time def capture_full_page(driver, file_name): # 获取当前窗口的高度 total_height = driver.execute_script("return document.body.scrollHeight") original_size = driver.get_window_size() required_width = driver.execute_script('return document.body.parentNode.scrollWidth') required_height = driver.execute_script('return document.body.parentNode.scrollHeight') driver.set_window_size(required_width, required_height) time.sleep(2) # 等待调整大小后的渲染 driver.save_screenshot(file_name) # 还原原始尺寸 driver.set_window_size(original_size['width'], original_size['height']) # 初始化 WebDriver driver = webdriver.Chrome() try: url_to_capture = "https://example.com" screenshot_output_file = "./full_webpage.png" driver.get(url_to_capture) time.sleep(3) # 等待页面加载完毕 capture_full_page(driver, screenshot_output_file) finally: driver.quit() ``` 上述代码中,`execute_script` 被用来计算文档的整体高度宽度,并临时扩展浏览器窗口以适应这些维度[^1]。 --- #### 方法二:借助第三方库(如 PIL) 当分段截图时,可利用 Pillow 库将各部分拼合起来形成最终的大图。 ```python from selenium import webdriver from PIL import Image import io import time def stitch_images(image_parts): images = map(Image.open, image_parts) widths, heights = zip(*(i.size for i in images)) max_width = max(widths) total_height = sum(heights) new_image = Image.new('RGB', (max_width, total_height)) y_offset = 0 for img_part in image_parts: part_img = Image.open(img_part) new_image.paste(part_img, (0, y_offset)) y_offset += part_img.height return new_image def scroll_and_capture(driver, output_path="./stitched_screenshot.png"): parts = [] last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.save_screenshot(f"part_{len(parts)}.png") parts.append(f"part_{len(parts)}.png") # Scroll down to bottom driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # Allow loading of content after scrolling current_height = driver.execute_script("return document.body.scrollHeight") if current_height == last_height: break last_height = current_height stitched_image = stitch_images(parts) stitched_image.save(output_path) # Initialize WebDriver driver = webdriver.Chrome() try: url_to_capture = "https://example.com" driver.get(url_to_capture) time.sleep(5) # Wait for dynamic elements to load scroll_and_capture(driver) finally: driver.quit() ``` 这里定义了一个辅助函数用于粘贴多张局部截图至单一画布上[^3]。 --- #### 注意事项 - **动态内容等待**:某些网站含有大量异步加载的数据,在调用截图前应适当延时或监听特定事件完成状态。 - **无头模式兼容性测试**:虽然现代版本支持较好,但仍可能存在因缺少图形界面而导致失败的情况[^4]。 - **跨平台差异**:不同操作系统上的字体渲染效果可能略有区别,这会影响实际输出结果的一致性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值