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. jquery 获取input的值

    $("input").attr("value")   --  获取的是input的默认值 $("input").val()         ...

  2. 创建优化的Go镜像文件以及踩过的坑

    在Docker上创建Go镜像文件并不困难,但建立的文件很大,接近1G,使用起来不太方便.Docker镜像的一个主要难题就是如何优化,创建小的镜像.我们可以用多级构建的方法来创建Docker镜像文件,它 ...

  3. java集合之linkedList链表基础

    LinkedList链表: List接口的链接列表实现.允许存储所有元素(包含null).使用频繁增删元素. linkedList方法: void addFirst(E e) 指定元素插入列表的开头 ...

  4. mysql::批量入库

    批量入库 INSERT INTO M_Signal (Signal_Id, Signal_Name) VALUES(,,'water') , , , , 'water') ON DUPLICATE K ...

  5. POJ 3259 Wormholes(Bellman-Ford)

    题目网址:http://poj.org/problem?id=3259 题目: Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Su ...

  6. 玩转ArduinoJson库 V6版本

    1.前言     前面,博主已经讲解了ArduinoJson库的V5版本.为了节省时间以及不讨论重复内容,博主建议读者先去阅读一下 玩转ArduinoJson库 V5版本 .重点了解几个东西: JSO ...

  7. 《HTML5+CSS3+JavaScript 从入门到精通(标准版)》学习笔记(一)

    以下是以代码形式书写的笔记,本系列会持续更新,主要内容预计是类似下文的笔记,兼或一些思考与小项目,希望对你会有所帮助 1 <!-- --> <!DOCTYPE html>< ...

  8. Airflow速用

    Airflow是Apache用python编写的,用到了 flask框架及相关插件,rabbitmq,celery等(windows不兼容):. 主要实现的功能 编写 定时任务,及任务间的编排: 提供 ...

  9. rabbitmq学习-如何安装rabbitmq

    学习当然还是需要看官网地址的哈 官网地址 你可能会说老铁,看不懂英文咋办?我只能说各大翻译软件以及广大网友总有一款是你喜欢的 广大网友翻译的 中文文档 什么是rabbitmq? rabbitmq (R ...

  10. Nginx 了解一下?

    这篇文章主要简单的介绍下 Nginx 的相关知识,主要包括以下几部分内容: Nginx 适用于哪些场景? 为什么会出现 Nginx? Nginx 优点 Nginx 的编译与配置 Nginx 适用于哪些 ...