Python3爬虫关于识别检验滑动验证码的实例
在进行爬虫过程中,我们经常会遇到验证码的问题,其中包括识别检验滑动验证码,这在爬虫中非常常见。接下来,将详细讲解如何通过Python3实现识别检验滑动验证码。
什么是滑动验证码
滑动验证码是一种常见的验证码形式,通过滑动滚动条或者滑动图片的方式完成验证过程。在网站防止机器人爬取信息的时候常常会使用滑动验证码。
如何识别检验滑动验证码
首先,需要通过Selenium模拟浏览器行为,获取验证码图片并保存到本地。其次,通过图像处理库Pillow进行验证码图片的预处理,包括去除干扰线、二值化、降噪等操作。最后,通过图像识别库Tesseract进行验证码文字识别。
以下代码为爬取知网网站论文下载页面滑动验证码的实现示例:
import time
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
def get_identifying_code(driver, element):
"""
获取验证码图片并返回Image对象
"""
# 获取背景图片
bg_img_url = element.get_attribute('src')
bg_img_data = driver.execute_script(
"return fetch(\"%s\", {mode: 'no-cors'}).then((response) => response.blob());" % bg_img_url)
bg_image = Image.open(BytesIO(bg_img_data.content))
# 获取滑块图片
slider = driver.find_element_by_css_selector('.gt_slider_knob')
slider_img_url = driver.execute_script("return arguments[0].toDataURL(\"image/png\");", slider)
slider_img_data = driver.execute_script(
"return fetch(\"%s\", {mode: 'no-cors'}).then((response) => response.blob());" % slider_img_url)
slider_image = Image.open(BytesIO(slider_img_data.content))
return bg_image, slider_image
def get_diff_location(bg_image, slider_image):
"""
获取滑块移动距离
"""
threshold = 30
bg_image = bg_image.convert('L') # 转灰度图
slider_image = slider_image.convert('L') # 转灰度图
left = 0
for i in range(20, bg_image.size[0]):
for j in range(bg_image.size[1]):
pixel = bg_image.getpixel((i, j))
if abs(pixel - slider_image.getpixel((j, 0))) > threshold:
left = i
break
return left
def slide_to_gap(driver, slider, track):
"""
拖动滑块到目标位置
"""
ActionChains(driver).click_and_hold(slider).perform()
for x in track:
ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(driver).release().perform()
def main():
driver.get('https://kns.cnki.net/kns/brief/default_result.aspx')
# 选择要爬取的网页元素,并获取滑块验证码Image对象
element = driver.find_element_by_css_selector('.gt_cut_fullbg.gt_show')
bg_image, slider_image = get_identifying_code(driver, element)
# 获取滑块移动距离
distance = get_diff_location(bg_image, slider_image)
# 获取滑动轨迹
track = get_tracks(distance)
# 拖动滑块到目标位置
slider = driver.find_element_by_css_selector('.gt_slider_knob')
slide_to_gap(driver, slider, track)
# 完成上面的操作后,即可进行其他爬取操作
...
在上述代码中,get_identifying_code()函数用于获取验证码图片,get_diff_location()函数用于计算滑块移动距离,slide_to_gap()函数用于拖动滑块到目标位置。
另外,需要注意的是在实现过程中需要对验证码图片进行预处理,以确保图像识别的准确度。
示例说明
下面以实现QQ音乐的滑动验证码识别为例进行说明。
首先需要进行登录流程,在打开QQ音乐登录页面后,输入账号密码,点击"登录"按钮:
driver.get("http://y.qq.com/")
driver.find_element_by_css_selector('a[data-stat="account.flash"] > i').click()
time.sleep(2)
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys(qq_number)
driver.find_element_by_id('p').send_keys(qq_password)
driver.find_element_by_id('login_button').click()
time.sleep(2)
然后,在打开QQ音乐会员下载页面后,获取验证码图片并进行预处理和识别:
driver.get("https://y.qq.com/m/client/download.html")
time.sleep(2)
# 获取验证码图片
img_element = driver.find_element_by_css_selector('.captcha-img-wrap img')
captcha_image = get_image(img_element)
captcha_image.save('captcha.png')
# 预处理验证码图片
captcha_image = Image.open('captcha.png')
captcha_image = filter_noise(captcha_image)
# 识别验证码文字
captcha_text = recognize_text(captcha_image)
其中,get_image()函数用于获取验证码图片,filter_noise()函数用于对验证码图片进行预处理,识别验证码文字使用Tesseract实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3爬虫关于识别检验滑动验证码的实例 - Python技术站