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

# -*- 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. pytorch官网上两个例程

    caffe用起来太笨重了,最近转到pytorch,用起来实在不要太方便,上手也非常快,这里贴一下pytorch官网上的两个小例程,掌握一下它的用法: 例程一:利用nn  这个module构建网络,实现 ...

  2. Linux Makefile 编译速度的优化【转】

    转自:https://blog.csdn.net/QQ1452008/article/details/51851801 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  3. eclipse指定项目编译级别

    指定项目编译级别Eclipse→Preferences→Java→Compiler→Compiler compliance level:1.6或其他 或者,

  4. linux系统下安装redis及配置

    下载Redis redis-3.2.11.tar.gz 解压编译 tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make 编译完成之后,可以看到解压文件red ...

  5. centos7 部署 open-falcon 0.2.1

    =============================================== 2019/4/28_第1次修改                       ccb_warlock 更新 ...

  6. Javascript之BOM与DOM讲解

    一.Javascript组成 JavaScript的实现包括以下3个部分: ECMAScript(核心) 描述了JS的语法和基本对象. 文档对象模型 (DOM) 处理网页内容的方法和接口 浏览器对象模 ...

  7. Idea xml 粘贴文本保持原有格式

    setting->Editor->Code Style->XML 在右边的面板中,单击第二个 “Other” 的页签,勾选“Keep white spaces”,重启idea.

  8. TP5.1:request请求对象(使用四种方式获取)

    准备: 在index/controller下创建一个名为requests.php的文件(注意:不要起名为request,因为它是关键字,不被允许起名) 动态方法和静态方法的区别: 静态方法:publi ...

  9. LeetCode(31): 下一个排列

    Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...

  10. poj3666 线性dp

    要把一个序列变成一个不严格的单调序列,求最小费用 /* 首先可以证明最优解序列中的所有值都能在原序列中找到 以不严格单增序列为例, a序列为原序列,b序列为升序排序后的序列 dp[i][j]表示处理到 ...