欢迎光临Fuwu360     登录 | 免费注册 |
按CTRL+D收藏,下次访问更方便
当前位置: 首页 > 编程 > Python > Python模拟浏览器自动登录网页之验证码处理

浏览历史

Python模拟浏览器自动登录网页之验证码处理

龙永超 / 2019-11-30

破解验证码,首先就得获取到验证码图片保存到硬盘上,访问验证码网址保存的验证码是不能用的,因为它保存下来的时候已经是一个新的验证码了,不再是网页刚加载时那个验证码,所以也就不能使用。最好的办法是截图。

Python的selenium库很容易就能实现操控浏览器访问网页、点击链接等,当然它也就可以用来模拟人工自动登录网站。

很多网站的登录入口都会有个验证码,这个验证码的作用就是防止暴力猜密码破解。有验证码,想要自动登录就会有点麻烦,但也不是就搞不定,办法还是有的。

破解验证码,首先就得获取到验证码图片保存到硬盘上,然后可以使用TensorFlow自己训练验证码识别模型来破解,当然最简单的办法是调用百度通用文字识别接口识别验证码

保存验证码的办法,有很简单的办法:

# 下载图片,并保存到文件夹中
import urllib
urllib.request.urlretrieve("http://shangshiwendao.com/img/qrcode-150x150.png", filename="./kaptcha.png")

但是这样拿到的验证码是不能用的,因为它保存下来的时候已经是一个新的验证码了,不再是网页刚加载时那个验证码,所以也就不能使用。

怎么办呢,当然只能是截图啦。

# 获取浏览器截图
from PIL import Image
browser.get_screenshot_as_file("./screenshot.png")
# 验证码
kaptcha_pic = browser.find_element_by_xpath("//img[contains(@class,'code-img')]")
left = int(kaptcha_pic.location['x'])
top = int(kaptcha_pic.location['y'])
right = int(kaptcha_pic.location['x'] + kaptcha_pic.size['width'])
bottom = int(kaptcha_pic.location['y'] + kaptcha_pic.size['height'])
# 通过Image处理图像
im = Image.open('./screenshot.png')
im = im.crop((left, top, right, bottom))
im.save('./code.png')

拿到了验证码图片,破解拿到验证码字符串之后,剩下的就简单了:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(self.browser, 60)
# 等待验证码显示出来
wait.until(EC.presence_of_element_located((By.XPATH, "//img[contains(@class,'kaptcha-img')]")))
# 获取用户名输入框
user_name_input = self.browser.find_element_by_xpath("//input[@placeholder='请输入用户名']")
password_input = self.browser.find_element_by_xpath("//input[@placeholder='请输入密码']")
kaptcha_input = self.browser.find_element_by_xpath("//input[@placeholder='请输入验证码']")
submit_btn = self.browser.find_element_by_class_name("submit-btn")
user_name_input.send_keys("用户名")
password_input.send_keys("password")
kaptcha_input.send_keys("验证码")
submit_btn.click()
# 等待logo显示出来
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "logo")))

够简单吧。




微信或浏览器扫码阅读
用户评论 (共0条评论)

暂时还没有任何用户评论

总计 0 个记录,共 1 页。
亲,赐个留言吧!
captcha