12306抢票
购票流程
- 1.打开12306网站https://www.12306.cn/index/
- 2.登录(扫码登录,前提:手机下载12306APP)
- 3.进入到个人主页https://kyfw.12306.cn/otn/view/index.html
- 4.进入购票链接https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc
- 录入 出发地
- 录入 目的地
- 录入 出发时间
- 点击查询
- 选择要购买的车次
- 选择要购买的车次,选择坐席
- 如果有票,点击预定
- 5.选择乘车人,席别
- 6.提交订单
一、登录功能
需求:
- 1.半自动化实现
- 2.selenium打开浏览器,手机扫码登录
- 3.登录成功后进入个人主页
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait #显示等待
from selenium.webdriver.support import expected_conditions as ec #显示等待的条件
'''在类之外构造浏览器,避免其使用寿命随类的完成而消失'''
driver = webdriver.Chrome() #创建谷歌浏览器对象
class TrainSpider(object):
#定义类属性
login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
profile_url = 'https://kyfw.12306.cn/otn/view/index.html' #个人主页网址
#定义init初始化方法
def __init__(self,from_station,to_station,train_date):
self.from_station = from_station
self.to_station = to_station
self.train_date = train_date
#登录的方法
def login(self):
#打开登录的页面
driver.get(self.login_url)
WebDriverWait(driver,1000).until(
ec.url_to_be(self.profile_url) #等待直到登录URL跳转到个人中心的URL
)
print('登陆成功')
#负责调用其他方法(组织其他代码)
def run(self):
#1.登录
self.login()
#启动爬虫程序
def start():
spider = TrainSpider('上海','北京','2021-08-01')
spider.run()
if __name__ == '__main__':
start()
登陆成功
Process finished with exit code 0
二、爬取车站代号
北京站显示为“BJP” 找到车站名的网址https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9198 在浏览器中打开车站网址
import requests
def get_station():
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9198'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
resp = requests.get(url,headers=headers)
resp.encoding = 'utf-8' #防止中文乱码
print(resp.text)
if __name__ == '__main__':
get_station()
使用正则表达式去除无用数据并保存数据到Excel表格中
import requests
import re
import openpyxl
def get_station():
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9198'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
resp = requests.get(url,headers=headers)
resp.encoding = 'utf-8' #防止中文乱码
#print(resp.text)
stations = re.findall('([\u4E00-\u9FA5]+)\|([A-Z]+)',resp.text)
#print(stations)
return stations #stations是一个列表
def save(lst):
wb = openpyxl.Workbook() #创建工作簿对象
ws = wb.active #使用活动表
for item in lst:
ws.append(item) #每执行一次append将向sheet表中添加一行
wb.save('车站代码.xlsx')
if __name__ == '__main__':
lst = get_station()
save(lst)
三、填充站点代号
import openpyxl
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait #显示等待
from selenium.webdriver.support import expected_conditions as ec #显示等待的条件
'''在类之外构造浏览器,避免其使用寿命随类的完成而消失'''
driver = webdriver.Chrome() #创建谷歌浏览器对象
class TrainSpider(object):
#定义类属性
login_url = 'https://kyfw.12306.cn/otn/resources/login.html' #登录页面
profile_url = 'https://kyfw.12306.cn/otn/view/index.html' #个人主页网址
left_ticket = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' #余票查询页面
#定义init初始化方法
def __init__(self,from_station,to_station,train_date):
self.from_station = from_station
self.to_station = to_station
self.train_date = train_date
self.station_code = self.init_station_code() #结果为dict
#登录的方法
def login(self):
#打开登录的页面
driver.get(self.login_url)
WebDriverWait(driver,1000).until(
ec.url_to_be(self.profile_url) #等待直到登录URL跳转到个人中心的URL
)
print('登陆成功')
#查询余票
def search_ticket(self):
#打开查询余票的网址
driver.get(self.left_ticket)
#找到出发站和到达站 隐藏的HTML标签
from_station_input = driver.find_element_by_id('fromStation')
to_station_input = driver.find_element_by_id('toStation')
#找到出发时间的input标签
train_date_input = driver.find_element_by_id('train_date')
#根据键获取值
from_station_code = self.station_code[self.from_station] #根据出发地找到出发地的代号
to_station_code = self.station_code[self.to_station] #根据目的地找到目的地的代号
#执行JS代码
driver.execute_script('arguments[0].value="%s"' % from_station_code,from_station_input)
driver.execute_script('arguments[0].value="%s"' % to_station_code,to_station_input)
driver.execute_script('arguments[0].value="%s"' % self.train_date,train_date_input)
#负责调用其他方法(组织其他代码)
def run(self):
#1.登录
self.login()
#2.余票查询
self.search_ticket()
def init_station_code(self):
wb = openpyxl.load_workbook('车站代码.xlsx')
ws = wb.active #使用活动表
lst = [] #存储所有的车站名称及代号
for row in ws.rows: #遍历所有行
sub_lst = [] #用于存储每行中的车站名称及代号
for cell in row: #遍历一行中的单元格
sub_lst.append(cell.value)
lst.append(sub_lst)
#print(dict(lst)) #将列表转换成字典
return dict(lst)
#启动爬虫程序
def start():
spider = TrainSpider('上海','北京','2021-08-01')
spider.run()
#spider.init_station_code()
if __name__ == '__main__':
start()
|