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

# -*- 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. freeRTOS中文实用教程3--中断管理之中断嵌套

    1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_S ...

  2. nodejs 数据库操作,消息的发送和接收,模拟同步

    var deasync = require('deasync'); //导入模板 var mysql=require('mysql'); var Stomp = require('stompjs'); ...

  3. jvm系列五、jvm垃圾回收机制、jvm各种参数及调优

    转载自:http://yufenfei.iteye.com/blog/1746914 尊重原创. 一.GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下, ...

  4. SharePoint 2010管理中心服务器提示“需要升级”

    共3台服务器,只有管理中心所在服务器提示需要升级: 执行命令:stsadm –o localupgradestatus,返回结果类似如下: [2] content database(s) encoun ...

  5. mysql删除数据库文件ibdata1后引发的故障

    进行性能测试是发现大量报错: Duplicate entry主键重复 可以看到mysql数据库中已经没有innodb引擎启动信息了 之前发现ibdata1占用了大量硬盘,为了省出空间删除了数据库ibd ...

  6. node 相关网站

    包管理网站:https://www.npmjs.com/

  7. html----不常见标签

    控制文字滚动 <!-- direction="right up down left" --> <!-- behavior:滚动方式(包括3个值:scroll.sl ...

  8. 关于ie7下display:inline-block;不支持的解决方案。

    摘要: 声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. 今天码的时候遇到这个问题了. 如果本身是内联元素的,把它的display属性设置设置为inline ...

  9. 步步为营-20-XML

    说明:可扩展标记语言 eXtensible Markup Language--区分大小写 涉及到的知识点:DOM 文档对象模型 文本文件存储数据缺点:1,不易读取.2,易乱码 1 通过代码创建一个xm ...

  10. Yann Martell《少年 pi 的奇幻漂流》

    事情并没有像我们预想的那样发生,你能怎么办呢?无论生活以怎样的方式向你走来,你都应该勇敢地面对它,尽可能地享受它!