相应页面(http://glidedsky.com/level/web/crawler-captcha-1)
题目要求:
先看看页面:
当我们一打开页面,就是出现滑块验证码页面,我们所要的数字参数是没有的。
再看看滑动之后的页面。
很明显,当滑块验证通过之后,数字就会出现。
再分析滑块验证码图片,如下图,是腾讯防水墙滑块验证码。
再抓包看看,如下图,验证码图片和滑块图片已经出现,
到这里,简单分析一下思路。
- 访问页面,下载验证码图片;
- 通过图像识别,计算出验证码图片缺口位置;
- 通过selenium模拟移动滑块;
- 收集数字数据,继续下一个页面。
实现过程:
使用库:
import os
import random
import cv2
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from urllib.request import urlretrieve
import time
import numpy as np
from lxml import etree
这里说下,部分库与程序作用:
random:模拟滑动轨迹;
vc2、PIL、numpy:处理图片时,计算滑块对应坐标轴;
selenium:自动化处理验证码;
urllib.request.urlretrieve:下载图片。
实现过程:
应于网站要求,这里只说思路(个人程序过程),不提供代码。
- 初始化selenium;
- 访问页面,先登录,再进行题目页面;
- 切换到滑块验证码子页面(因为主页面中,不会显示滑块元素);
- 下载对应的滑块验证码图片(验证码带缺口大图,验证码缺口图);
- 加载验证码图片,计算坐标值(Image处理图片大小和位置偏移,cv2处理图片颜色色差(灰度),numpy计算坐标轴);
- 根据坐标轴,实现模拟滑动过程中的轨迹;
- 通过轨迹使用selenium拖动滑块;
- 如果成功,收集数字求和,然后下一页,重复第3步,如果滑块验证没有成功,该页面再次请求。
说明:
难点:图像计算坐标,模拟轨迹。
在验证过程中,注意页面的加载速度,可以使用time控制,图片识别时,用cv2处理灰度值,进行归一化处理,numpy可以通过归一化计算出相应坐标。
在网络上,已经有很多大佬实现了腾讯防水墙滑块验证码,可以适当的去参考。
PS:
除了腾讯防水墙滑块验证码,还有极验的滑块验证码,相对腾讯来说,极验的难度比腾讯的大很多,它的版本在不断更新,难度也越高,最开始极验滑块验证码可以通过截图处理保存图片,后来是图片碎片块,不过可以从css里获取对应位置参数,也可以处理,现在极验滑块验证码使用的是webp格式的碎片块图片,难上加难。欢迎知道的大佬留言!!!