利用代码自动登录12306官网是爬虫领域的经典行为,整个过程中的难点在于网站验证码的自动化突破,整个过程需要突破两个验证码的阻碍,一是文字选图,二是滑块。其中文字选图较为麻烦。但是还是有方法能够顺利进行网站的登录,代码一执行,直接会运行到登录后的界面。

首先需要实例化一个brower对象,用于驱动浏览器

browser = webdriver.Firefox(executable_path=r'D:\python\python安装\Scripts\geckodriver.exe')
browser.get('https://kyfw.12306.cn/otn/resources/login.html')
script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
browser.execute_script(script)

前两行就不说了,后两行的目的在于防止12306网站检测出我们是个爬虫程序,如果没有这两行,在后面通过滑动验证码时会通不过,让用户一直刷新,所以需要把它加上

我们是账号密码登录,需要点击账号登陆,操作如下

account_login = browser.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
account_login.click()

首先需要定位到这四个字所在的位置,利用xpath进行定位,之后进行点击

其次将自己的用户名和密码输入到下方的文本框中,操作如下

username = browser.find_element_by_id('J-userName')
username.send_keys('你的用户名')
password = browser.find_element_by_id('J-password')
password.send_keys('你的密码')

前面都比较简单,接下来突破文字识图验证才是整个过程的难点

这个验证码是需要识别出文字,在下面的图中进行点击,选中后才能点击登录,这就需要借助第三方平台超级鹰,它的使用请参考小编的上一篇文章,利用超级鹰突破验证码识别。

我们要做的就是将这个验证码的图片提交给从超级鹰平台上下载的代码,我们采用截图的方式对这个验证码进行截取,将获取验证码的方法封装成一个函数get_image()

seleium中有将整个网页截图的方法,我们将整个网页截图之后,如上图,利用id定位到验证码,以页面左上角为原点,用location的方法会得到验证码的x,y,利用size的方法会得到验证码的宽和高,单位都为像素。图中有两个绿色的点,我们用这两个点就可以利用PIL中的Image--crop方法截取此验证码,此函数代码如下:

def get_image(browser):browser.save_screenshot('screen_shot.png')#页面截图img_page = Image.open('screen_shot.png')img_element = browser.find_element_by_id('J-loginImg')location = img_element.locationprint(location)size = img_element.sizeprint(size)left = location['x'] * 1.5  #乘以1.5是因为电脑显示设置中  缩放比例设为了150%top = location['y'] * 1.5right = left + size['width'] * 1.5bottom = top + size['height'] * 1.5img_code = img_page.crop((left, top, right, bottom))img_code.save('verification.png')#验证码截图print(left, top, right, bottom)return

将页面的截图和裁剪后的验证码的截图分别保存在了代码的当前路径下,在这里需要注意的是,每个人的电脑对屏幕的缩放不一样

例如我的电脑是150%,在代码中同样需要对坐标的数字进行处理,这个因电脑而异,不处理是无法精确定位到需要的地方,截图会偏移

接下来需要把裁剪下来的验证码的图传入超级鹰,刚刚程序中已经将验证码的图保存下来了,直接将其上传即可,需要注意识别的类型为9005。直接把超级鹰的代码复制到程序中,然后调用即可,出入验证码和识别类型,观察返回字典的pic_str,这里面是我们需要点击的坐标(以验证码左上角为原点)

返回后,以上图为例,需要我们点击两个坐标的位置(395,108)和(304,201)

按照“|”将其分开,进行循环,横坐标设置为x,纵坐标设置为y,此时需要将x和y的值进行float浮点处理,除以电脑的缩放比例,否则实际点击的位置会偏移,如果电脑的缩放比例为100%,则忽略这一步

接下来就是模拟鼠标对上述坐标进行点击,此时需要用到ActionChains这个方法

这一阶段的代码如下

for i in location_code.split('|'):x = i.split(',')[0]x = float(x)x = x / 1.5y = i.split(',')[1]y = float(y)y = y / 1.5position = ActionChains(browser).move_to_element_with_offset(img_element, x, y)position.click().perform()time.sleep(0.5)

