# login12306_02
# 图像识别涉及到深度学习,这里直接将验证码识别任务发送到大佬的验证码解析地址,不过现在已经失效了,程序跑到这会报错。
# 用户名和密码存储在本地工作目录中的 username_password_12306.txt文件中。 from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import base64
import re
import time
import requests class Login(object):
def __init__(self, driver):
self.driver = driver
# 图片验证码坐标
self.coordinate = [[-105, -20], [-35, -20], [40, -20], [110, -20], [-105, 50], [-35, 50], [40, 50], [110, 50]] def get_login_info(self):
with open('username_password_12306.txt', 'r') as file_obj:
lines = file_obj.readlines()
username = lines[0].split()
password = lines[1].split()
return [username, password] def login(self):
# 读取文件,获取账号和密码
username = self.get_login_info()[0]
password = self.get_login_info()[1]
# 12306登陆页面
login_url = "https://kyfw.12306.cn/otn/resources/login.html"
# 设置浏览器长宽
self.driver.set_window_size(1200, 900)
# 打开登陆页面
self.driver.get(login_url)
# 找到账号登陆按钮 (有两种登陆方式,一种是扫码登录,一种是账号登录)。
account = self.driver.find_element_by_class_name("login-hd-account")
# 点击按钮
account.click()
# 找到用户名输入框
userName = self.driver.find_element_by_id("J-userName")
# 输入用户名
userName.send_keys(username)
# 找到密码输入框
passWord = self.driver.find_element_by_id("J-password")
# 输入密码
passWord.send_keys(password) def getVerifyImage(self):
try:
# 找到图片验证码标签
img_element = WebDriverWait(self.driver, 100).until(
EC.presence_of_element_located((By.ID, "J-loginImg"))
) except Exception as e:
print(u"验证码未加载,请检查您的网络设置!")
# 获取图片验证码的src属性,就是图片base64加密后的数据
base64_str = img_element.get_attribute("src").split(",")[-1]
# base64解码得到图片的数据
imgdata = base64.b64decode(base64_str)
# 存入img.jpg
with open('img.jpg', 'wb') as file:
file.write(imgdata)
self.img_element = img_element def getVerifyResult(self):
'''解析返回结果,将坐标存放到列表里'''
# 12306验证码识别网址
url = "http://littlebigluo.qicp.net:47720/" # 目前,这个网址被封了,无法使用
# 发送post请求把图片数据带上
response = requests.request("POST", url, data={"type": "1"}, files={'pic_xxfile': open('img.jpg', 'rb')})
result = []
print(response.text)
# 返回识别结果
for i in re.findall("<B>(.*)</B>", response.text)[0].split(" "):
result.append(int(i) - 1)
self.result = result
print(result) def moveAndClick(self):
# 根据目标验证码的位置,点击相应的图片。
try:
# 创建鼠标对象
Action = ActionChains(self.driver)
for i in self.result:
# 根据获取的结果取坐标选择图片并点击
Action.move_to_element(self.img_element).move_by_offset(self.coordinate[i][0],
self.coordinate[i][1]).click()
Action.perform()
except Exception as e:
print(e) def submit(self):
# 点击登陆按钮
self.driver.find_element_by_id("J-login").click() if __name__ == '__main__':
driver=webdriver.Firefox()
login = Login(driver)
login.login()
time.sleep(3)
login.getVerifyImage()
time.sleep(1)
login.getVerifyResult()
time.sleep(1)
login.moveAndClick()
time.sleep(1)
login.submit()
time.sleep(10)
# driver.close()
# 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. java安全编码指南之:输入注入injection

    目录 简介 SQL注入 java中的SQL注入 使用PreparedStatement XML中的SQL注入 XML注入的java代码 简介 注入问题是安全中一个非常常见的问题,今天我们来探讨一下ja ...

  2. Sqlite嵌入式数据库讲解

    在计算机系统中,保存数据的方式一般有两种:1. 普通文件方式2. 数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由3个部分构成1. 数据库2. 数据 ...

  3. java流程控制学习

    Java流程控制 计算的步骤就是算法. 1.用户交互Scanner next()不能得到带有空格的字符串.[它是以空格为结束符]nextline()可以,[它是以回车为结束符] 2.顺序结构 从上到下 ...

  4. RLP序列化算法

    RLP RLP(Recursive Length Prefix)递归长度前缀编码,是由以太坊提出的序列化/反序列化标准,相比json格式体积更小,相比protobuf对多语言的支持更强. RLP将数据 ...

  5. 经验分享:计算机 web 浏览器——访问剪切板图片

      有时候,我们希望能访问用户的剪切板,来实现一些方便用户的功能:但是另一方面,剪切板里的数据对用户来说又是非常隐私的,所以浏览器在获取信息方面有安全限制,同时也提供访问接口. 当我们需要实现在富文本 ...

  6. nginx优化:配置gzip压缩页面提高访问速度(nginx1.18.0)

    一,为什么nginx要使用gzip 1,压缩的作用: 页面使用gzip压缩之后, 页面大小可以压缩到原来的1/7左右, 传输速度和页面打开时间都可以大幅度提高, 有利于用户访问页面体验的提升 2,Ng ...

  7. centos8平台安装ansible2.9

    一,ansible的用途: ansible是基于python开发的自动化运维工具, 它基于SSH远程连接服务, 可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等多个运维功能 因为基于s ...

  8. php+nginx改为socket

    使用socket方式连接Nginx优化php-fpm性能 Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domain socket?-- 维基 ...

  9. Mosquitto服务器的日志分析

    启动Mosquitto后,我们可以看到Mosquitto的启动日志: 1515307521: mosquitto version 1.4.12 (build date 2017-06-01 13:03 ...

  10. Python之包的相关

    包的产生: 由于模块不断更新,越写越大,仅用单个py文件会使模块逻辑不够清晰,所以需要将模块的不同功能放入不同的py文件,然后将所有py文件放在一个目录内,这个目录就是包 包就是一个包含用__init ...