目标网站:古诗文网
目标网址:http://so.gushiwen.org/user/collect.aspx
任务要求:
(1)通过selenium的方式模拟该网站的登录,并成功输入用户名和密码;
(2)保存验证码图片,并使用输入式验证码识别的方式识别验证码的文字,获取后输入到输入框中,
(3)验证登录是否成功。
由于OCR库识别成功率较低,这里我门借助超级鹰打码平台(自选平台也可)。
超级鹰平台地址:http://www.chaojiying.com/
ps:注册账号,关注微信号送1000题分
连接超级鹰的代码,详情获取请看我的另一篇博客python验证码识别如何连接第三方平台-------超级鹰
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
# todo:更改点一
self.password = md5(password.encode("utf-8")).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
古诗文网登录代码如下:
PS:运行此代码时,应将电脑分辨率调为100%,否则会导致截取的验证码图片有偏差。
from selenium import webdriver
import time
base_url = 'http://so.gushiwen.org/user/collect.aspx'
browser = webdriver.Chrome()
browser.maximize_window()
browser.implicitly_wait(10)
browser.get(base_url)
# 登录页面截图
browser.save_screenshot("D:/pic.png")
# 获取图片验证码坐标
code_ele = browser.find_element_by_css_selector('#imgCode')
print("验证码的坐标为:", code_ele.location)
print("验证码的大小为:", code_ele.size)
# 图片4个点的坐标位置
x = code_ele.location['x']
y = code_ele.location['y']
right = code_ele.size['width']+x
down = code_ele.size['height']+y
image = Image.open('D:/pic.png')
# 截取验证码图片
code_image = image.crop((x,y,right,down))
code_image.save('D:/pic1.png')
# 登录超级平台
chaojiying = Chaojiying_Client('超级鹰账号', '密码', '905121')
im = open('D:/pic1.png', 'rb').read()
text = chaojiying.PostPic(im,2004)['pic_str']
print(text)
# 网页操作
username = browser.find_element_by_css_selector('#email').send_keys('古诗文网账号')
password = browser.find_element_by_css_selector('#pwd').send_keys('密码')
time.sleep(2)
# 找到验证码框
code = browser.find_element_by_css_selector('#code').send_keys(text)
time.sleep(2)
# 登录
submit = browser.find_element_by_css_selector('#denglu')
submit.click()
time.sleep(5)