反爬虫机制与反爬虫技术二
-
- 1、动态页面处理与验证码识别概述
- 2、反爬虫案例:页面登录与滑块验证码处理
-
- 2.1、用例简介
- 2.2、库(模块)简介
- 2.3、网页分析
- 2.4、Selenium准备操作
- 2.5、页面登录
- 2.6、模糊移动滑块测试
- 3、滑块验证码处理:精确移动滑块
-
- 3.1、精确移动滑块的原理
- 3.2、滑块验证码图像缺口位置识别
- 3.3、精确移动滑块实现(完整代码)
1、动态页面处理与验证码识别概述
本文接上篇:反爬虫机制与反爬虫技术(一)
上篇中,我们详细介绍和使用了User-Agent伪装、代理IP、请求频率控制等反爬虫技术,本篇将重点针对动态页面处理和验证码识别进行介绍和案件详解
近年来,网站安全性越来越高,许多网站为了避免机器人恶意攻击,采用了滑动验证码。与传统的验证码相比,滑动验证码安全性更高,更难被攻击者破解。但是,这也给爬虫程序带来了困难。Python Selenium是一款非常出色的自动化测试工具,可以用来模拟浏览器行为,可以用于爬虫
例如,一些网站为了防止爬虫,使用了JavaScript来动态生成页面内容,这对于爬虫来说是一个挑战。Python中的Selenium库可以模拟浏览器的行为,执行JavaScript代码,从而获取动态生成的内容
例如在进行数据采集时,很多网站需要进行登录才能获取到目标数据,这时可以使用Selenium库进行模拟登录进行处理
另外,一些网站为了防止爬虫,会在登录或提交表单时添加验证码。随着反爬的不断发展,逐渐出现了更多复杂的验证码,例如:内容验证码、滑动验证码、图片拼接验证码等
Python提供了一些强大的图像处理库,例如Pillow、OpenCV等,可以用来自动识别验证码,从而实现自动化爬取
2、反爬虫案例:页面登录与滑块验证码处理
2.1、用例简介
本案例将以豆瓣的登录页面为例
豆瓣登录:https://accounts.douban.com/passport/login
操作步骤:
1) 打开豆瓣登录页面
2) 点击页面上的密码登录
3) 输入账号密码之后,点击登录豆瓣按钮
4) 点击登录后会弹出滑块验证码,拼接验证
2.2、库(模块)简介
Selenium是一种自动化测试工具,可以用于控制浏览器执行自动化操作,比如滑动验证码识别。滑动验证码通常是用于网站的登陆、注册等操作,通过鼠标模拟人手在滑动拼图或滑动滑块,达到人机交互的效果。在自动化测试中,如果能够识别滑动验证码,就可以实现完全自动化,提高效率
Selenium详解见文章:传送门
利用OpenCV、PIL等Python的图像处理识别库,可以在页面加载完成后,对验证码图片进行特征提取,然后通过算法自动计算出正确的滑块滑动位置,并模拟用户滑动
OpenCV详解见文章:传送门
本案例需要使用到的库(模块)如下:
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 # 等待条件类
import time
import re
import numpy as np
import urllib.request as req
import cv2
2.3、网页分析
通过检查网页源代码,按照上述操作步骤进行操作,在HTML中找到用例需要使用到的一些元素
其中,点击登录按钮后,就会出现滑块验证区域,这是一个新增的iframe区域
2.4、Selenium准备操作
通过以下操作验证Selenium环境WebDriver是否正常:
# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不关闭(解决闪退/自动关闭)
options.add_experimental_option('detach', True)
# 禁用浏览器扩展
options.add_argument('--disable-extensions')
# 禁用浏览器弹窗
options.add_argument('--disable-popup-blocking')
# 设置浏览器UA
options.add_argument('--user-agent=Mozilla/5.0')
# 声明浏览器对象
driver = webdriver.Chrome(options=options)
# 最大化浏览器窗口
driver.maximize_window()
# 打开豆瓣登录页
driver