1. # login12306_02
  2. # 图像识别涉及到深度学习,这里直接将验证码识别任务发送到大佬的验证码解析地址,不过现在已经失效了,程序跑到这会报错。
  3. # 用户名和密码存储在本地工作目录中的 username_password_12306.txt文件中。
  4. from selenium import webdriver
  5. from selenium.webdriver import ActionChains
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.support.wait import WebDriverWait
  8. from selenium.webdriver.support import expected_conditions as EC
  9. import base64
  10. import re
  11. import time
  12. import requests
  13. class Login(object):
  14. def __init__(self, driver):
  15. self.driver = driver
  16. # 图片验证码坐标
  17. self.coordinate = [[-105, -20], [-35, -20], [40, -20], [110, -20], [-105, 50], [-35, 50], [40, 50], [110, 50]]
  18. def get_login_info(self):
  19. with open('username_password_12306.txt', 'r') as file_obj:
  20. lines = file_obj.readlines()
  21. username = lines[0].split()
  22. password = lines[1].split()
  23. return [username, password]
  24. def login(self):
  25. # 读取文件,获取账号和密码
  26. username = self.get_login_info()[0]
  27. password = self.get_login_info()[1]
  28. # 12306登陆页面
  29. login_url = "https://kyfw.12306.cn/otn/resources/login.html"
  30. # 设置浏览器长宽
  31. self.driver.set_window_size(1200, 900)
  32. # 打开登陆页面
  33. self.driver.get(login_url)
  34. # 找到账号登陆按钮 (有两种登陆方式,一种是扫码登录,一种是账号登录)。
  35. account = self.driver.find_element_by_class_name("login-hd-account")
  36. # 点击按钮
  37. account.click()
  38. # 找到用户名输入框
  39. userName = self.driver.find_element_by_id("J-userName")
  40. # 输入用户名
  41. userName.send_keys(username)
  42. # 找到密码输入框
  43. passWord = self.driver.find_element_by_id("J-password")
  44. # 输入密码
  45. passWord.send_keys(password)
  46. def getVerifyImage(self):
  47. try:
  48. # 找到图片验证码标签
  49. img_element = WebDriverWait(self.driver, 100).until(
  50. EC.presence_of_element_located((By.ID, "J-loginImg"))
  51. )
  52. except Exception as e:
  53. print(u"验证码未加载,请检查您的网络设置!")
  54. # 获取图片验证码的src属性,就是图片base64加密后的数据
  55. base64_str = img_element.get_attribute("src").split(",")[-1]
  56. # base64解码得到图片的数据
  57. imgdata = base64.b64decode(base64_str)
  58. # 存入img.jpg
  59. with open('img.jpg', 'wb') as file:
  60. file.write(imgdata)
  61. self.img_element = img_element
  62. def getVerifyResult(self):
  63. '''解析返回结果,将坐标存放到列表里'''
  64. # 12306验证码识别网址
  65. url = "http://littlebigluo.qicp.net:47720/" # 目前,这个网址被封了,无法使用
  66. # 发送post请求把图片数据带上
  67. response = requests.request("POST", url, data={"type": "1"}, files={'pic_xxfile': open('img.jpg', 'rb')})
  68. result = []
  69. print(response.text)
  70. # 返回识别结果
  71. for i in re.findall("<B>(.*)</B>", response.text)[0].split(" "):
  72. result.append(int(i) - 1)
  73. self.result = result
  74. print(result)
  75. def moveAndClick(self):
  76. # 根据目标验证码的位置,点击相应的图片。
  77. try:
  78. # 创建鼠标对象
  79. Action = ActionChains(self.driver)
  80. for i in self.result:
  81. # 根据获取的结果取坐标选择图片并点击
  82. Action.move_to_element(self.img_element).move_by_offset(self.coordinate[i][0],
  83. self.coordinate[i][1]).click()
  84. Action.perform()
  85. except Exception as e:
  86. print(e)
  87. def submit(self):
  88. # 点击登陆按钮
  89. self.driver.find_element_by_id("J-login").click()
  90. if __name__ == '__main__':
  91. driver=webdriver.Firefox()
  92. login = Login(driver)
  93. login.login()
  94. time.sleep(3)
  95. login.getVerifyImage()
  96. time.sleep(1)
  97. login.getVerifyResult()
  98. time.sleep(1)
  99. login.moveAndClick()
  100. time.sleep(1)
  101. login.submit()
  102. time.sleep(10)
  103. # driver.close()
  104. # driver.quit()

参考资料:

https://www.52pojie.cn/thread-1048861-1-1.html

