为上次代码添加 模拟人操作 的鼠标的移动轨迹

# -*- coding:utf-8 -*-
# 斌彬电脑
# @Time : 2018/9/14 0014 上午 8:08 from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains # 动作链
from selenium.webdriver.common.by import By
import requests,re
from PIL import Image
from io import BytesIO # 不写入磁盘,显示图片文件
import time from chao_ji_yin import Chaojiying_Client # 超级鹰 class WanYy():
def __init__(self, user, pas):
# 浏览器参数
self.user = user
self.pas = pas
options = Options()
options.add_argument('--window-size=1366,768')
self.dri = webdriver.Chrome(chrome_options=options)
self.wait = WebDriverWait(self.dri, 10) def get_start(self):
# 请求网页
self.dri.get('http://dun.163.com/trial/picture-click')
# 下拉页面
self.dri.execute_script('window.scrollTo(0, 500)') def get_image(self):
# 点击按键,显示验证码
# 获取验证码 图片
self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[2]/div[3]/span[2]'))).click()
# 等待加载完成 截图
# time.sleep(2)
# 验证码位置
im = self.wait.until(EC.visibility_of_element_located((
By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[1]/div/div[1]/img[1]'
))) # 异步 比 time.sleep 好
im1 = BytesIO(self.dri.get_screenshot_as_png())
# Image.open(im).show()
im2 = Image.open(im1)
# 浏览器的左上角坐标 -500 因为下滑了500,
window_im = im2.crop((im.location['x'], im.location['y']-500,im.location['x']+310, im.location['y']+210-500))
# window_im.show()
im_data = BytesIO()
window_im.save(im_data, format('png'))
# 返回图片 二进制 数据
return im_data.getvalue() # 调用超级鹰 识别验证码
def post_validation_participation(self,im_data ):
# 实例化 超级鹰
chao = Chaojiying_Client(self.user, self.pas, '897271')
data = chao.PostPic(im_data, '9103') # 超级鹰反回的 json 数据
data = data.get('pic_str')
data_list = [i.split(',') for i in data.split('|')] # 验证码图片上第个字的坐标
# print(data_list)
return data_list # 得到位置信息,进行点击
def click_word(self, data_list):
# 验证码位置 ,节点
im = self.wait.until(EC.visibility_of_element_located((
By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[1]/div/div[1]/img[1]'
)))
# 根据节点移动鼠标
# 移到第一个字位置
ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[0][0]), int(data_list[0][1])).perform()
# 点击
ActionChains(self.dri).click().perform()
time.sleep(1) # 传入第一个位置 和 第二个字位置
for i in self.track(data_list[0], data_list[1]):
# 移到第二个字位置
ActionChains(self.dri).move_to_element_with_offset(im, int(i[0]), int(i[1])).perform()
# ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[1][0]), int(data_list[1][1])).perform()
# 点击
ActionChains(self.dri).click().perform()
time.sleep(1) # for i in self.track(data_list[1], data_list[2]):
for i in self.track(data_list[1], data_list[2]):
# 移到第三个字位置
ActionChains(self.dri).move_to_element_with_offset(im, int(i[0]), int(i[1])).perform()
# ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[2][0]), int(data_list[2][1])).perform()
# 点击
ActionChains(self.dri).click().perform() # # 鼠标移动轨迹 模拟人操作点击
def track(self, last_p, next_p):
# 接收上个字的位置和下个字的位置
# 鼠标移动轨迹列表
position_list=[]
# 字间的距离分成 20 分
x = (int(next_p[0]) - int(last_p[0])) / 20
y = (int(next_p[1]) - int(last_p[1])) / 20
for i in range(1,21):
# 走 20 步小步
position = [round(x*i) + int(last_p[0]), round(y*i) + int(last_p[1])]
position_list.append(position) return position_list # 像函数一样调用
def __call__(self, *args, **kwargs):
self.get_start()
imdata = self.get_image()
da_list = self.post_validation_participation(imdata)
print(da_list)
self.click_word(da_list)
# time.sleep(5)
# self.dri.close() if __name__ == '__main__':
yedun = WanYy('超级鹰账号', '密码')
yedun()

  

第一个字位置直接给位置,执行点击,

之后 第二,第三个字调用  track 方法

在 track  方法中算出第一个字与第二个字的距离 ,之后分成 20 步执行,到达下个字的位置,进行点击

