爬虫怎样绕过验证码

- cookie登录

1.利用cookie的特性:cookie会保持较长的时间,来避免用户频繁登录
2.cookie一般由前端开发用js生成,可以利用抓包尝试下破解,不过这个难度有点高,不过破解js本就是爬虫必须直面面对的
3.2OCR库里的tesseract(光学文字识别)可以解决大多数的传统验证码
4.软件tesserract-ocr先安装,然后安装pytesserract类库

注意:

1.Windows需要下载软件安装包,再配置环境变量
2.linux 直接在命令窗口输入:sudo apt-get tesseract-ocr 模拟浏览器,selenium和PIL库的截屏功能,来识别验证码(save_screenshot截图)

打码平台

1.打码兔和QQ超人打码,有提供Python的接入方式,人工打码平台需要收费。
2.以QQ超人打码平台,先要注册开发者账号,在识别程序中需要填写个人账号进行认证计费,登录之后接入,开始计费(一个码六分钱)

selenium 来模拟拉动来破解滑动验证码

由于时间过久,滑动验证码已经更改,滑动验证码已经被放弃,现仅供参考使用

from PIL import Image
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import random
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
}
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('w3c', False)
caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = {'performance': 'ALL'}
class SliderVerificationCode(object):def __init__(self):  # 初始化一些信息self.left = 60  # 定义一个左边的起点 缺口一般离图片左侧有一定的距离 有一个滑块self.url = 'https://passport.bilibili.com/login'self.driver = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')self.wait = WebDriverWait(self.driver, 20)  # 设置等待时间20秒self.phone = "17369251763"self.passwd = "abcdefg"def input_name_password(self):  # 输入账号密码self.driver.get(self.url)self.driver.maximize_window()input_name = self.driver.find_element_by_xpath("//input[@id='login-username']")input_pwd = self.driver.find_element_by_xpath("//input[@id='login-passwd']")input_name.send_keys("username")self.wait = WebDriverWait(self.driver, 3)input_pwd.send_keys("passport")def click_login_button(self):  # 点击登录按钮,出现验证码图片login_btn = self.driver.find_element_by_class_name("btn-login")sleep(random.randint(3, 6))login_btn.click()def get_geetest_image(self):  # 获取验证码图片gapimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_bg')))sleep(2)gapimg.screenshot(r'./captcha1.png')# 通过js代码修改标签样式 显示图片2js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'self.driver.execute_script(js)sleep(2)fullimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_slice')))fullimg.screenshot(r'./captcha2.png')def is_similar(self, image1, image2, x, y):'''判断两张图片 各个位置的像素是否相同#image1:带缺口的图片:param image2: 不带缺口的图片:param x: 位置x:param y: 位置y:return: (x,y)位置的像素是否相同'''# 获取两张图片指定位置的像素点pixel1 = image1.load()[x, y]pixel2 = image2.load()[x, y]# 设置一个阈值 允许有误差threshold = 60# 彩色图 每个位置的像素点有三个通道if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:return Trueelse:return Falsedef get_diff_location(self):  # 获取缺口图起点captcha1 = Image.open('captcha1.png')captcha2 = Image.open('captcha2.png')for x in range(self.left, captcha1.size[0]):  # 从左到右 x方向for y in range(captcha1.size[1]):  # 从上到下 y方向if not self.is_similar(captcha1, captcha2, x, y):return x  # 找到缺口的左侧边界 在x方向上的位置def get_move_track(self, gap):track = []  # 移动轨迹current = 0  # 当前位移# 减速阈值mid = gap * 4 / 5  # 前4/5段加速 后1/5段减速t = 0.2  # 计算间隔v = 0  # 初速度while current < gap:if current < mid:a = 5  # 加速度为+5else:a = -5  # 加速度为-5v0 = v  # 初速度v0v = v0 + a * t  # 当前速度move = v0 * t + 1 / 2 * a * t * t  # 移动距离current += move  # 当前位移track.append(round(move))  # 加入轨迹return trackdef move_slider(self, track):slider = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_slider_button')))ActionChains(self.driver).click_and_hold(slider).perform()for x in track:  # 只有水平方向有运动 按轨迹移动ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()sleep(1)ActionChains(self.driver).release().perform()  # 松开鼠标def main(self):self.input_name_password()self.click_login_button()self.get_geetest_image()gap = self.get_diff_location()  # 缺口左起点位置gap = gap - 6  # 减去滑块左侧距离图片左侧在x方向上的距离 即为滑块实际要移动的距离track = self.get_move_track(gap)self.move_slider(track)
if __name__ == "__main__":springAutumn = SliderVerificationCode()springAutumn.main()

