用selenium验证唯品会登录

写这篇文章主要就是用于以后复习,也希望能给大家提供帮助

首先就是初始化selenium

        self.driver = webdriver.Chrome()
        self.driver.get('https://passport.vip.com/login?src=%2F%2Fcart.vip.com%2Fte2%2F')
        self.driver.maximize_window()  # 窗口最大化
        time.sleep(0.3)
        self.driver.find_element_by_xpath('//div[@class="c-tab-nav "]/div[2]').click()  # 点账号密码登录
        self.driver.find_element_by_xpath('//div[@id="J_login_form"]/div[2]/div/input').send_keys('12345')  # 输入账号
        self.driver.find_element_by_xpath('//div[@id="J_login_form"]/div[3]/div/input').send_keys('12345')  # 输入密码
        self.driver.find_element_by_xpath('//div[@for="J_login_agree"]/label').click()  # 点击我同意服务条款
        self.driver.find_element_by_class_name('c-form-item-submit').click()    # 点击能录
        time.sleep(0.5)
        img = self.driver.find_element_by_class_name('vipsc_qimg_inner')  # 验证码图片的元素
        ActionChains(self.driver).move_to_element(img).perform()  # 鼠标悬停至验证码处
        time.sleep(0.1)

在这之后就要进行一个截屏,截屏之后再利用元素的坐标来对图片进行一个处理,裁剪出一个完整的验证码图片,不过爱奇艺这个验证码需要将鼠标悬停至验证码上才会显示出点击区域

        img = self.driver.find_element_by_class_name('vipsc_qimg_inner')  # 验证码图片的元素
        ActionChains(self.driver).move_to_element(img).perform()  # 鼠标悬停至验证码处
        time.sleep(0.1)
        self.driver.get_screenshot_as_file('./img/prt.png')  # 截屏并将图片保存到img文佳佳下

在这之后就需要获取到验证码点击图片的坐标位置,并进行一些处理,之后对图片进行裁剪

        div_img = self.driver.find_element_by_class_name('vipsc_pop_inner')  # 定位验证码图片
        location = div_img.location  # 获取图片的坐标位置
        size = div_img.size  # 获取图片的x轴和y轴长度
        x, y = int(location['x']), int(location['y'])  # 将图片长度变成int
        x2, y2 = x + size['width'], y + size['height']  # 将图片的x,y坐标和图片的x,y轴长度相加
        y2 += 40  # 由于下面还有一张图片,y在这基础之上还要再加40

之后用PIL的Image模块对图片进行处理

        prt = Image.open('prt.png')  # 打开截图图片
        img = prt.crop((x, y, x2, y2))  # 对图片进行裁剪
        img.save('./img/img2.png')  # 保存裁剪的图片

获取坐标之后就要对用图片进行处理,我这边用的超级鹰,由于需要传递字典信息还需要在这里调用鼠标行为链的方法

        chaojiying = Chaojiying_Client(None, None, None)  # 用户中心>>软件ID 生成一个替换 96001
        im = open('img/img2.png', 'rb').read() 
        data2 = chaojiying.PostPic(im, 9103)['pic_str'].split('|')  # 对获取的要点击的字的坐标进行分割
        data_dist = {i.split(',')[0]: i.split(',')[1] for i in data2}  # 将坐标格式变成字典
        self.click(data_dist, data)

最后的鼠标行为链就是对传入的字典进行遍历后依次对字进行点击

        for x, y in dist.items():
            action = ActionChains(self.driver)
            action.move_to_element_with_offset(data, int(x), int(y)).click().perform()
        self.driver.find_element_by_class_name('u-form-submit').click()

下面是完整代码

from PIL import Image
from selenium import webdriver
import time
from chaojiying import Chaojiying_Client
from selenium.webdriver import ActionChains


class Wph(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://passport.vip.com/login?src=%2F%2Fcart.vip.com%2Fte2%2F')
        self.driver.maximize_window()  # 窗口最大化
        time.sleep(0.3)
        self.driver.find_element_by_xpath('//div[@class="c-tab-nav "]/div[2]').click()  # 点账号密码登录
        self.driver.find_element_by_xpath('//div[@id="J_login_form"]/div[2]/div/input').send_keys('12345')  # 输入账号
        self.driver.find_element_by_xpath('//div[@id="J_login_form"]/div[3]/div/input').send_keys('12345')  # 输入密码
        self.driver.find_element_by_xpath('//div[@for="J_login_agree"]/label').click()  # 点击我同意服务条款
        self.driver.find_element_by_class_name('c-form-item-submit').click()  # 点击能录
        time.sleep(0.5)

    def pict_get(self):
        img = self.driver.find_element_by_class_name('vipsc_qimg_inner')  # 验证码图片的元素
        ActionChains(self.driver).move_to_element(img).perform()  # 鼠标悬停至验证码处
        time.sleep(0.1)
        self.driver.get_screenshot_as_file('./img/prt.png')  # 截屏并将图片保存到img文佳佳下
        div_img = self.driver.find_element_by_class_name('vipsc_pop_inner')  # 定位验证码图片
        location = div_img.location  # 获取图片的坐标位置
        size = div_img.size  # 获取图片的x轴和y轴长度
        x, y = int(location['x']), int(location['y'])  # 将图片长度变成int
        x2, y2 = x + size['width'], y + size['height']  # 将图片的x,y坐标和图片的x,y轴长度相加
        y2 += 40  # 由于下面还有一张图片,y在这基础之上还要再加40
        prt = Image.open('prt.png')  # 打开截图图片
        img = prt.crop((x, y, x2, y2))  # 对图片进行裁剪
        img.save('./img/img2.png')  # 保存裁剪的图片
        return div_img

    def coord_get(self, data):
        chaojiying = Chaojiying_Client(None, None, None)  # 用户中心>>软件ID 生成一个替换 96001
        im = open('img/img2.png', 'rb').read()
        data2 = chaojiying.PostPic(im, 9103)['pic_str'].split('|')  # 对获取的要点击的字的坐标进行分割
        data_dist = {i.split(',')[0]: i.split(',')[1] for i in data2}  # 将坐标格式变成字典
        self.click(data_dist, data)

    def click(self, dist, data):
        for x, y in dist.items():
            action = ActionChains(self.driver)
            action.move_to_element_with_offset(data, int(x), int(y)).click().perform()
        self.driver.find_element_by_class_name('u-form-submit').click()

    def main(self):
        data = self.pict_get()
        self.coord_get(data)


if __name__ == '__main__':
    w = Wph()
    w.main()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值