在此之上的基础上,记录鼠标移动轨迹,存放在图片 a.png 中

# -*- coding:utf-8 -*-
# 斌彬电脑
# @Time : 2018/9/15 0015 上午 10:52 from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains # 动作链
from selenium.webdriver.common.by import By
import requests,re
from PIL import Image
from io import BytesIO # 不写入磁盘,显示图片文件
import time from chao_ji_yin import Chaojiying_Client # 超级鹰 class WanYy():
def __init__(self, user, pas):
# 浏览器参数
self.user = user
self.pas = pas
options = Options()
options.add_argument('--window-size=1366,768')
self.dri = webdriver.Chrome(chrome_options=options)
self.wait = WebDriverWait(self.dri, 10)
self.window_im = None def get_start(self):
# 请求网页
self.dri.get('http://dun.163.com/trial/picture-click')
# 下拉页面
self.dri.execute_script('window.scrollTo(0, 500)') def get_image(self):
# 点击按键,显示验证码
# 获取验证码 图片
self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[2]/div[3]/span[2]'))).click()
# 等待加载完成 截图
# time.sleep(2)
# 验证码位置
im = self.wait.until(EC.visibility_of_element_located((
By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[1]/div/div[1]/img[1]'
))) # 异步 比 time.sleep 好
im1 = BytesIO(self.dri.get_screenshot_as_png())
# Image.open(im1).show()
im2 = Image.open(im1) # 浏览器的左上角坐标 -500 因为下滑了500,
self.window_im = im2.crop((im.location['x'], im.location['y']-500,im.location['x']+310, im.location['y']+210-500))
# window_im.show()
im_data = BytesIO()
self.window_im.save(im_data, format('png'))
# 返回图片 二进制 数据
return im_data.getvalue() # 调用超级鹰 识别验证码
def post_validation_participation(self,im_data ):
# 实例化 超级鹰
chao = Chaojiying_Client(self.user, self.pas, '897271')
data = chao.PostPic(im_data, '9103') # 超级鹰反回的 json 数据
data = data.get('pic_str')
data_list = [i.split(',') for i in data.split('|')] # 验证码图片上第个字的坐标
# print(data_list)
return data_list # 得到位置信息,进行点击
def click_word(self, data_list):
# 验证码位置 ,节点
img = self.window_im.convert('L')
datami = img.load() # 图片数据重构 im = self.wait.until(EC.visibility_of_element_located((
By.XPATH, '/html/body/main/div/div/div[2]/div[2]/div[2]/div/div[2]/div[3]/div/div/div[1]/div/div[1]/img[1]'
)))
# 根据节点移动鼠标
# 移到第一个字位置
ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[0][0]), int(data_list[0][1])).perform()
# 点击
ActionChains(self.dri).click().perform()
time.sleep(1) # 传入第一个位置 和 第二个字位置
for i in self.track(data_list[0], data_list[1]):
# 移到第二个字位置
# print(datami[int(i[0]), int(i[1])])
if datami[int(i[0]), int(i[1])] > 125:
datami[int(i[0]), int(i[1])] = 0
datami[int(i[0])-1, int(i[1])-1] = 0
datami[int(i[0])-2, int(i[1])-2] = 0
datami[int(i[0])+1, int(i[1])+1] = 0
datami[int(i[0])+2, int(i[1])+2] = 0
else:
datami[int(i[0]), int(i[1])] = 255
datami[int(i[0])-1, int(i[1])-1] = 255
datami[int(i[0])-2, int(i[1])-2] = 255
datami[int(i[0])+1, int(i[1])+1] = 255
datami[int(i[0])+2, int(i[1])+2] = 255
ActionChains(self.dri).move_to_element_with_offset(im, int(i[0]), int(i[1])).perform()
# ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[1][0]), int(data_list[1][1])).perform()
# 点击
ActionChains(self.dri).click().perform() time.sleep(1) for i in self.track(data_list[1], data_list[2]):
if datami[int(i[0]), int(i[1])] > 125:
datami[int(i[0]), int(i[1])] = 0
datami[int(i[0])-1, int(i[1])-1] = 0
datami[int(i[0])-2, int(i[1])-2] = 0
datami[int(i[0])+1, int(i[1])+1] = 0
datami[int(i[0])+2, int(i[1])+2] = 0
else:
datami[int(i[0]), int(i[1])] = 255
datami[int(i[0])-1, int(i[1])-1] = 255
datami[int(i[0])-2, int(i[1])-2] = 255
datami[int(i[0])+1, int(i[1])+1] = 255
datami[int(i[0])+2, int(i[1])+2] = 255
# 移到第三个字位置
ActionChains(self.dri).move_to_element_with_offset(im, int(i[0]), int(i[1])).perform()
# ActionChains(self.dri).move_to_element_with_offset(im, int(data_list[2][0]), int(data_list[2][1])).perform()
# 点击
ActionChains(self.dri).click().perform() img.save('a.png') # # 鼠标移动轨迹 模拟人操作点击
def track(self, last_p, next_p):
# 接收上个字的位置和下个字的位置
# 鼠标移动轨迹列表
position_list=[]
# 字间的距离分成 20 分
x = (int(next_p[0]) - int(last_p[0])) / 20
y = (int(next_p[1]) - int(last_p[1])) / 20
for i in range(1,21):
# 走 20 步小步
position = [round(x*i) + int(last_p[0]), round(y*i) + int(last_p[1])]
position_list.append(position) return position_list # 像函数一样调用
def __call__(self, *args, **kwargs):
self.get_start()
imdata = self.get_image()
da_list = self.post_validation_participation(imdata)
print(da_list)
self.click_word(da_list)
# time.sleep(5)
# self.dri.close() if __name__ == '__main__':
yedun = WanYy('账号', '密码')
yedun()

  

