当前位置: 首页 > 后端技术 > Python

爬虫遇到头痛的验证码?Python实战讲解弹窗处理与验证码识别

时间:2023-03-26 16:49:39 Python

文章来源:早起Python微信公众号作者:陈曦前言基于Selenium的弹窗与验证码处理实战讲解,爬取的目标网站是一个仪器预订平台,可以看到登录需要的验证码比较简单。它是一个带有简单背景干扰的彩色标准数字。因此,这里的验证码识别不需要借助人工智能的手段。可以直接用二进制的方式对图片进行处理,然后交给谷歌的识别引擎tesseract-OCR来获取图片中的数字。注:selenium和tesseract的配置读者可以自行搜索,本文不再介绍)Python实战先导入需要的模块`importreimageprocessingfromPILimportImagetextrecognitionimportpytesseractbrowserautomationfromseleniumimportwebdriverimporttime`解决弹框问题首先尝试打开示例网站`url='http://lims.gzzoc.com/client'driver=webdriver.Chrome()driver.get(url)time.sleep(30)`有趣的事情出现了,网站显示了一个我们以前没见过的弹窗。简单说一下弹窗的知识点。初学者可以简单地将弹框分为alert和非alert弹框。alert(message)方法用于显示指定的消息和一个确定按钮的警告框。confirm(message)方法用于显示一个对话框,其中包含指定的消息以及OK和Cancel按钮。prompt(text,defaultText)方法用于显示提示用户输入的对话框。看一下弹出框。js是怎么写的:好像是一个alert弹框,直接用driver.switch_to.alert?不用担心非传统警告弹框的处理。弹出框位于div层。和通常的定位方式一样,弹出框是一个嵌套的iframe层。它需要切换。iframe弹出框位于嵌套句柄中,需要切换窗口。盒子进行元素检测所以问题其实很简单,定位按钮点击即可`url='http://lims.gzzoc.com/client'driver=webdriver.Chrome()driver.get(url)time.sleep(1)driver.maximize_window()#最大化窗口driver.find_element_by_xpath("//div[@class='jconfirm-buttons']/button").click()`获取图片位置并截图二值法对验证码进行处理简单思路如下:将验证码所在的图片截取并转为灰度,然后二值法将有效信息转为黑色,背景和干扰转为白色.验证码图片进一步思考解决策略:先获取网页上图片的css属性,根据大小和位置计算图片的坐标;然后截图;最后用这个坐标进一步处理截图(由于验证码js的特殊性,不能简单的获取img下载图片后读取href,会造成不匹配)`img=driver.find_element_by_xpath('//img[@id="valiCode"]')time.sleep(1)location=img.locationsize=img.sizeleft=location['x']top=location['y']right=left+size['width']bottom=top+size['height']left=2*location['x']top=2*location['y']right=left+2*size['width']-10bottom=top+2*size['height']-10driver.save_screenshot('validode.png')page_snap_obj=Image.open('valicode.png')image_obj=page_snap_obj.crop((左,上,右,下))image_obj.show()`一般情况下可以直接使用注释掉的四行代码,但是不同的电脑浏览器不同,放大倍数是有差异的,所以如果截取的图片有偏差,需要考虑乘法放大倍数f演员最后可以加减值进行微调,可以看到图片截取成功了!对于验证码图像的进一步处理,阈值需要用Photoshop或其他工具进行尝试,即在灰度图像中找到一个能够将真实数据与背景干扰区分开来的像素阈值。本例中测试的阈值为205`img=image_obj.convert("L")#转为灰度图pixdata=img.load()w,h=img.sizethreshold=205遍历所有像素,大于阈值的像素对于yinrange(h):forxinrange(w):ifpixdata[x,y]