破解滑动验证码

使用python破解滑动验证码后获取cookie, 用于爬取数据,这里是获取到cookie存到redis,不费话了,上代码

import re
import redis
from selenium.webdriver.chrome.options import Options
#from urllib.request import urlretrieve
from PIL import Image
from selenium.webdriver.common.action_chains import ActionChains
import pymysql
from urllib.request import urlretrieve
import json
import random
import time
from selenium import webdriver
from ctypes import *
import requests
from novel_spider.config import mysql
from novel_spider.config import redis as rdsconfigclass yuewen():"""初始化属性,传入url地址,驱动路径,浏览器窗口最大化,伪造ua"""def __init__(self):self.url = 'https://open.yuewen.com/'"""开启webdriver服务"""def new_browser(self):chrome_options = Options()#chrome_options.add_argument("--no-sandbox")#chrome_options.add_argument('--disable-dev-shm-usage')#chrome_options.add_argument('--disable-gpu')#chrome_options.add_argument('--headless')self.driver = webdriver.Chrome(options=chrome_options)"""关闭webdriver服务"""def close_browser(self):self.driver.quit()"""输入用户名,适应linux系统"""def input_username_password(self,account, password):self.driver.get(self.url)time.sleep(1)self.driver.find_element_by_class_name('op-button-sign').click()  # 找到class为op-button-sign的元素点击time.sleep(1)self.driver.find_element_by_xpath("//p[contains(text(),'账号登录')]").click()self.driver.find_element_by_class_name('el-input__inner').send_keys(account)self.driver.find_element_by_name('password').send_keys(password)time.sleep(3)self.driver.find_element_by_xpath("//span[contains(text(),'登录')]").click()"""获取验证码阴影图和原图:return:"""def get_img(self):self.driver.switch_to.frame('tcaptcha_iframe')time.sleep(3)# 获取有阴影的图片src = self.driver.find_element_by_id('slideBg').get_attribute('src')#分析图片地址,发现原图地址可以通过阴影图地址改动获取src_bg = re.sub('img_index=1', 'img_index=0', src)urlretrieve(src, 'img1.png')urlretrieve(src_bg, 'img2.png')captcha1 = Image.open('img1.png')captcha2 = Image.open('img2.png')return captcha1, captcha2"""下载的图片把网页中的图片进行了放大,所以将图片还原成原尺寸:param img: 图片:return: 返回还原后的图片"""def resize_img(self, img):a = 2.428  # 通过本地图片与原网页图片的比较,计算出的缩放比例(x, y) = img.sizex_resize = int(x // a)y_resize = int(y // a)img = img.resize((x_resize, y_resize), Image.ANTIALIAS)return img"""比较两张图片同一点上的像数值,差距大于设置标准返回False:param img1: 阴影图:param img2: 原图:param x: 横坐标:param y: 纵坐标:return: 是否相等"""def is_pixel_equal(self, img1, img2, x, y):pixel1, pixel2 = img1.load()[x, y], img2.load()[x, y]sub_index = 100if abs(pixel1[0] - pixel2[0]) < sub_index and abs(pixel1[1] - pixel2[1]) < sub_index and abs(pixel1[2] - pixel2[2]) < sub_index:return Trueelse:return False'''获取缺口的偏移量'''def get_gap_offset(self, img1, img2):offset = Nonedistance = 70for i in range(distance, img1.size[0]):for j in range(img1.size[1]):# 两张图片对比,(i,j)像素点的RGB差距,过大则该x为偏移值if not self.is_pixel_equal(img1, img2, i, j):offset = ireturn offsetreturn offset'''计算滑块的移动轨迹'''def get_track(self, offset):offset -= -8  # 滑块并不是从0开始移动,有一个初始值a = offset / 4track = [a, a, a, a]return track"""模拟人手释放鼠标抖动:return: None"""def shake_mouse(self):ActionChains(self.driver).move_by_offset(xoffset=-2, yoffset=0).perform()ActionChains(self.driver).move_by_offset(xoffset=2, yoffset=0).perform()"""拖动滑块:param track: 运动轨迹:return:"""def operate_slider(self, track):#  定位到拖动按钮slider_bt = self.driver.find_element_by_xpath('//div[@class="tc-drag-thumb"]')# 点击拖动按钮不放ActionChains(self.driver).click_and_hold(slider_bt).perform()# 按正向轨迹移动for i in track:ActionChains(self.driver).move_by_offset(xoffset=i, yoffset=0).perform()time.sleep(random.random() / 100)  # 每移动一次随机停顿0-1/100秒之间骗过了极验,通过率很高time.sleep(random.random())# 按逆向轨迹移动back_tracks = [-1, -0.5, -1]for i in back_tracks:time.sleep(random.random() / 100)ActionChains(self.driver).move_by_offset(xoffset=i, yoffset=0).perform()# 模拟人手抖动self.shake_mouse()time.sleep(random.random())# 松开滑块按钮ActionChains(self.driver).release().perform()'''实现主要的登陆逻辑'''def login(self, account, password):#self.input_new_username_password(account, password)self.input_username_password(account, password)time.sleep(5)#获取cookiea, b = self.get_img()a = self.resize_img(a)b = self.resize_img(b)distance = self.get_gap_offset(a, b)track = self.get_track(distance)login = self.operate_slider(track)time.sleep(4)# 获取cookiecookie = self.driver.get_cookies()cookie_str = {}# 组装cookie字符串for item_cookie in cookie:cookie_str[item_cookie["name"]] =  item_cookie["value"]return cookie_str'''退出登入aid 为seo_agent_list表主键ID'''def logout(self,aid):btaid = [4,5,7,8,9,10,25]if aid in btaid:self.driver.find_element_by_class_name('el-button--medium').click()time.sleep(1)self.driver.find_element_by_class_name('user-avatar').click()time.sleep(1)self.driver.find_element_by_xpath("//span[contains(text(),'退出登录')]").click()else:self.driver.find_element_by_class_name('user-avatar').click()time.sleep(1)self.driver.find_element_by_xpath("//span[contains(text(),'退出登录')]").click()def get_data(self,url,cookies):heaed = { 'Cookie':'OPENSESSID='+cookies['OPENSESSID']}response = requests.get(url, headers=heaed)return response.text'''连接redis'''def redis_con(self):host = rdsconfig['hostname']passwd = rdsconfig['password']port = rdsconfig['hostport']pool = redis.ConnectionPool(host=host,port=port,password=passwd,db=8)return redis.Redis(connection_pool=pool)'''连接mysql'''def mysql_con(self):host = mysql['host']port = mysql['port']database = mysql['database']user = mysql['user']passwd = mysql['password']db = pymysql.connect(host=host, user=user,database=database, password=passwd)cursor = db.cursor()sql = 'select id,email,password from pa_account where platform_id = 1'cursor.execute(sql)rows = cursor.fetchall()return rowsif __name__ == '__main__':qq = yuewen()rds = qq.redis_con()data = qq.mysql_con()for id,key,value in data:#增长IDbtaid = [1,2,3,4,5,6,7,8]rediskey = 'logincookie_%d'%(id)if id in btaid:try:qq.new_browser()cookie = qq.login(key,value)print(cookie)str = json.dumps(cookie)#rds.set(rediskey, str)time.sleep(1)qq.close_browser()except Exception as e:#重试机制qq.new_browser()cookie = qq.login(key, value)print('---'+cookie)str = json.dumps(cookie)#rds.set(rediskey, str)time.sleep(1)qq.close_browser()

