如何使用python爬虫实现最新12306抢票
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章将为大家详细讲解有关如何使用python爬虫实现最新12306抢票,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.环境python 3.7谷歌浏览器chr
千家信息网最后更新 2025年02月05日如何使用python爬虫实现最新12306抢票
这篇文章将为大家详细讲解有关如何使用python爬虫实现最新12306抢票,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
1.环境
python 3.7
谷歌浏览器
chromedriver.exe(浏览器驱动程序,要与浏览器版本对应,并将其添加到环境变量或放到当前py文件所在目录下)
2.相关模块
time
(用于某些地方对程序的强制等待)datatime
(用于获取当前时间)selenium 3.1
自动化测试模块,这里用于操作浏览器)
3.思路
首先进行登录(支持手机扫码),登录完成进入页面之后,我们会看到有"温馨提示"的弹窗,即当前界面,我们需要处理第一次弹窗,
然后进入到菜单栏车票下的单程中(鼠标移动触发事件),到达当前页面,处理第二次弹窗
处理完后就是信息的输入,在这里日期的输入不是输入框,是鼠标点击,在代码中已处理,输入完成后,查询列车信息(我写的只能查询动车以及火车的二等座),如果有票,则预约,然后进入新的页面
处理乘车人信息(由于本人是学生,此代码也可抢学生票),最后提交订单。
其实说明白了,就是通过代码让浏览器模拟人来操作浏览器,从而实现购票,要求要对selenium这个模块掌握的熟练。不说了,直接上代码,量有点大,各位道友一定要撑住哈。
import timeimport datetimefrom selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass Qiangpiao(): def __init__(self,from_station,to_station,depart_time,train_num,passenger): self.login_url = 'https://kyfw.12306.cn/otn/resources/login.html' self.init_my_url = 'https://kyfw.12306.cn/otn/view/index.html' self.order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc' # input("出发地:") self.from_station = from_station # input("目的地:") self.to_station = to_station # 时间格式必须是M-d的方式 # input("出发时间(格式必须是M-d的方式):") self.depart_time = depart_time # input("列车号:") self.train_num = train_num self.passenger = passenger #获取当前月份 self.now_month = datetime.date.today().month self.leave_month = int(self.depart_time.split('-')[0]) self.leave_day = int(self.depart_time.split('-')[1]) self.driver = webdriver.Chrome() def _login(self): self.driver.get(self.login_url) # 窗口最大化 #self.driver.maximize_window() # 设置窗口大小 self.driver.set_window_size(1300,800) #print('调整前尺寸:', self.driver.get_window_size()) #显式等待 #这里进行手动登录,可以扫码,也可以输入账号密码点击登录 WebDriverWait(self.driver,1000).until(EC.url_to_be(self.init_my_url)) print('登录成功!') def _pop_window(self): time.sleep(1) self.driver.find_element_by_xpath('//*[@class="dzp-confirm"]/div[2]/div[3]/a').click() def _enter_order_ticket(self): action = ActionChains(self.driver) # 实例化一个动作链对象 element = self.driver.find_element_by_link_text('车票') # 鼠标移动到 '车票' 元素上的中心点 action.move_to_element(element).perform() # 点击'单程' self.driver.find_element_by_xpath('//*[@id="J-chepiao"]/div/div[1]/ul/li[1]/a').click() # 消除第二次弹窗 self.driver.find_element_by_link_text('确认').click() def _search_ticket(self): #出发地输入 self.driver.find_element_by_id("fromStationText").click() self.driver.find_element_by_id("fromStationText").send_keys(self.from_station) self.driver.find_element_by_id("fromStationText").send_keys(Keys.ENTER) #目的地输入 self.driver.find_element_by_id("toStationText").click() self.driver.find_element_by_id("toStationText").send_keys(self.to_station) self.driver.find_element_by_id("toStationText").send_keys(Keys.ENTER) #出发日期输入 self.driver.find_element_by_id("date_icon_1").click() if self.leave_month == self.now_month: xpath_str = f"/html/body/div[37]/div[1]/div[2]/div[{self.leave_day}]" if EC.element_to_be_clickable((By.XPATH, xpath_str)): self.driver.find_element_by_xpath(xpath_str).click() else: print("当前日期未到或已过售票日期,无法购票!") elif self.leave_month == self.now_month + 1: xpath_str = f"/html/body/div[37]/div[2]/div[2]/div[{self.leave_day}]" if EC.element_to_be_clickable((By.XPATH, xpath_str)): self.driver.find_element_by_xpath(xpath_str).click() else: print("当前日期未到或已过售票日期,无法购票!") else: print("月份超前一个月以上,无法购票!") #等待查询按钮是否可用 WebDriverWait(self.driver,1000).until(EC.element_to_be_clickable((By.ID,"query_ticket"))) #执行点击事件 search_btn = self.driver.find_element_by_id("query_ticket") search_btn.click() #等待查票信息加载 WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.XPATH, '//*[@id="queryLeftTable"]/tr'))) def _order_ticket(self): train_num_list = [] # 列车号列表 train_num_ele_list = self.driver.find_elements_by_xpath('//tr/td[1]/div/div[1]/div/a') # 列车号元素列表 for t in train_num_ele_list: # 遍历列车号元素列表,并把列车号添加到列车号列表 train_num_list.append(t.text) tr_list = self.driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr[not(@datatran)]') #每一列列车整行信息列表,列车号元素是tr的子元素 if self.train_num in train_num_list: for tr in tr_list: train_num = tr.find_element_by_xpath("./td[1]/div/div[1]/div/a").text #取出元素tr里的列车号 if self.train_num == train_num: #动车二等座余票信息 text_1 = tr.find_element_by_xpath("./td[4]").text # 火车二等座余票信息 text_2 = tr.find_element_by_xpath("./td[8]").text if (text_1 == "有" or text_1.isdigit()) or (text_2 == "有" or text_2.isdigit()): #点击预订按钮 order_btn = tr.find_element_by_class_name("btn72") order_btn.click() #等待订票页面 WebDriverWait(self.driver,1000).until(EC.url_to_be(self.order_url)) # 选定乘车人 self.driver.find_element_by_xpath(f'//*[@id="normal_passenger_id"]/li/label[contains(text(),"{self.passenger}")]').click() #如果乘客是学生,对提示点击确定 if EC.presence_of_element_located((By.XPATH, '//div[@id="dialog_xsertcj"]')): self.driver.find_element_by_id('dialog_xsertcj_ok').click() # 提交订单 self.driver.find_element_by_id('submitOrder_id').click() time.sleep(2) # 点击确认订单 self.driver.find_element_by_id('qr_submit_id').click() else: # 提交订单 self.driver.find_element_by_id('submitOrder_id').click() time.sleep(2) # 点击确认 self.driver.find_element_by_id('qr_submit_id').click() print("购票成功!") break else: print("二等座无票!") else: print("无此列车!") def run(self): #登录 self._login() #消除登录后(第一次)的弹窗 self._pop_window() #进入购票页面 self._enter_order_ticket() #查票 self._search_ticket() #订票 self._order_ticket() #关闭浏览器 time.sleep(6) self.driver.quit()if __name__ == '__main__': qiangpiao = Qiangpiao("兰州","乌鲁木齐","8-6","D55","小红") qiangpiao.run()
关于"如何使用python爬虫实现最新12306抢票"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
列车
输入
信息
浏览器
浏览
登录
元素
日期
页面
处理
代码
订单
学生
时间
模块
篇文章
车票
鼠标
查询
爬虫
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
街道广泛开展网络安全周活动
武汉软件开发培训班哪个好
我的世界多人服务器生存第17期
数据库平均数规定小数点
网络安全方面的小知识
网络安全现存问题
Pivotal分布式数据库
云服务器调用的是实体吗
龙江租房软件开发
网络安全和电子商务哪个好
手工电视盒加服务器
pdf预览服务器字体
深圳智慧门禁软件开发价格
北京多媒体软件开发公司
数据库first
济南学软件开发哪所学校好
access怎么连数据库
服务器dede404
网络技术报考院校
水利软件开发公司有哪些
网络技术与计算机网络技术
杭州小宅门网络技术
数据库一致性错误
6g网络技术开发
5月13日网络安全
怎么搭建一个收费系统服务器
中国军事网络安全学院
神武服务器多久开到120
网络安全图画素材
网络安全大致分为网络运行安全