python爬虫抢火车票_python网络爬虫进阶day02-12306抢票

1 #Author:K

2 from selenium importwebdriver3 from selenium.webdriver.support.ui importWebDriverWait4 from selenium.webdriver.support importexpected_conditions as EC5 from selenium.webdriver.common.by importBy6

7 classTicketGrabbing(object):8 def __init__(self):9 self.driver = webdriver.Chrome(executable_path = 'D:\ChromeDriver\chromedriver.exe')10 self.login_url = 'https://kyfw.12306.cn/otn/login/init' #这个不行'https://kyfw.12306.cn/otn/resources/login.html'

11 self.index_url = 'https://kyfw.12306.cn/otn/view/index.html'

12 self.order_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc'

13 self.commit_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'

14

15

16 defrun(self):17 self._login()18 self._order_ticket()19

20

21 def_wait_input(self):22 self.from_station = input('请输入出发地:')23 self.to_station = input('请输入目的地:')24 self.date = input('请输入出发日期(格式为yyyy-mm-dd):')25 self.trains = input('请输入车次(多个车次用英文逗号隔开):').split(',')26 self.passengers = input('请输入乘客(多个乘客用英文逗号隔开):').split(',')27 #等待出发地输入

28 WebDriverWait(self.driver,300).until(29 #因为此标签'input'是单标签,所以要用text_to_be_present_in_element_value,

30 #如果是双标签的话就用text_to_be_present_in_element

31 EC.text_to_be_present_in_element_value((By.ID,'fromStationText'),self.from_station)32 )33 #等待目的地输入

34 WebDriverWait(self.driver, 300).until(35 EC.text_to_be_present_in_element_value((By.ID, 'toStationText'), self.to_station)36 )37 #等待出发日期输入

38 WebDriverWait(self.driver, 300).until(39 EC.text_to_be_present_in_element_value((By.ID, 'train_date'), self.date)40 )41 #等待查询按钮是否可用

42 WebDriverWait(self.driver,300).until(43 EC.element_to_be_clickable((By.ID,'query_ticket'))44 )45

46

47

48 def_login(self):49 self.driver.get(self.login_url)50 #登录成功后,等待页面跳转至首页

51 WebDriverWait(self.driver,300).until(52 EC.url_to_be(self.index_url)53 )54 print('登录成功!')55 #等待是否到达订票页面

56 WebDriverWait(self.driver,300).until(57 EC.url_to_be(self.order_url)58 )59

60

61 def_order_ticket(self):62 self._wait_input()63 query_button = self.driver.find_element_by_id('query_ticket')64 query_button.click()65 #等待车次信息出现

66 WebDriverWait(self.driver,300).until(67 EC.presence_of_element_located((By.XPATH,'.//tbody[@id="queryLeftTable"]/tr'))68 )69 #获取车次信息

70 tr_list = self.driver.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')71 #print(tr_list) # 测试

72 for tr intr_list:73 train_number = tr.find_element_by_class_name('number').text74 if train_number inself.trains:75 tickets_left = tr.find_element_by_xpath('./td[4]').text76 if tickets_left == '有' ortickets_left.isdigit:77 #print(train_number,tickets_left) # 测试

78 #print('='*30) # 测试

79 book_button = tr.find_element_by_class_name('btn72')80 book_button.click()81 #等待页面是否跳转到提交订单页面,并且出现乘客信息

82 WebDriverWait(self.driver,300).until(83 EC.presence_of_element_located((By.XPATH,'.//ul[@id="normal_passenger_id"]/li'))84 )85 #找到所有乘客信息

86 li_list = self.driver.find_elements_by_xpath('.//ul[@id="normal_passenger_id"]/li')87 for li inli_list:88 if li.text inself.passengers:89 print(li.text)90 #找到乘客对应的CheckBox,并执行点击事件

91 check_box = li.find_element_by_class_name('check')92 check_box.click()93 #找到提交订单按钮,并执行点击事件

94 commit_button = self.driver.find_element_by_id('submitOrder_id')95 commit_button.click()96 #等待确认订单弹窗出现

97 WebDriverWait(self.driver,300).until(98 EC.presence_of_element_located((By.CLASS_NAME,'dhtmlx_wins_body_outer'))99 )100 #等待确认按钮加载

101 WebDriverWait(self.driver, 300).until(102 EC.presence_of_element_located((By.ID, 'qr_submit_id'))103 )104 #找到确认按钮,并执行点击事件

105 confirm_button = self.driver.find_element_by_id('qr_submit_id')106 confirm_button.click()107 #因为确认按钮可能会未被点击,所以用一个while循环点击,若正确点击了确认按钮,则调出while循环

108 whileconfirm_button:109 confirm_button.click()110 confirm_button = self.driver.find_element_by_id('qr_submit_id')111 #打开一个新的窗口,并将driver转换成新的窗口

112 self.driver.execute_script('window.open("%s")' %self.order_url)113 self.driver.switch_to.window(self.driver.window_handles[1])114 #再次等待车次信息出现

115 WebDriverWait(self.driver, 300).until(116 EC.presence_of_element_located((By.XPATH, './/tbody[@id="queryLeftTable"]/tr'))117 )118

119

120 if __name__ == '__main__':121 spider =TicketGrabbing()122 spider.run()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷是一个提供在线教育的学习平台,他们提供了Python爬虫的相关教学课程。通过学习这些课程,你可以获得Python基础知识、前端基础知识、计算机网络基础以及爬虫原理等方面的知识。Python基础教学可以参考B站尚硅谷的教学视频,这些视频可以帮助你建立起对Python的基本认识。而前端基础知识包括HTML、CSS和JavaScript的学习,它们分别代表网页的骨架、肌肉和皮肤,只有结合起来才能形成一个完整的网页。此外,你还可以通过学习计算机网络基础来理解HTTP和HTTPS、URL以及网页请求等内容。爬虫原理也是其中的一部分内容,它可以帮助你了解如何通过爬虫程序获取网页数据。所以,如果你对Python爬虫感兴趣,尚硅谷提供的Python爬虫课程可能是一个不错的选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [零基础自学python爬虫笔记Day1——爬虫的基本原理](https://blog.csdn.net/Seyhang/article/details/119420052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Python爬虫】urllib库——尚硅谷](https://blog.csdn.net/qq_48108092/article/details/126097408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值