运行后效果

破解滑动验证码,成功率在百分之九十九相关推荐

  1. 用Python爬虫破解滑动验证码

    我们可以借用opencv来解决这个问题,主要步骤: opencv 是什么? OpenCV(Open Source Computer Vision Library)是开放源代码计算机视觉库,主要算法涉及 ...

  2. 你百分之九十九的问题都是因为懒

    旧的一款手袋,扔掉了可惜.那天在屋里读书读得有点闷,便找出来,拿毛巾稍微擦一擦,拿到室外下认认真真拍了几张照片,前面,后面,内里,口袋,手柄,划痕,序列号,一一拍个清清楚楚. 选出九张最满意的大图,挂 ...

  3. Python破解滑动验证码(极验/无背景图)

    在使用Python突破人机验证时,验证码乃第一大关卡.本文针对破解滑动验证码展开分析.对于能够直接获取滑块小图与背景图的滑动验证码,通过使用cv2模块的matchTemplate函数,可以准确地计算出 ...

  4. 如何破解滑动验证码?

    本文通过自动化查询域名或公司的备案信息,来演示其中图片滑动验证码的破解方式,以此来思考验证码的安全性问题,思考如何设计出安全性更高的验证码. 注意:破解验证码进行网络内容抓取可能是一种违规行为,可以以 ...

  5. 使用Selenium破解滑动验证码的原理及解决思路

    介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码. 它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及 ...

  6. selenium爬虫|破解滑动验证码以极验为例

    爬虫访问一些网站遇到滑动验证码解决方案 这里是用selenium做模拟,如果是requests可以封装这个登录方法来获取登录后的cookies也是可以用的. 1 思路 先讲思路,分析流程 我们输入账号 ...

  7. 作为一只Python爬虫:如何破解滑动验证码

    做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈. 今天分享个如何简单处理滑动图片的验证码的案例. 类似这种拖动滑块 ...

  8. Python爬虫的实际运用之:破解滑动验证码

    做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈. 今天分享个如何简单处理滑动图片的验证码的案例. 类似这种拖动滑块 ...

  9. 前端面试技巧和注意事项_前端面试百分之九十九过的技巧

    2020最全的前端面试指南,一个多月 1.8w 字的面试经验积累,凭借它最终成功入职大厂-- 今年的金三银四刚好赶上疫情,很多大公司都停止招聘甚至裁员,想跳槽的小伙伴被打的措手不及. 需求减少要求肯定 ...

