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. [Luogu3554] Poi2013 Triumphal arch

    Description Foreseeable和拿破仑的御用建筑师让·夏格伦在玩游戏 让·夏格伦会玩一个叫“凯旋门”的游戏:现在有一棵n个节点的树,表示一个国家 1号点代表这个国家的首都 这个游戏由两 ...

  2. Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

    简介 按照上一篇的计划,这一篇给小伙伴们分享一下测试方法. 一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递 ...

  3. Centos7.4环境下搭建Python开发环境(虚拟机安装+python安装+pycharm安装)

    目录 一.安装 Centos7.4虚拟机 二.安装 python3.6.7 三.安装 pycharm 一般情况下,大家都是在 Windows平台下进行 Python开发,软件安装和环境搭建都非常&qu ...

  4. 2019.10.26 CSP%您赛第三场

    \(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...

  5. js控制进度条数据

    <style><!-- #time{ width:500px; height: 20px; background: red; border-radius: 10px; } --> ...

  6. SpringBoot与MybatisPlus整合之公用字段填充(十一)

    在实际开发中,适合用于记录创建人修改人 pom.xml <dependencies> <dependency> <groupId>org.springframewo ...

  7. rsync的笔记整理

    Rsyncd数据同步工具 1.什么是Rsyncs? Rsync(Remote synchronization)是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsy ...

  8. 2018.8.10 python中的迭代器

    主要内容: 1.函数名的使用 2.闭包 3.迭代器 一.函数名的运用 函数名是一个变量,但他是一个特殊的变量,与括号配合可执行函数的变量. 1.函数名的内存地址 def func(): print(' ...

  9. shell 脚本中的注释详解

    上次写了shell脚本的注释,没想到那么多人的需要,也存在不少不足.这次做个补充吧. 单行注释: 单行注释就比较简单了,直接在行最前端加上符号 # 即可.具体用法如下所示: # this is com ...

  10. 8、pytest -- 捕获告警信息

    目录 1. 告警信息的默认捕获行为 2. @pytest.mark.filterwarnings 3. 去使能告警信息的展示 4. 去使能告警的捕获行为 5. DeprecationWarning和P ...