模拟登陆12306
1.封装在线打码平台--超级鹰
import requests from hashlib import md5 class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).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()
2.
def get_img_text(imgPath): chaojiying = Chaojiying_Client('bobo328410948', 'bobo328410948', '899370')#用户中心>>软件ID 生成一个替换 96001 im = open(imgPath, 'rb').read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要// return chaojiying.PostPic(im, 9004)['pic_str']
3.对12306进行模拟登录:验证码图片必须通过裁剪图片的形式获取
3.1.浏览器实例化 bro = webdriver.Chrome(executable_path='./chromedriver.exe')
3.2.发起请求 bro.get('https://kyfw.12306.cn/otn/login/init')
3.3.输入用户名和密码
3.4.标签定位验证图片 code_img_ele=bro.find_element_by_xpath('//*@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
3.5.验证码 左上角坐标location location = code_img_ele.location
3.6.验证码 长度size size = code_img_ele.size
3.7.指定矩形区域
rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
3.8.截图整张页面save_screenshot()
3.9.指定区域截图crop
3.10.调用超级鹰对验证码进行识别
3.11.将x,y变成[[x,y]]
3.12.基于动作链,将x,y的参照系转移到指定的标签中 move_to_element_with_offse
3.13.点击登录
from selenium import webdriver from lxml import etree from selenium.webdriver import ActionChains from PIL import Image from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://kyfw.12306.cn/otn/login/init') sleep(2) bro.find_element_by_id('username').send_keys('用户名') bro.find_element_by_id('password').send_keys('密码') #想要获取验证码图片左上角和右下角亮点坐标,通过这亮点坐标可以形成一个裁剪的矩形区域 code_img_ele = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') location = code_img_ele.location # 验证码图片左上角坐标 size = code_img_ele.size #验证码图片的长宽 #指定矩形区域 rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
#截图 bro.save_screenshot('aa.png')
#在指定区域截图crop i = Image.open('./aa.png') code_img_name = 'code.png' frame = i.crop(rangle) frame.save(code_img_name)
#进行验证码的识别,调用超级鹰 result = get_img_text(code_img_name) print(result) # x1,y1|x2,y2|x3,y3 x,y #[[x1,y1],[x2,y2],[x3,y3]] [[x,y]]
#将x,y变成[[x,y]] all_list = [] if '|' in result: list_1 = result.split('|') count_1 = len(list_1) for i in range(count_1): xy_list = [] x = int(list_1[i].split(',')[0]) y = int(list_1[i].split(',')[1]) xy_list.append(x) xy_list.append(y) all_list.append(xy_list) else: x = int(result.split(',')[0]) y = int(result.split(',')[1]) xy_list = [] xy_list.append(x) xy_list.append(y) all_list.append(xy_list)
for l in all_list: #x,y就是需要点击的某一个点的坐标 x = l[0] y = l[1] #move_to_element_with_offset就是将x,y的参照系转移到指定的标签中 #每一个动作连的操作都必须基于一个单独的动作连 ActionChains(bro).move_to_element_with_offset(code_img_ele,x,y).click().perform() sleep(2) bro.find_element_by_id('loginSub').click() sleep(10) bro.quit()