Spider--实战--selenium_12306的更多相关文章

  1. 用Spider引擎解决数据库垂直和水平拆分的问题

    作者介绍 张秀云,网名飞鸿无痕,现任职于腾讯,负责腾讯金融数据库的运维和优化工作.2007年开始从事运维方面的工作,经历过网络管理员.Linux运维工程师.DBA.分布式存储运维等多个IT职位.对Li ...

  2. Python爬虫实战(3):安居客房产经纪人信息采集

    1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的“独 ...

  3. 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息

    简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ...

  4. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

  5. 汽车之家店铺数据抓取 DotnetSpider实战[一]

    一.背景 春节也不能闲着,一直想学一下爬虫怎么玩,网上搜了一大堆,大多都是Python的,大家也比较活跃,文章也比较多,找了一圈,发现园子里面有个大神开发了一个DotNetSpider的开源库,很值得 ...

  6. 芝麻HTTP:Python爬虫实战之抓取淘宝MM照片

    本篇目标 1.抓取淘宝MM的姓名,头像,年龄 2.抓取每一个MM的资料简介以及写真图片 3.把每一个MM的写真图片按照文件夹保存到本地 4.熟悉文件保存的过程 1.URL的格式 在这里我们用到的URL ...

  7. 汽车之家店铺商品详情数据抓取 DotnetSpider实战[二]

    一.迟到的下期预告 自从上一篇文章发布到现在,大约差不多有3个月的样子,其实一直想把这个实战入门系列的教程写完,一个是为了支持DotnetSpider,二个是为了.Net 社区发展献出一份绵薄之力,这 ...

  8. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

  9. 汽车之家汽车品牌Logo信息抓取 DotnetSpider实战[三]

    一.正题前的唠叨 第一篇实战博客,阅读量1000+,第二篇,阅读量200+,两篇文章相差近5倍,这个差异真的令我很费劲,截止今天,我一直在思考为什么会有这么大的差距,是因为干货变少了,还是什么原因,一 ...

  10. shell编程企业级实战(2)

    Vim配置文件.vimrc vim配置文件 if 条件语句 if是最常见的条件判断语句 例1:如果不存在/backup目录就创建. [root@web-01 /server/tools]# vim 0 ...

随机推荐

  1. (SpringBoot-Jpa)使用Idea数据库自动脚本Generate POJOS生成 Entity对象,

    因:使用SpringBoot -jpa,需要手动配置Entity 但是如果你的表中有很多属性,或者有很多表怎么办?? 每个手动写? 还是用mybatis.写mapper??? 解决:使用idea自动工 ...

  2. 多测师讲解_007 hashlib练习

    #Hash,译做"散列",也有直接音译为"哈希"的.把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值.该算法就是哈希函 ...

  3. day67:Vue:es6基本语法&vue.js基本使用&vue指令系统

    目录 Vue前戏:es6的基本语法 1.es6中的let特点 1.1.局部作用域 1.2.不存在变量提升 1.3.不能重复声明 1.4.let声明的全局变量不从属于window对象,var声明的全局变 ...

  4. 【机器学习 Azure Machine Learning】Azure Machine Learning 访问SQL Server 无法写入问题 (使用微软Python AML Core SDK)

    问题情形 使用Python SDK在连接到数据库后,连接数据库获取数据成功,但是在Pandas中用 to_sql 反写会数据库时候报错.错误信息为:ProgrammingError: ('42000' ...

  5. Linux命令行history

    概述 当执行命令后,系统默认会在内存记录执行过的命令 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history 登录shell时,会读取命令历史文件中记录下的命令加 ...

  6. git学习(十一) idea git pull 解决冲突

    测试如下: 先将远程的代码修改,之后更新: 之后将工作区修改的代码(这里修改的代码跟远程修改的位置一样)提交到本地,之后拉取远程的代码,会发现有冲突: Accept Yours 就是直接选取本地的代码 ...

  7. java 常用快捷键及命令积累

    ctl + shift + o--->导入所需包,删掉没有被引用的包 ctl + / --->添加多行注释 ctl + \--->删除多行注释

  8. Mac 搭建 Redis 集群

    date: 2020-09-24 16:24:00 updated: 2020-09-24 17:30:00 Mac 搭建 Redis 集群 参考文档 摘要 安装docker brew cask in ...

  9. Mysql JDBC-mysql-Driver queryTimeout分析

    Mysql jdbc的queryTimeout分析 Mysql的jdbc-driver com.mysql.jdbc.Driver 设置queryTimeout方法 com.mysql.jdbc.St ...

  10. vue-cli2.0创建项目步骤

    Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs三国鼎立,我不是职业前端,做过Vue,了解了一下React,听说过Angluar.我只能这么说,我来晚了,没经 ...