潭州课堂25班:Ph201805201 爬虫基础 第十二课 点触验证码二 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 爬虫基础 第十五课 js破解 二 (课堂笔记)

    PyExecJs使用 PyExecJS是Ruby的ExecJS移植到Python的一个执行JS代码的库. 安装 pip install PyExecJS 例子 >>> import ...

  2. 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)

    打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...

  3. 潭州课堂25班:Ph201805201 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)

    用 python 的  selenium  访问  https://www.huxiu.com/ 自动通过验证码 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 20 ...

  4. 潭州课堂25班:Ph201805201 django 项目 第十五课 用户注册功能后台实现 (课堂笔记)

    前台:判断用户输入 ,确认密码,手机号, 一切通过后向后台发送请求, 请求方式:post 在 suers 应用下的视图中: 1,创建个类, 2,创建 GET 方法,宣言页面 3,创建  POST 方法 ...

  5. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

随机推荐

  1. Node 7.6默认支持Async/Await

    Node.js 7.6正式默认支持async/await功能,并能够使低内存设备获得更出色的性能. Node 7.6对async/await的支持来自于将V8(Chromium JavaScript引 ...

  2. WPF当中StaticResource调用方法

    1.先在Converter命名空间当中,定义转换功能类: public sealed class BoolToValueConverter : System.Windows.Data.IValueCo ...

  3. oracle instantclient_11_2 配置文件tnsnames.ora

    文件所在位置(不同版本位置可能不同): oracle\product\10.2.0\client_1\NETWORK\ADMIN\tnsnames.ora WDDB = (DESCRIPTION = ...

  4. nginx异常处理

    1.nginx不转发消息头header问题 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_se ...

  5. Androi:ViewPager

    Android ViewPager控件的使用(基于ViewPager的横向相册)!!!: http://blog.csdn.net/Android_Tutor/article/details/7980 ...

  6. 13-JS中的面向对象

    创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...

  7. 在Mac上安装GTK(go语言GUI)

    1.在终端输入:xcode-select --install 安装command line工具, 如果安装了Xcode, 就直接跳过该步骤 2. 在终端输入:ruby -e "$(curl ...

  8. [java]用md5来判断两个文件是否完全相同

    1. 前言 由于相比较两张图片是否是相同,如果通过像素点比较感觉速度比较慢,当很多图片进行比较时,效率就低很多了.由于每个文件md5基本上是唯一的,所以用获取文件的md5来判断是否相同文件. 2. 代 ...

  9. ocp linux 基础要点

    基本命令: 创建/修改/删除用户    useradd/usermod/userdel 创建/修改/删除用户组    groupadd/groupmod/groupdel    修改所属用户/所属用户 ...

  10. Java中的钩子方法

    钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需 ...