失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python + selenium自动化工具 + 滑块验证码+点选验证码 实现模拟登录“中国铁路网12306”

Python + selenium自动化工具 + 滑块验证码+点选验证码 实现模拟登录“中国铁路网12306”

时间:2020-06-07 15:11:36

相关推荐

Python + selenium自动化工具 + 滑块验证码+点选验证码 实现模拟登录“中国铁路网12306”

文章目录

一、模拟登录“中国铁路网123061.引入库2.初始化3.将点选验证码图片,通过人工打码,返回目标像素位置(json格式)。4.点选验证码位置得到后,需要鼠标左击进行模拟人点击。5.点选验证码+滑块验证识别登录 总结


一、模拟登录“中国铁路网12306

由于12306的点选验证码机器很难识别,所以采用了人工打码平台-超级鹰;点击登录后出现的滑块验证码,用selenium.webdriver 中的ActionChains类拖动滑块。

超级鹰官网:/user/

1.引入库

下面是完成本次小项目需要引入的库,导入的时候如果爆红,说明编写错误或未安装库,安装的所有过程省略。

代码如下(示例):

#!/usr/bin/env python# coding:utf-8import requestsfrom PIL import Imagefrom io import BytesIOfrom hashlib import md5from selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.support.ui import WebDriverWaitimport time

2.初始化

包括:修改Webdriver的属性,绕过反爬检测;初始化登录超级鹰所需要的参数。

代码如下(示例):

class Login_kyfw(object):"""Python + selenium自动化工具 + 滑块验证码 + 点选验证码 + selenium识别绕过,实现模拟登录“中国铁路网12306”滑块验证码用selenium模拟人滑动,点选验证码则采用人工打码平台“超级鹰”-收费的。"""def __init__(self, username, password, soft_id):self.url = '/otn/resources/login.html'self.driver = webdriver.Chrome()self.wait = WebDriverWait(self.driver, 20)"修改webdriver属性值,绕过反爬检测"self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# self.script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'# self.driver.execute_script(self.script)self.username = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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)',}

3.将点选验证码图片,通过人工打码,返回目标像素位置(json格式)。

def PostPic(self, im, codetype):"""im: 图片字节,传入的点选验证码图片,通过人工打码得到目标像素(x,y)codetype: 题目类型 参考 /price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()

4.点选验证码位置得到后,需要鼠标左击进行模拟人点击。

def click_locxy(self,dr, x, y, left_click=True):'''dr:浏览器x:页面x坐标y:页面y坐标left_click:True为鼠标左键点击,否则为右键点击'''if left_click:ActionChains(dr).move_by_offset(x, y).click().perform()else:ActionChains(dr).move_by_offset(x, y).context_click().perform()ActionChains(dr).move_by_offset(-x, -y).perform() # 将鼠标位置恢复到移动前

5.点选验证码+滑块验证识别登录

def slip_login(self):"12306-点击【账号登录】,切换到登录页面"self.driver.get(self.url)self.driver.maximize_window()Click = self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')time.sleep(2)Click.click()input1 = self.driver.find_element_by_xpath('//*[@id="J-userName"]')input2 = self.driver.find_element_by_xpath('//*[@id="J-password"]')input1.send_keys('12306用户名')input2.send_keys('12306密码')"""截取12306点选验证码图片,传给人工打码平台,返回一个需要点选的目标定位列表根据定位,用click_locxy 模拟点击。"""time.sleep(3)img = self.driver.find_element_by_id('J-loginImg')locate = img.locationsize = img.sizescreenshot = self.driver.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))top, bottom, left, right = locate['y'], locate['y'] + size['height'], locate['x'], locate['x'] + size['width']img = screenshot.crop((left, top, right, bottom))img.save('img.png')im = open('img.png', 'rb').read()# 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//pic_str = self.PostPic(im, 9004)pic_str = pic_str['pic_str']pic_str = pic_str.split('|')pic_str = [i.split(',') for i in pic_str]print(pic_str) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()"点击验证码"self.driver.maximize_window()for i in range(len(pic_str)):self.click_locxy(self.driver, int(pic_str[i][0])+locate['x'], int(pic_str[i][1])+locate['y'])print((int(pic_str[i][0])+locate['x'], int(pic_str[i][1])+locate['y']))self.driver.find_element_by_xpath('//*[@id="J-login"]').click()"拖动滑块完成最后登录"time.sleep(1)slip = self.driver.find_element_by_id('nc_1_n1z')slip_local = slip.locationprint(slip_local)self.click_locxy(self.driver, slip_local['x'] + 2, 0)ActionChains(self.driver).click_and_hold(on_element=slip).perform()ActionChains(self.driver).move_by_offset(xoffset=1050, yoffset=0).perform()time.sleep(5)self.driver.quit()if __name__ == '__main__':Kyfw12306 = Login_kyfw('超级鹰用户名', '超级鹰密码', '96001')# 用户中心>>软件ID 生成一个替换 96001Kyfw12306.slip_login()


总结

文章写的优点仓促,后再进行改进,可以在下方留言哦~!

如果觉得《Python + selenium自动化工具 + 滑块验证码+点选验证码 实现模拟登录“中国铁路网12306”》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。