此时代码会模拟鼠标点击通过验证码需要点击的位置。

之后,就该点击登录按钮,先定位再点击。

到了最后一步,滑块验证,这个就简单了

找到这个滑块的元素,复制其xpath路径,向右偏移大概400个像素的位置即可,代码如下

box = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')#定位滑块
ActionChains(browser).click_and_hold(box).perform()#摁住不放
move = ActionChains(browser).drag_and_drop_by_offset(box, 400, 0)#定义向右移动
move.perform()#执行此动作

至此,整个登录过程就结束了

下面附上源码和运行视频

from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import requests
from hashlib import md5
import timedef get_image(browser):browser.save_screenshot('screen_shot.png')img_page = Image.open('screen_shot.png')img_element = browser.find_element_by_id('J-loginImg')location = img_element.locationprint(location)size = img_element.sizeprint(size)left = location['x'] * 1.5  #乘以1.5是因为电脑显示设置中  缩放比例设为了150%top = location['y'] * 1.5right = left + size['width'] * 1.5bottom = top + size['height'] * 1.5img_code = img_page.crop((left, top, right, bottom))img_code.save('verification.png')print(left, top, right, bottom)returnclass Chaojiying_Client(object):def __init__(self, username, password, soft_id):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)',}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()def chaojiying(img,imgtype):chaojiying = Chaojiying_Client(username,password,ID)im = open(img,'rb').read()return chaojiying.PostPic(im,imgtype)browser = webdriver.Firefox(executable_path=r'D:\python\python安装\Scripts\geckodriver.exe')
browser.get('https://kyfw.12306.cn/otn/resources/login.html')
script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
browser.execute_script(script)
browser.maximize_window()
time.sleep(0.2)
account_login = browser.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
account_login.click()
time.sleep(0.2)
username = browser.find_element_by_id('J-userName')
username.send_keys(你的12306账号)
password = browser.find_element_by_id('J-password')
password.send_keys(你的12306密码)get_image(browser)username= 你的超级鹰账号
password = 你的超级鹰密码
ID = 你的超级鹰软件IDresult = chaojiying('verification.png',9005)
print(result)
location_code = result['pic_str']
print(location_code)
img_element = browser.find_element_by_xpath('//*[@id="J-loginImg"]')for i in location_code.split('|'):x = i.split(',')[0]x = float(x)x = x / 1.5print('x:' ,x, type(x))y = i.split(',')[1]y = float(y)y = y / 1.5print('y:', y, type(y))# ActionChains(browser).move_to_element_with_offset(img_element, x, y).click().perform()position = ActionChains(browser).move_to_element_with_offset(img_element, x, y)position.click().perform()time.sleep(0.5)login_btn = browser.find_element_by_xpath('//*[@id="J-login"]')
login_btn.click()
time.sleep(0.5)
box = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')
ActionChains(browser).click_and_hold(box).perform()
move = ActionChains(browser).drag_and_drop_by_offset(box, 400, 0)
move.perform()

大家把代码中的83、85、90、91、92换成自己的账户即可

下面附上效果视频

QQ录屏20210718102147

