1.EC判断页面是否加载成功
from selenium import webdriver
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
# 全局定义注册页面地址
register_url = "http://www.5itest.cn/register"
# 创建 driver 对象
driver = webdriver.Chrome()
driver.get(url=register_url)
# 第一种延时操作,主动延时
# 加载 url 等待 5 秒
time.sleep(5)
# 判断是否进入了用户注册页:
# 通过title是否加载成功,来判断注册页面是否加载成功了,下面的打印结果说明了该对象存在于内存对象中也就是title加载成功了
# <selenium.webdriver.support.expected_conditions.title_contains object at 0x00000237FE954E48>
print(EC.title_contains("注册"))
# 另一种延时操作,比time.sleep更优化一些,检查注册邮箱是否被加载出来,
service_agreement = driver.find_element_by_id("register_email")
locator = (By.ID, "register_email")
# 下面的打印结果说明了该对象存在于内存对象中也就是加载成功了
# <selenium.webdriver.remote.webelement.WebElement (session="ef6eb689955b964079ccd8bc565d59a5", element="574ba31b-0ff0-4b67-853b-3680eb751fe9")>
print(WebDriverWait(driver, 5).until(EC.visibility_of_element_located(locator)))
# 执行完,关闭浏览器(否则一直加载驱动,导致执行环境内存被驱动耗尽)
driver.close()
2. 元素定位及填写
可以看到元素定位有多种方式,比较方便的是使用xpath,用法也简单,选中要定位的那一行右键copy,然后copy_xpath就行了。
下面尝试用几种方法定位:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
register_url = "http://www.5itest.cn/register"
driver = webdriver.Chrome()
driver.get(url=register_url)
captcha_code = driver.find_element_by_xpath('//*[@id="captcha_code"]')
captcha_code.send_keys('q2hs')
print(captcha_code.get_attribute("placeholder"))
3. 随机生成测试数据
import random
for i in range(5):
register_testMail = ''.join(random.sample('123456789abcdef', 8)) + "@163.com"
print(register_testMail)
for i in range(5):
register_testUsername = ''.join(random.sample('abcdefghijk', 5))
print(register_testUsername)
'''
d3c4f72a@163.com
4aedf158@163.com
7d2ecba3@163.com
6d137fab@163.com
65b834e2@163.com
bdgfa
chbkj
ejifg
bfjeh
bgjfc
'''
4. 精准截取验证码图片的思路
以这个网站:http://www.5itest.cn/register 为例,抓包发现验证码图片url虽然不变,但每次请求返回来的都不一样,这就意味着我们用url获取图片再识别就没有效果,所以我们就另辟蹊径,直接截图定位把它抠出来再识别:
import time
from PIL import Image
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
driver.maximize_window()
time.sleep(5)
driver.save_screenshot('./images/big.png')
# capch = driver.find_element_by_xpath('//*[@id="getcode_num"]')
capch = driver.find_element_by_id('getcode_num')
print(capch.location)
left = capch.location['x']
top = capch.location['y']
right = capch.size['width']+ left
low = capch.size['height'] + top
im = Image.open('./images/big.png')
# img = im.crop((left,top,right,low)) # 本来应该是这样大小,不知道时候跟系统有关,我的是win10系统必须乘以1.25才可
img = im.crop((left*1.25,top*1.25,right*1.25,low*1.25))
img.save('./images/code.png')
效果:
5. 图片验证码的识别解决方案
-
- 规则的,简单的可以用 pytesseract进行识别
可以参考我这篇文章学习: python实现简单的验证码识别 -
- 复杂的,可以借助打码平台
怎么个复杂法,比如以前的铁路12306官网登陆,给你一个名词,然后让你从6张图里选出两张和该名词相对应的,现在还好,已经整成滑块的了,还有一些网站的验证码是计算题,或者智能问答题之类的,这就比较不讲武德了, 打码平台有很多,百度一下就知道,比如云打码、超级鹰等打码平台,这种专业的平台都有针对各种各样的验证码,看一下超级鹰的:
用法也很简单,官网都有代码示例,这种打码平台后台对接的肯定是人工,所以它是要收费的,1块钱1000题分,咳咳,果然是充钱才能变强哈!
-
- 用机器学习训练字体库
可以用TensorFlow或者Pytorch自己训练模型,这个对没有接触过机器学习的朋友就比较有难度了,对数学知识要求比较高,想做这个的可以先试着去了解一下,这种方式耗时比上面两种更长,但做好了绝对让你成就感爆棚,收获满满的哈。
好了,到这里也该跟大家说再见了,创作不易,如果本文对你有用,请给俺点个赞吧,虽然我并不会因此获利,但这真的是对我的肯定与鼓舞,欢迎收藏加点赞哈。
山野千里,只要在路上,内心就满是欢喜,继续坚持,继续加油啊!!!
|