爬虫怎样绕过验证码?相关推荐

  1. python爬虫绕过验证码_爬虫怎样绕过验证码?

    叶湘伦:[文字篇]如何系统地自学 Python?​zhuanlan.zhihu.com 1,cookie登录利用cookie的特性:cookie会保持较长的时间,来避免用户频繁登录 cookie一般由 ...

  2. Python爬虫怎样绕过验证码?

    1,cookie登录 利用cookie的特性:cookie会保持较长的时间,来避免用户频繁登录 cookie一般由前端开发用js生成,可以利用抓包尝试下破解,不过这个难度有点高,不过破解js本就是爬虫 ...

  3. 寻找阿登高地——爬虫工程师如何绕过验证码

    马奇诺防线是二战前法国耗时十余年修建的防御工事,十分坚固,但是由于造价昂贵,仅修建了法德边境部分,绵延数百公里,而法比边界的阿登高地地形崎岖,不易运动作战,且比利时反对在该边界修建防线,固法军再次并没 ...

  4. 爬虫工程师如何绕过验证码?寻找阿登高地之路

    导读:马奇诺防线是二战前法国耗时十余年修建的防御工事,十分坚固,但是由于造价昂贵,仅修建了法德边境部分,绵延数百公里,而法比边界的阿登高地地形崎岖,不易运动作战,且比利时反对在该边界修建防线,固法军再 ...

  5. 爬虫如何解决验证码的问题

    今天要聊的就是在爬虫遇到验证码,如何去解决. 1.前言:关于验证码,我觉得是很low逼的技术,但是很多面试官都会问到如何解决验证码,好像是能识别验证的就代表了爬虫工程师的技术很牛逼,相反,爬虫工程师就 ...

  6. 绕过验证码的艺术:探索Nifty Gateway

    验证码的作用和类型 验证码是一种常用的人机验证机制,旨在阻止自动化程序对网站进行恶意访问.常见的验证码类型包括数字.文字.图像识别和行为验证等.数字和文字验证码要求用户手动输入指定的数字或文字,图像识 ...

  7. 绕过验证码保护Nifty Gateway上的NFT交易安全

    摘要: 本文将详细探讨如何通过绕过验证码的方式获取Nifty Gateway平台上的NFT交易数据.首先,我们将介绍验证码的作用和常见形式,然后深入研究Nifty Gateway平台的特点和安全措施. ...

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

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

  9. python通过cookie绕过验证码_Python Selenium Cookie 绕过验证码实现登录示例代码

    之前介绍过通过cookie 绕过验证码实现登录的方法.这里并不多余,会增加分析和另外一种方法实现登录. 1.思路介绍 1.1.直接看代码,内有详细注释说明 # FileName : Wm_Cookie ...

最新文章

  1. 【Java并发编程】:Runnable和Thread实现多线程的区别
  2. 教你编写高质量的 Java 代码!
  3. linux镜像下载与安装
  4. windows如何设置新建文本文档快捷键
  5. switchhost使用记录
  6. 如何将几个pdf合并成一个pdf?
  7. 移动端 点击图片放大
  8. 关于VGA接口连接1080p显示器模糊多半是线的问题
  9. redisRDB持久化中dir路径配置问题
  10. 计算机做word的表格,word表格制作,教您word如何制作表格
  11. 富有组织性是通往成功的必要习惯
  12. 【ECCV2018 UPDT】Unveiling the Power of Deep Tracking[特征融合]
  13. android图片凹凸效果,图像滤镜处理算法:柔化、光照、放大镜、哈哈镜
  14. 华为设备三层交换机与路由器对接上网
  15. 黑龙江省力推互联网与畜牧产业深度融合 打造大数据中心
  16. xp开机加载个人设置很慢的解决方法
  17. 软件著作权变更收费吗
  18. php自我介绍50字,自我介绍作文50字
  19. Maven学习:常用mvn命令
  20. 三菱PLC项目案例学习之自动寻槽铣槽机

热门文章

  1. 数据结构(C语言版)之线性表
  2. VulnHub-Raven
  3. html 导出为 PDF:因页面内有横向滚动条而显示不全的解决方案
  4. FreeRadius 服务器环境搭建(CHAP 版)
  5. 多个Newtonsoft.Json引起的版本冲突
  6. [JAVA毕业设计]废品回收管理系统设计与实现源码获取和系统演示
  7. Qt网络编程之搭建Udp通信【单播、组播、广播】
  8. FileUtils工具类详解
  9. Lumion 和 Vray这2款渲染器哪个更强?
  10. CHIP-seq流程学习笔记(6)-peak注释软件ChIPseeker