selenium+超级鹰实现模拟登录12306
最近迷上了用selenium去登陆各大网站,别说selenium真挺好用,可以轻松搞定ajax动态加载的网页,不用很费劲的去抓包查找。咳咳…跑题了,回归正题。
这次用selenium去登录12306网站,听说比较困难。我就去试了试,发现它的验证码实在是那啥…就是这样的。听头疼的。
我来说说主要的代码编写吧。
过程:
用我们的开发者工具定位到输入账号和密码的窗口,找到并send_keys
driver.find_element_by_id('username').send_keys('用户名') time.sleep(0.5) driver.find_element_by_id('password').send_keys('密码')
然后复杂的过程就来了。我们想要得到验证码的图片。但是头疼的是,图片是再变化的。我们请求一次,就变化一次,不像其他普通网站一样不会变化,直接保存图片就行了。但是这是12306诶,哪这么轻松。想了想,我决定把整张页面截屏保存下来,然后对验证码区域裁剪下来,就可以保证一致了。
# 将页面进行截图并保存 driver.save_screenshot('12306登录页面截图.png') # 确定验证码左上角和右下角的坐标 code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') location = code_img.location # 确定验证码图片左上角的坐标 print('location:', location) size = code_img.size # 确定验证码图片的长和宽 print('size:', size) rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']), int(location['y']) + int(size['height'])) print('rangle:', rangle) i = Image.open('12306页面截图.png') # 对指定区域裁剪 code_pic = i.crop(rangle) file_name = 'code_pic.png' code_pic.save(file_name) time.sleep(2) print('验证码图片保存成功!!')
我们识别验证码用的是超级鹰,具体如何使用可以去查一查。验证码有可能需要我们点击多个,所以通过打码平台会得到多个坐标,就比如这种。有两个日历,需要点击两次,通过超级鹰就会得到两个坐标。如下图。我们发现有两个坐标会有一个“|”,有三个坐标就有两个“|”,所以我们就把他们split下,让每个坐标嵌套再一个列表里。此过程代码如下:
# 识别验证坐标 chaojiying = Chaojiying_Client('用户账号', '密码', '开发者账号') # 用户中心>>软件ID 生成一个替换 96001 im = open('code_pic.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// result = chaojiying.PostPic(im, 9004)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() all_list = [] # 存储被点击的坐标 if '|' in result: list1 = result.split('|') xy_list = [] count1 = len(list1) for i in list1: x = int(list1[i].split(',')[0]) xy_list.append(x) y = int(list1[i].split(',')[1]) xy_list.append(y) all_list.append(xy_list) else: xy_list = [] x = int(result.split(',')[0]) xy_list.append(x) y = int(result.split(',')[1]) xy_list.append(y) all_list.append(xy_list) print(all_list)
最后嘛,我们得到了验证码的坐标,当然就去点击啦。但是,这个坐标是相对于验证码的图片的坐标,我们必须用ActionChains来移动一下动作链的位置。把他移动到验证码图片的location。,然后点击就ok了。此步骤的代码如下:
# 循环遍历点击图片 for i in all_list: x = i[0] y = i[1] action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform() time.sleep(1) driver.find_element_by_id('loginSub').click()
最后来看看全部代码吧!!
这个代码是超级鹰提供的接口。我封装成一个类了。
#!/usr/bin/env python # coding:utf-8 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()
下面是自己写的,也就六七十行。
from selenium import webdriver from chaojiying_Python.chaojiying import Chaojiying_Client import time from PIL import Image from selenium.webdriver import ActionChains from selenium.webdriver.chrome.options import Options # 实现无可视化界面的操作 # chrome_options = Options() # chrome_options.add_argument('--headless') # chrome_options.add_argument('--disable-gpu') driver = webdriver.Chrome('D:\software\studySoftware\chromedriver_win32\chromedriver.exe') driver.get('https://kyfw.12306.cn/otn/login/init') # driver.maximize_window() time.sleep(1) driver.find_element_by_id('username').send_keys('用户名') time.sleep(0.5) driver.find_element_by_id('password').send_keys('密码') # 将页面进行截图并保存 driver.save_screenshot('12306登录页面截图.png') # 确定验证码左上角和右下角的坐标 code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') location = code_img.location # 确定验证码图片左上角的坐标 print('location:', location) size = code_img.size # 确定验证码图片的长和宽 print('size:', size) rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']), int(location['y']) + int(size['height'])) print('rangle:', rangle) i = Image.open('12306页面截图.png') # 对指定区域裁剪 code_pic = i.crop(rangle) file_name = 'code_pic.png' code_pic.save(file_name) time.sleep(2) print('验证码图片保存成功!!') # 识别验证坐标 chaojiying = Chaojiying_Client('用户账号', '密码', '开发者账号') # 用户中心>>软件ID 生成一个替换 96001 im = open('code_pic.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// result = chaojiying.PostPic(im, 9004)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() all_list = [] # 存储被点击的坐标 if '|' in result: list1 = result.split('|') xy_list = [] count1 = len(list1) for i in list1: x = int(list1[i].split(',')[0]) xy_list.append(x) y = int(list1[i].split(',')[1]) xy_list.append(y) all_list.append(xy_list) else: xy_list = [] x = int(result.split(',')[0]) xy_list.append(x) y = int(result.split(',')[1]) xy_list.append(y) all_list.append(xy_list) print(all_list) # 循环遍历点击图片 for i in all_list: x = i[0] y = i[1] action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform() time.sleep(1) driver.find_element_by_id('loginSub').click()
到此这篇关于selenium+超级鹰实现模拟登录12306的文章就介绍到这了,更多相关selenium 模拟登录12306内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了selenium 反爬虫之跳过淘宝滑块验证功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-27
- 这篇文章主要介绍了Python爬虫之Selenium实现关闭浏览器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-04
c# Selenium爬取数据时防止webdriver封爬虫的方法
这篇文章主要介绍了c# Selenium爬取数据时防止webdriver封爬虫的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-15- 这篇文章主要为大家介绍了python自动化测试selenium执行js脚本的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-11-13
- 在本篇文章里小编给大家整理的是一篇关于Python Selenium操作Cookie的实例方法,有需要的朋友们可以学习参考下。...2021-02-28
- 这篇文章主要为大家介绍了在python编程学习中如何使用selenium来编写测试用例,文中给出了详细的测试用例代码,有需要的朋友可以借鉴参考下...2021-10-09
详解Python 使用 selenium 进行自动化测试或者协助日常工作
这篇文章主要介绍了Python 使用 selenium 进行自动化测试 或者协助日常工作,我们可以使用 selenium 来帮助我们进行自动化的 Web 测试,也可以通过 selenium 操作浏览器做一些重复的,简单的事情,来减轻我们的工作...2021-09-30- 这篇文章主要介绍了C#使用Selenium的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
Python selenium 自动化脚本打包成一个exe文件(推荐)
这篇文章主要介绍了Python selenium 自动化脚本打包成一个exe文件,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-27- Cookie内记录用户名和密码(加密)信息,只要请求时服务器收到Cookie,识别成功,默认为已登陆,今天通过本文给大家分享Selenium对Cookie的操作方法,感兴趣的朋友一起看看吧...2021-07-09
- 今天带大家学习怎么用python selenium实现自动化测试,文中有非常详细的介绍及代码示例,对正在学习python的小伙伴们很有帮助,需要的朋友可以参考下...2021-05-28
Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG
这篇文章主要介绍了Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG的相关资料,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-30python3.8.1+selenium实现登录滑块验证功能
这篇文章主要介绍了python3.8.1+selenium解决登录滑块验证的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-22Python selenium使用autoIT上传附件过程详解
这篇文章主要介绍了Python selenium使用autoIT上传附件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-27- 这篇文章主要介绍了selenium 多窗口切换的实现(windows),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-22
- 这篇文章主要介绍了selenium+超级鹰实现模拟登录12306,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-25
python自动化测试selenium定位frame及iframe示例
这篇文章主要为大家介绍了python自动化测试selenium定位frame及iframe示例的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-11-13- 这篇文章主要介绍了C# 利用Selenium实现浏览器自动化操作,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要给大家介绍了关于scrapy利用selenium爬取豆瓣阅读的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-21
- 这篇文章主要介绍了基于python+selenium的二次封装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-30