写这篇文章主要就是用于以后复习,也希望能给大家提供帮助
首先就是初始化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()