chromedriver入门使用

下载

https://storage.googleapis.com/chrome-for-testing-public/浏览器版本/win64/chromedriver-win64.zip

添加到PATH环境变量当中

确认版本
chromedriver --version

selenium[已废弃]

样例

# _*_ coding : utf-8 _*_
# @Time : 2023-10-06 9:44
# @Author : 光仔December
# @File : 豆瓣登录自动滑动验证
# @Project : Python基础
import random
import re  # 正则表达式匹配库
import time  # 事件库,用于硬性等待
import urllib  # 网络访问
import cv2  # opencv库

from selenium import webdriver  # 导入selenium的webdriver模块
from selenium.webdriver.common.by import By  # 引入By类选择器
from selenium.webdriver.support.wait import WebDriverWait  # 等待类
from selenium.webdriver.support import expected_conditions as EC  # 等待条件类
from selenium.webdriver.common.action_chains import ActionChains  # 动作类


# 封装的计算图片距离的算法
def get_pos(imageSrc):
    # 读取图像文件并返回一个image数组表示的图像对象
    image = cv2.imread(imageSrc)
    # GaussianBlur方法进行图像模糊化/降噪操作。
    # 它基于高斯函数(也称为正态分布)创建一个卷积核(或称为滤波器),该卷积核应用于图像上的每个像素点。
    blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)
    # Canny方法进行图像边缘检测
    # image: 输入的单通道灰度图像。
    # threshold1: 第一个阈值,用于边缘链接。一般设置为较小的值。
    # threshold2: 第二个阈值,用于边缘链接和强边缘的筛选。一般设置为较大的值
    canny = cv2.Canny(blurred, 0, 100)  # 轮廓
    # findContours方法用于检测图像中的轮廓,并返回一个包含所有检测到轮廓的列表。
    # contours(可选): 输出的轮廓列表。每个轮廓都表示为一个点集。
    # hierarchy(可选): 输出的轮廓层次结构信息。它描述了轮廓之间的关系,例如父子关系等。
    contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 遍历检测到的所有轮廓的列表
    for contour in contours:
        # contourArea方法用于计算轮廓的面积
        area = cv2.contourArea(contour)
        # arcLength方法用于计算轮廓的周长或弧长
        length = cv2.arcLength(contour, True)
        # 如果检测区域面积在5025-7225之间,周长在300-380之间,则是目标区域
        if 5025 < area < 7225 and 300 < length < 380:
            # 计算轮廓的边界矩形,得到坐标和宽高
            # x, y: 边界矩形左上角点的坐标。
            # w, h: 边界矩形的宽度和高度。
            x, y, w, h = cv2.boundingRect(contour)
            print("计算出目标区域的坐标及宽高:", x, y, w, h)
            # 在目标区域上画一个红框看看效果
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cv2.imwrite("111.jpg", image)
            return x
    return 0


# 创建Chrome WebDriver对象
driver = webdriver.Chrome()

try:
    # 打开豆瓣登录页
    driver.get("https://accounts.douban.com/passport/login")
    print(driver.title)  # 打印页面的标题
    # (1)获取“密码登录”选项元素,并点击它
    # 使用浏览器的F12开发者工具,使用copy xpath获取该元素的XPATH路径
    passClick = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]')
    passClick.click()
    driver.implicitly_wait(3)  # 使用浏览器隐式等待3秒
    # 获取账号密码组件并赋值
    userInput = driver.find_element(By.ID, "username")
    userInput.send_keys("jackzhucoder@126.com")
    passInput = driver.find_element(By.ID, "password")
    passInput.send_keys("123456")
    # 获取登录按钮并点击登录
    loginButton = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a')
    loginButton.click()
    driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒
    # 此时需要切换到弹出的滑块区域,需要切换frame窗口
    driver.switch_to.frame("tcaptcha_iframe_dy")
    # 等待滑块验证图片加载后,再做后面的操作
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'slideBg')))
    # 获取滑块验证图片下载路径,并下载到本地
    bigImage = driver.find_element(By.ID, "slideBg")
    s = bigImage.get_attribute("style")  # 获取图片的style属性
    # 设置能匹配出图片路径的正则表达式
    p = 'background-image: url\(\"(.*?)\"\);'
    # 进行正则表达式匹配,找出匹配的字符串并截取出来
    bigImageSrc = re.findall(p, s, re.S)[0]  # re.S表示点号匹配任意字符,包括换行符
    print("滑块验证图片下载路径:", bigImageSrc)
    # 下载图片至本地
    urllib.request.urlretrieve(bigImageSrc, 'bigImage.png')
    # 计算缺口图像的x轴位置
    dis = get_pos('bigImage.png')
    # 获取小滑块元素,并移动它到上面的位置
    smallImage = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')
    # 小滑块到目标区域的移动距离(缺口坐标的水平坐标距离小滑块的水平坐标相减的差)
    # 新缺口坐标=原缺口坐标*新画布宽度/原画布宽度
    newDis = int(dis * 340 / 672 - smallImage.location['x'])
    driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒
    # 按下小滑块按钮不动
    ActionChains(driver).click_and_hold(smallImage).perform()
    # 移动小滑块,模拟人的操作,一次次移动一点点
    i = 0
    moved = 0
    while moved < newDis:
        x = random.randint(3, 10)  # 每次移动3到10像素
        moved += x
        ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
        print("第{}次移动后,位置为{}".format(i, smallImage.location['x']))
        i += 1
    # 移动完之后,松开鼠标
    ActionChains(driver).release().perform()
    # 整体等待5秒看结果
    time.sleep(5)

finally:
    # 关闭浏览器
    driver.quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenxuezhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值