阿里云网站建设的实训报告,遵义在线理财俱乐部,免费wordpress外贸企业主题,怎么增加网站的流量点击上方“早起Python”#xff0c;关注并“星标”每日接收Python干货#xff01;本文含 3321 字#xff0c;9代码片段建议阅读 8 分钟前言 在我们写爬虫的过程中#xff0c;目标网站常见的干扰手段就是设置验证码等#xff0c;本就将基于Selenium实战讲解如何处理弹窗和验… 点击上方“早起Python”关注并“星标”每日接收Python干货本文含 3321 字9代码片段建议阅读 8 分钟前言 在我们写爬虫的过程中目标网站常见的干扰手段就是设置验证码等本就将基于Selenium实战讲解如何处理弹窗和验证码爬取的目标网站为某仪器预约平台可以看到登录所需的验证码构成比较简单是彩色的标准数字配合简单的背景干扰因此这里的验证码识别不需要借助人工智能的手段可直接利用二值法对图片处理后交给谷歌的识别引擎tesseract-OCR即可获得图中的数字。注selenium 和 tesseract 的配置读者可自行搜索本文不做介绍)Python实战 首先导入所需模块import re# 图片处理from PIL import Image# 文字识别import pytesseract# 浏览器自动化from selenium import webdriverimport time解决弹出框问题先尝试打开示例网站url http://lims.gzzoc.com/clientdriver webdriver.Chrome()driver.get(url)time.sleep(30)有趣的地方出现了网站显示了一个我们前面没有看到的弹窗简单说一下弹窗的知识点初学者可以将弹出框简单分为alert和非alertalert式弹出框alert(message)方法用于显示带有一条指定消息和一个 OK 按钮的警告框confirm(message)方法用于显示一个带有指定消息和 OK 及取消按钮的对话框prompt(text,defaultText)方法用于显示可提示用户进行输入的对话框看一下这个弹出框的js是怎么写的看起来似乎是alert式弹出框那么直接用driver.switch_to.alert吗先不急非传统alert式弹出框的处理弹出框位于div层跟平常定位方法一样弹出框是嵌套的iframe层需要切换iframe弹出框位于嵌套的handle需要切换窗口所以我们对这个弹出框进行元素审查所以问题实际上很简单直接定位按钮并点击即可url http://lims.gzzoc.com/clientdriver webdriver.Chrome()driver.get(url)time.sleep(1)driver.maximize_window() # 最大化窗口driver.find_element_by_xpath(//div[classjconfirm-buttons]/button).click()获取图片位置并截图二值法处理验证码的简单思路如下切割截取验证码所在的图片转为灰度后二值法将有效信息转为黑背景和干扰转为白色处理后的图片交给文字识别引擎输入返回的结果并提交切割截取验证码的图片进一步思考解决策略首先获取网页上图片的css属性根据size和location算出图片的坐标然后截屏最后用这个坐标进一步去处理截屏即可(由于验证码js的特殊性不能简单获取img的href后下载图片后读取识别会导致前后不匹配)img driver.find_element_by_xpath(//img[idvaliCode])time.sleep(1)location img.locationsize img.size# left 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(valicode.png)page_snap_obj Image.open(valicode.png)image_obj page_snap_obj.crop((left, top, right, bottom))image_obj.show()正常情况下直接使用注释的四行代码即可但不同的电脑不同的浏览器缩放倍率存在差异因此如果截取出的图存在偏差这需要考虑乘上倍率系数。最后可以再加减数值进行微调可以看到图片这成功截取出来了验证码图片的进一步处理这个阈值需要具体用Photoshop或者其他工具尝试即找到一个像素阈值能够将灰度图片中真实数据和背景干扰分开本例经测试阈值为205img image_obj.convert(L) # 转灰度图pixdata img.load()w, h img.sizethreshold 205# 遍历所有像素大于阈值的为黑色for y in range(h): for x in range(w): if pixdata[x, y] pixdata[x, y] 0 else: pixdata[x, y] 255根据像素二值结果重新生成图片data img.getdata()w, h img.sizeblack_point 0for x in range(1, w - 1): for y in range(1, h - 1): mid_pixel data[w * y x] if mid_pixel 50: top_pixel data[w * (y - 1) x] left_pixel data[w * y (x - 1)] down_pixel data[w * (y 1) x] right_pixel data[w * y (x 1)] if top_pixel 10: black_point 1 if left_pixel 10: black_point 1 if down_pixel 10: black_point 1 if right_pixel 10: black_point 1 if black_point 1: img.putpixel((x, y), 255) black_point 0img.show()图像处理前后对比如下文字识别将处理后的图片就给谷歌的文字识别引擎就能完成识别result pytesseract.image_to_string(img)# 可能存在异常符号用正则提取其中的数字regex \dresult .join(re.findall(regex, result))print(result)识别结果如下提交账号密码、验证码等信息在处理完验证码之后现在我们就可以向网站提交账号密码、验证码等登陆所需信息driver.find_element_by_name(code).send_keys(result)driver.find_element_by_name(userName).send_keys(xxx)driver.find_element_by_name(password).send_keys(xxx)# 最后点击确定driver.find_element_by_xpath(//div[classform-group login-input][3]).click()需要注意的是二值法识别验证码成功率不是100%因此需要考虑到验证码识别错误需要单击图片更换验证码重新识别可以将上述代码拆解成多个函数后用如下循环框架试错while True: try: ... break except: driver.find_element_by_id(valiCode).click()为了方便理解代码的书写没有以函数形式呈现欢迎读者自行尝试修改小结成功登录后就可以获得个人的cookies接下来可以继续用selenium进行浏览器自动化或者把cookies传给requests后面就能爬取需要的信息做分析或者实现一些自动化功能但由于涉及到的爬虫知识点比较多我们会在后续的爬虫专题文章中进行分享往期精选(?猛戳可查看)10行Python代码竟能实现这些骚操作Python随机森林预测实战今日干货已送达又学到一招点击下方三连签收?收到收到