前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盘点一个Python网络爬虫过验证码的问题(方法一)

盘点一个Python网络爬虫过验证码的问题(方法一)

作者头像
Python进阶者
发布2023-08-31 08:35:41
3220
发布2023-08-31 08:35:41
举报

一、前言

前几天在Python最强王者群【鶏啊鶏。】问了一个Python网络爬虫的问题,这里拿出来给大家分享下。

下面是他的代码:

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from PIL import Image
import ddddocr

ocr = ddddocr.DdddOcr()

options = webdriver.ChromeOptions()
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)

# 打开目标网页
driver.get('https://sol.sinosure.com.cn')
time.sleep(5)
driver.maximize_window()
# 定位验证码图片元素并模拟鼠标悬停以加载图片
yanzhengma = driver.find_element(By.CSS_SELECTOR, '.pass-form-item.pass-form-item-code')
captcha_element = yanzhengma.find_element(By.CSS_SELECTOR,  '.pass-label-img')
webdriver.ActionChains(driver).move_to_element(captcha_element).perform()
time.sleep(5)

# 获取验证码图片元素的位置和大小
location = captcha_element.location
size = captcha_element.size
print(location)
print(size)
# 截取整个网页的截图
driver.save_screenshot('screenshot.png')

# 根据验证码图片元素的位置和大小,从整个网页截图中裁剪出验证码图片
left = int(location['x'])
top = int(location['y'])
right = int(location['x'] + size['width'])
bottom = int(location['y'] + size['height'])
captcha_screenshot = Image.open('screenshot.png').crop((left, top, right, bottom))
print(left)
print(top)
print(location)
print(bottom)
# 保存裁剪后的验证码图片,并进行识别
captcha_screenshot.save('captcha.png')
with open('captcha.png', 'rb') as f:
    img_bytes = f.read()
res = ocr.classification(img_bytes)
print('识别的验证码是:' + res)

基本思路是没啥问题的,确实也是可以拿到对应界面的截图,只不过是验证码的位置截取出现了点偏差,导致验证码没正确识别到。

下面这个代码是获取验证码图片元素的位置和大小:

代码语言:javascript
复制
location = captcha_element.location
size = captcha_element.size

这个部分我看介绍应该是会返回定位的元素位置,我刚刚大致拖拉了一下在裁剪前的定位打印出来确实就已经去了输入密码附近的位置了 但是我定位的元素是验证码的地方,并且我也尝试了先定位验证那个位置的大元素再定位至具体的验证码图片位置 问题依旧。

上面是粉丝的疑惑,下面一起来看看解决办法。

二、实现过程

这里【魏哥】尝试了下代码,但是出现下图报错:

这个报错还是蛮常见的,对于时常使用sel的人来说,这个报错算是家常便饭了,报错的原因是本地浏览器驱动和谷歌浏览器的版本不匹配,需要更换本地浏览器驱动。

关于这个问题的解决方法,就是去网页下载对应浏览器版本的对应驱动,放到本地指定文件夹,确保该文件夹路径有加入环境变量。该问题的解决办法公众号历史文章也有提及,网上的解决教程也一大堆,这里不再赘述。

言归正传,继续回到这个问题的解决办法。这里【甯同学】给了一个思路,直接找到 验证码的图片的url 用requests 请求 验证码的.content 用 ocr.classification(验证码的.content) 就可以了 不用保存图片 在open读取二进制流,代码如下所示:

顺利地解决了粉丝的问题,如果对requests和Beautiful还不熟悉的小伙伴,可能接受起来就比较困难一些。

这里只是给出了其中一个方法,另外的一个方法,一起看下一篇文章,敬请期待!

三、总结

大家好,我是皮皮。这篇文章主要盘点了一个Python网络爬虫过验证码的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

往期精彩文章推荐:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、实现过程
  • 三、总结
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档