python爬虫使用seleium+超级鹰+Image模块自动登录12306(附源码和登录视频)相关推荐

  1. 【爬虫实战项目】Python爬虫批量下载音乐飙升榜并保存本地(附源码)

    前言 今天给大家介绍的是Python爬虫批量下载音乐飙升榜并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是 ...

  2. 【爬虫实战项目】Python爬虫批量旅游景点信息数据并保存本地(附源码)

    前言 今天给大家介绍的是Python爬虫批量下载旅游景点信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样 ...

  3. python爬取网站教学视频_零基础Python爬取网页文章和图片详细教学(内附源码、教学视频)...

    Python爬虫,这个我相信对于很多人来说都不陌生! 今天小编给大家提供一份零基础Python爬取网页图片以及小说的代码并且详细的和大家讲解一下! 开发环境:版本Python3.6.2!(2版本会在2 ...

  4. Python爬虫教程:爬取王者荣耀全套皮肤【附源码】

    怎么获取全套皮肤?用钱买,或者用爬虫爬取下来~虽然后者不能穿.这个案例稍微复杂一点,但是一个非常值得学习的项目. 具体实现思路: 分析网页源代码结构 找到合适的入口 穷举访问并解析 爬取所有英雄所有皮 ...

  5. Python 实现图片格式转换,jpg\png\webp等,附源码

    Python 实现图片格式转换,jpg\png\webp等,附源码 需要使用 PIL库,但python 3是无法安装该库的,如果是python 3安装pillow库即可. 1.安装 python 2 ...

  6. python处理回显_Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...

  7. python3APP爬虫--爬取王者荣耀小姐姐cosplay照片(附源码)

    文章目录 一.絮叨 1.接上 2.启下 二.代码 三.查看数据 四.总结 一.絮叨 1.接上 自己挖的坑,自己填.上一篇python3APP爬虫–爬取王者荣耀英雄图片(附源码)爬取了王者荣耀英雄图片, ...

  8. python爬虫源码项目_32个Python爬虫实战项目,满足你的项目慌(带源码)

    写在前面 学习Python爬虫的小伙伴想成为爬虫行业的大牛么? 你想在网页上爬取你想要的数据不费吹灰之力么? 那么亲爱的小伙伴们肯定需要项目实战去磨练自己的技术,毕竟没有谁能随随便便成功! 小编前段时 ...

  9. 32个Python爬虫实战项目,满足你的项目慌(带源码)

    学习Python爬虫的小伙伴想成为爬虫行业的大牛么? 你想在网页上爬取你想要的数据不费吹灰之力么? 那么亲爱的小伙伴们肯定需要项目实战去磨练自己的技术,毕竟没有谁能随随便便成功! 小编前段时间精心总结 ...

  10. Python爬虫教程-爬取5K分辨率超清唯美壁纸源码

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

最新文章

  1. 一个资深投行女销售和低调IT创业男的故事
  2. 神经网络网络参数的取值问题
  3. 机器学习(part2)--线性方程组的列表达
  4. Error Handling in ASP.NET Core
  5. linux登录界面说明,Linux登录界面以及简单使用入门
  6. IIS经典模式和集成模式的区别
  7. 局域网共享工具_[9月17号]局域网环境下文件共享和打印机共享的系统工具软件 局域网共享精灵 V1.0...
  8. 高程拟合MATLAB二次曲面,GPS高程二次曲面拟合及其程序
  9. JT/T808校验码计算(按字节异或求和)
  10. Docker系列之一:在线安装docker和下载镜像
  11. 计算机系统的今后应用,计算机系统毕业论文范本(2)
  12. 【C++】在线IDE
  13. 最长上升子序列 CSU - 1047 ( LIS LCS )
  14. 网点分布图怎么做,用地图制作客户分布图
  15. 凭证 金蝶_5分钟学会金蝶软件凭证录入!
  16. imp-00003:oracle error 959 encountered
  17. java作业 实现模拟保皇开始的发牌环节
  18. 史上最全最新前端面试题(不定期更新,有问题欢迎评论区对线)
  19. flutter开发android部分页面,Flutter(Android 混合开发)
  20. 霍因科技Hi-ETA Hi-SEAHILL加速大数据管理 赋能信创生态建设

热门文章

  1. IR2103H桥驱动电路
  2. Java工作流引擎学习----JBPM(一)
  3. Logic Pro X for Mac(专业级音频制作软件)
  4. mysql数据库的设计工具_MySQL Workbench,专为MySQL设计的数据库建模工具
  5. 关于Windows勒索病毒以及445端口防护
  6. 笔记 || css字体word字体大小对照表
  7. netapp存储设备更换硬盘
  8. pdf编辑器如何在pdf上修改
  9. virtualxposed使用教程_无需Root也能使用Xposed框架 —— VirtualXposed v0.14.5
  10. 十进制进制法_进制转换方法(进制转换方法的口诀)