最新文章

  1. java类和接口实例_Java定义泛型接口和类的方法实例分析
  2. .从三层架构到MVC,MVP
  3. vs 2005 下载,再汉化---没想到是痛苦的过程
  4. Button单击事件处理:
  5. python 除法取整_Python中整数和浮点数
  6. 第二篇|腾讯开源项目盘点:ncnn、xLua、libco等
  7. rasa聊天机器人_Rasa-X是持续改进聊天机器人的独特方法
  8. 判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)...
  9. 39 FI配置-财务会计-固定资产-组织结构-定义号码范围间隔
  10. PCB Layout各层含义与分层原则
  11. ASP.NET动态网站开发培训-26.在线编辑器FreeTextBox的使用
  12. MySql根据字段名查询重复记录并删除!只保留一条
  13. 深度学习tracking学习笔记(2):图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)
  14. 苹果创建账号显示服务器出错,创建iCloud id 提示:无法创建
  15. Apache oozie ---工作流调度软件
  16. swiper 弹出图片_结合swiper使用图片懒加载
  17. 微型计算机中常见到的Ega.VGA等是指,大学计算机基础选择题汇总
  18. Qt LINK : fatal error LNK1104: 无法打开文件“xxx.lib”
  19. 大数据是什么?大数据可以做什么?大数据实际做了什么?大数据要怎么做?
  20. 玩转全球最大同性交友网站--- 开源社区GitHub

热门文章

  1. 快速实现地图迁移数据可视化
  2. 浅谈stdio.h及cstdio的区别
  3. 无线安全专题_破解篇02--kali破解pin码
  4. 软件测试现状(专家采访记录)
  5. 中美贸易谈判对云计算行业的影响
  6. 小程序登录状态/手机号码获取
  7. FoobarFubar
  8. Android JPush(极光推送)的使用教程
  9. windows10下安装trax库
  10. 因为一顿饭,我被隔离了