geetest拼图破解:

1、考虑到每个网站的拼图数量很少,可以先把他们下下来,后面在通过RGB来判断差异,来找出需要移动到的位置

2、通过python + selenium来控制页面的操控页面的元素,是的拼图可以被移动

3、这里先直接贴上一段代码:

鸣谢:https://blog.csdn.net/qq_38685503/article/details/81187105

 from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time, random, os
from PIL import Image base_url = "http://www.gsxt.gov.cn"
img_paths = "E:/DateSet/geetest/gsxt"
img_path = 'E:\DateSet\geetest\wait\quekou.png'
img_check_now = 'E:\DateSet\geetest\enter\check_now.png'
img_check = 'E:\DateSet\geetest\enter\check.png'
img_result = 'E:/DateSet/geetest/result/result.png'
js = "var q=document.documentElement.scrollTop=180" # 访问国家企业信用信息公示系统
driver = webdriver.Chrome()
# driver.implicitly_wait(40)
driver.get(base_url)
driver.maximize_window() # 判断元素是否存在,通过ID查询
def is_exist_by_id(element):
try:
driver.find_element_by_id(element)
return True
except:
return False # 判断元素是否存在,通过Class查询
def is_exist_by_class(element):
try:
driver.find_element_by_class_name(element)
return True
except:
return False # 判断元素是否存在,通过xpath查询
def is_exist_by_xpath(element):
try:
driver.find_element_by_xpath(element)
return True
except:
return False while True:
if is_exist_by_id("keyword") and is_exist_by_id("keyword"):
break
time.sleep(0.5) driver.find_element_by_id("keyword").clear()
driver.find_element_by_id("keyword").send_keys("腾讯")
time.sleep(1)
driver.find_element_by_id("btn_query").click()
time.sleep(1) # 得到滑动小块在最右边的截图
while True:
if is_exist_by_class("geetest_slider_button"):
break
time.sleep(0.5)
slide_block = driver.find_element_by_class_name('geetest_slider_button')
ActionChains(driver).click_and_hold(slide_block).perform()
ActionChains(driver).move_by_offset(xoffset=200, yoffset=0).perform()
driver.save_screenshot(img_path) # 得到匹配的原图
def match_source(image):
img_list = []
file_dir = os.listdir(img_paths)
for file_name in file_dir:
file_path_temp = img_paths + '\\' + file_name
img_list.append(Image.open(file_path_temp))
# pingtu 557 * 176
pixel_image = image.getpixel((557, 176))
for img in img_list:
# source 557 * 290
pixel_img = img.getpixel((557, 290))
if abs(pixel_image[0] - pixel_img[0]) < 5:
return img
return image # 判断是否是相似的位置
def is_similar(source_img, quekou_img, x, y):
pixel1 = source_img.getpixel((x, y + 114))
pixel2 = quekou_img.getpixel((x, y))
if abs(pixel1[0] - pixel2[0]) >= 70 and abs(pixel1[1] - pixel2[1]) >= 70 and abs(pixel1[2] - pixel2[2]) >= 70:
return False
return True # 计算滑块位移距离
def get_diff_location(source_img, quekou_img):
for i in range(536, 803):
for j in range(164, 333):
if not is_similar(source_img, quekou_img, i, j):
return i
return -1 #滑块移动轨迹
def get_track(distance):
track = [distance]
# current = 0
# mid = distance * 7 / 8
# t = random.randint(2, 3) / 10
# v = 0
# while current < distance:
# if current < mid:
# a = 2
# else:
# a = -3
# v0 = v
# v = v0 + a * t
# move = v0 * t + 1 / 2 * a * t * t
# current += move
# track.append(round(move))
return track ActionChains(driver).release(slide_block).perform()
quekou_img = Image.open(img_path)
source_img = match_source(quekou_img) # h_dis distance to left
h_dis = get_diff_location(source_img, quekou_img) # 模拟人工移动
def imitate(distance):
track_list = get_track(distance)
time.sleep(2)
ActionChains(driver).click_and_hold(slide_block).perform()
time.sleep(0.02)
for track in track_list:
ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()
imitate = ActionChains(driver).move_by_offset(xoffset=-1, yoffset=0)
time.sleep(0.015)
imitate.perform()
time.sleep(random.randint(5, 6)/10)
imitate.perform()
time.sleep(0.04)
imitate.perform()
time.sleep(0.012)
ActionChains(driver).move_by_offset(xoffset=1, yoffset=0).perform()
ActionChains(driver).pause(random.randint(1, 2)/10).release(slide_block).perform()
time.sleep(2) imitate(h_dis - 552)
while True:
if is_exist_by_xpath("//*[@id='advs']/div/div[2]/a[1]"):
break
time.sleep(0.5) # 通过xpath定位到第一条信息
driver.find_element_by_xpath("//*[@id='advs']/div/div[2]/a[1]").click()
# time.sleep(7) windows = driver.window_handles
driver.switch_to.window(windows[-1])
driver.execute_script(js)
driver.save_screenshot(img_result) # driver.close()

