[Python爬虫]使用Selenium操作浏览器订购火车票
好久没更新Python相关的内容了,这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分
上节我们说了如何使用selenium打开网页做些简单操作
这节内容为操作浏览器自动订购12306火车票
开发环境
操作系统:windows 10
Python版本 :3.6
爬取网页模块:selenium
分析网页工具:xpath
关于Selenium
selenium 是一个Web自动测试的工具,可以用来操作一些浏览器Driver,例如Chrome,Firefox等,也可以使用一些headless的driver,例如Phantomjs
具体请参加官网:
http://selenium-python.readthedocs.io/
关于xpath
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
因此,对 XPath 的理解是很多高级 XML 应用的基础。
selenium可以使用xpath的形式来定位网页元素,我们可以通过开发者模式的来获取xpath路径,但是不推荐直接引用
详细教程查看如下网站
http://www.w3school.com.cn/xpath/index.asp
模块安装
pip3 install selenium
Chrome Driver 下载
这里我们下载Chrome driver
其他的driver见官网
http://selenium-python.readthedocs.io/installation.html#drivers
下载完成后可以放到系统环境变量中,如:
C:WindowsSystem32
https://sites.google.com/a/chromium.org/chromedriver/downloads
程序原理
代码介绍
1. import相关的模块
import selenium.webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
2. 调用Chrome
driver = selenium.webdriver.Chrome()
3. 定位用户名密码
find_element_by_id表示使用id属性进行查找input标签
username= driver.find_element_by_id('username')
password= driver.find_element_by_id('password')
4. 清除用户名密码输入框内容
username.clear()
password.clear()
5. 自动输入用户名密码
username.send_keys("username")
password.send_keys("password")
6. 判断是否登陆成功
7. 选择出发地,目的地,时间后点击查询
8. 填写需要订购的火车车次
多个车次使用列表形式,冒号后面位表格的ID属性值,不包括ticket_
tickets=['D3094:5l000D309460','G7024:51000d702454']
9.获取预定,二等座,无座的xpath
yd_path='//*[@id="ticket_'+path+'"]/td[13]/a'
edz_path='//*[@id="ticket_'+path+'"]/td[4]'
wz_path = '//*[@id="ticket_' + path + '"]/td[11]'
10. 判断是否可订购
该语句表示判断是否可点击,超时时间为10s
以及是否有票
11. 确认选座
执行结果
注意事项:
- 打开新的页面请使用selenium wait功能以使页面完全加载
- 最后提交的时候可能会需要再次输入用户名密码,输入即可
- 本脚本仅用于学习用途
源码位置:
源码请访问我的github主页
https://github.com/bsbforever/spider/blob/master/selenium_12306.py
- Dubbo详细介绍与安装使用过程
- 基础篇章:关于 React Native之 ActivityIndicator 组件的讲解
- 基础篇章:关于 React Native 之 KeyboardAvoidingView 组件的讲解
- 基础篇章:关于 React Native 之 Slider 组件的讲解
- Java9 中的 9 个新特性
- ELK 集群 + X-Pack + Redis 集群 + Nginx ,实时日志(数据)搜集和分析的监控系统,简单上手使用
- 基础篇章:关于 React Native 之 Modal 组件的讲解
- 搭建高吞吐量 Kafka 分布式发布订阅消息 集群
- 你真的会用Retrofit2吗?Retrofit2完全教程
- 线程管理之获取和设置线程信息
- 线程创建和运行
- CentOs7.3 安装 MySQL 5.7.19 二进制版本
- Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- 3.Linux用户权限管理之三(文件与权限的设定)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 以复现图表的方式来学习一篇文章
- 盘点 Python 10 大常用数据结构(上篇)
- (长文预警) 你还在烦工作中碰到的拖拽问题?一个框架jiejue
- 重磅 | 青藤与腾讯安全隆重举办容器安全平台新品战略合作发布会
- 如何使用强化学习玩21点?
- 这3个Scikit-learn的特征选择技术,能够有效的提高你的数据预处理能力
- 使用神经网络解决拼图游戏
- 用机器学习预测收益
- 一种基于深度学习的低成本细胞生物学研究方法
- 从零搭建Spring Boot脚手架(2):增加通用的功能
- Qt官方示例-K线图
- 一个快速构造GAN的教程:如何用pytorch构造DCGAN
- 从0到1开发测试平台(八)后端服务添加lombok第三方类库
- 【CSS】470- 是时候开始用 CSS 自定义属性了
- 一个安卓App,如何成为DuerOS 上的技能应用呢?