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. dnn文本分类

    简介 文本分类任务根据给定一条文本的内容,判断该文本所属的类别,是自然语言处理领域的一项重要的基础任务.具体的,本任务是对文本quey进行分类,任务流程如下: 收集用户query数据. 清洗,标记. ...

  2. 面试必问的Synchronized知道这些就可以了

    Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...

  3. .NET如何将字符串分隔为字符

    .NET如何将字符串分隔为字符 如果这是一道面试题,答案也许非常简单:.ToCharArray(),这基本正确-- 我们以"AB吉

  4. 钢铁B2B电商案例:供应链金融如何解决供应链金融痛点

    一.区块链是什么 区块链是一种按照时间顺序将数据块以特定的顺序相连的方式组合成的链式数据结构,其上存储了系统诞生以来所有交易的记录.区块链上的数据由全网节点共同维护并共同存储,同时以密码学方式保证区块 ...

  5. LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)

    84题和85五题 基本是一样的,先说84题 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 思路很简单,通过循环,分别判断第 i 个柱子能够延展的长度le ...

  6. Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)

    刚开始使用Mybaits的同学有没有这样的疑惑,为什么我们没有编写Mapper的实现类,却能调用Mapper的方法呢?本篇文章我带大家一起来解决这个疑问 上一篇文章我们获取到了DefaultSqlSe ...

  7. fenby C语言 P28

    #include <stdio.h> int main(){ int *p1,*p2,a=10,b=20,c; p1=&a; p2=&b; if(a<b) { c=a ...

  8. arango集群部署

    arango集群部署 ############arango集群操作################## arangodb3-3.3.16-1.x86_64.rpm(使用rpm包方式安装) arango ...

  9. .net layui 批量导出

    .net开发,前台使用layui框架,后台使用WCF 废话不多,直接上代码 1>文件引用: admin.css layui.css layui.js jquery.min.js layerToo ...

  10. 深究1.8版本HashMap源码

    put方法 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } 在putVal方法之 ...