geetest拼图破解的更多相关文章

  1. 爬虫进阶教程:极验(GEETEST)验证码破解教程

    摘要 爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的.遇到Geetest提供的滑动验证码怎么破?授人予鱼不如授人予渔,接下来就为大家呈现本教程的精 ...

  2. 4.使用Redis+Flask维护动态代理池

    1.为什么使用代理池 许多⽹网站有专⻔门的反爬⾍虫措施,可能遇到封IP等问题. 互联⽹网上公开了了⼤大量量免费代理理,利利⽤用好资源. 通过定时的检测维护同样可以得到多个可⽤用代理理. 2.代理池的要 ...

  3. python3 破解 geetest(极验)的滑块验证码

    Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...

  4. 破解极验(geetest)验证码

      破解极验(geetest)验证码 这是两年前的帖子: http://www.v2ex.com/t/138479 一个月前的破解程序,我没用过 asp.net ,不知道是不是真的破解了, demo ...

  5. Geetest 极验验证 验证图片拼图

    今天要求做一个跟魅族官网登陆的一个验证效果一样的界面 是一个拖动滑动图片进行拼图 那个效果看着很好,刚开始拿到不知道好不好做 从网上搜资料发现这是一种“极验验证码” 让用户通过滑动拼图来进行验证. 网 ...

  6. selenium+java破解极验滑动验证码

    摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...

  7. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  8. 极验3.0滑动拼图验证的使用--java

    [ 前言: 在登录其他网站的时候,看到有个滑动拼图的验证觉得挺好玩的,以前做一个图片验证的小demo,现在发现很多网站都开始流行滑动拼图的验证了,今天也想自己动手来弄一个. 废话不多说,开始撸起来! ...

  9. 使用Python + Selenium破解滑块验证码

    在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...

随机推荐

  1. PHP array_splice

    1.函数的作用:数组中元素的删除和替代 2.函数的参数: @params array  &$array @params int      $offset @params int      $l ...

  2. [网络流 24 题] luoguP2763 试题库问题

    [返回网络流 24 题索引] 题目描述 假设一个试题库中有 nnn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 mmm 道题组成试卷.并要求试卷包含指定类型的试题. ...

  3. 问题:LinkedList 是原始类型。应该将对通用类型 LinkedList<E> 的引用参数化

    jdk1.5之后,引入了泛型,类似下面这种写法会出现类似警告,可以忽略,  LinkedList llist = new LinkedList();也可以修改一下,指定类型  LinkedList&l ...

  4. go-defer语句

    Go语言中的defer语句也非常独特. defer语句仅能被放置在函数或方法中. 它由关键字defer和一个调用表达式组成. 调用表达式所表示的既不能是对Go语言内建函数的调用 也不能是对Go语言标准 ...

  5. 异步IO实例

    #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> ...

  6. Java 异常处理的 20 个最佳实践,你知道几个?

    异常处理是 Java 开发中的一个重要部分,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java 提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建 ...

  7. spring boot打印sql语句-mybatis

    spring boot打印sql语句-mybatis 概述 当自己编写的程序出现了BUG等等,找了很久 调试运行了几遍到mapper层也进去调试进了源码,非常麻烦 我就想打印出sql语句,好进行解决B ...

  8. linux 中 NTP 对时过程记录

    1.连接需要对时的服务器 $: ntpdate -u 服务器ip地址 2.写对时任务的脚本 #:crontab -e 选择 2(nano编辑): 59 23 * * * /usr/sbin/ntpda ...

  9. Java基础(十三)内部类(inner class)

    1.内部类是定义在另一个类中的类.使用内部类的原因有: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据 内部类可以对同一个包中的其他类隐藏起来 当想要定义一个回调函数且不想编写大量代码 ...

  10. seq2seq+attention解读

    1什么是注意力机制? Attention是一种用于提升Encoder + Decoder模型的效果的机制. 2.Attention Mechanism原理 要介绍Attention Mechanism ...