当前位置: 首页 > 工具软件 > 12306-hunter > 使用案例 >

12306爬虫抢票软件代码

景河
2023-12-01
'''

1、需要登录页面,手动输入账号密码!
2、地查询车次,输入  起点、目的、出发时间,找到车次,就进行选择
3、选择完成后,就查询该车次是否有余票(进行显示)如果有就进行购买,没有就进行循环
4、如果有就进入购买界面,找到 或者 输入 乘车人信息 ,提交
5、点击提交按钮,付款完成抢票


https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%E5%8C%97%E4%BA%AC,BJP&ts=%E4%B8%8A%E6%B5%B7,SHH&date=2021-05-19&flag=N,N,Y
https://kyfw.12306.cn/otn/confirmPassenger/initDc
'''
import time
import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #期望的条件
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import lxml
import re








class Qiangpiao(object):
    def __init__(self,text_):
        self.login_url = 'https://kyfw.12306.cn/otn/resources/login.html'           #登录页面
        self.inter_url = 'https://kyfw.12306.cn/otn/view/index.html'                #信息界面
        self.option_url = 'https://kyfw.12306.cn/otn/leftTicket/init'               #选择页面
        #self.display_url = 'https://kyfw.12306.cn/otn/leftTicket/init'              #显示所有车次的页面
        self.purchase_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'     #预定付款界面
        self.driver = webdriver.Chrome('F:\python\PyCharm Community Edition 2020.3.3\\bin\chromedriver.exe')# 驱动chrome浏览器进行操作

    def wait_input(self):
        self.from_station = "北京"#input('出发地:')
        self.to_station = "上海"#input('目的地:')
        # 时间格式一定要对应
        self.depart_time = "2021-06-07"#input('出发时间:')
        # 名字一定要存在于常用联系人中间
        self.passengers = "张三"#input('乘客姓名:(如有多个乘客使用英文逗号分割)').split(',')
        self.trains = ["G101"] #input('车次:(如有多个车次使用英文逗号分割)').split(',')  # 结果[G234,...]
    def login(self):
        self.driver.get(self.login_url)    #判断是否进入了登录界面
        WebDriverWait(self.driver, 1000).until(EC.url_to_be(self.inter_url))
        #EC.url_to_be(url)判断是否是 url 这个网页,必须一致,如果是返回True,否则返回False
        #driver:浏览器驱动,1000是最长超时时间(timeout:最长超时时间,默认以秒为单位)
        #登录账号密码
        print('恭喜您,您已登录成功了!')

    def dataGain(self):
        self.driver.find_element_by_id("fromStationText").click()
        fromStationText = self.driver.find_element_by_id("fromStationText")
        fromStationText.send_keys(Keys.BACK_SPACE)
        fromStationText.send_keys("北京")
        fromStationText = self.driver.find_element_by_id("fromStationText")
        fromStationText.send_keys(Keys.ENTER)

        #安照输入需要哪些步骤,就需要执行哪些代码

        self.driver.find_element_by_id("toStationText").click()
        toStationText = self.driver.find_element_by_id("toStationText")
        toStationText.send_keys(Keys.BACK_SPACE)
        toStationText.send_keys("上海")
        toStationText.send_keys(Keys.ENTER)

        #出发时间
        x = True
        while x == True :
            a = 5 #int(input("请输入0-16之间的数字:"))
            if 0 <= a < 16:
                to_time = self.driver.find_elements(By.XPATH,'//*[@id="date_range"]/ul/li['+str(a)+']')#这个XPATH是按钮整个外结构的XPATH
                to_time[0].click()
                x = False
            else:
                print("输入有误,请重新输入!!")
        #to_time[0].send_keys(Keys.ENTER)
        time.sleep(5)

    def _order_ticket(self):
        self.driver.get(self.option_url)
        sear = self.driver.find_element_by_id("gb_closeDefaultWarningWindowDialog_id").click()
        #self.driver.find_element_by_id("fromStationText").send_keys("北京")
        #se = self.driver.find_element_by_id("fromStation_icon_image").click()       #点击所要输入的地址,先爬取到所有的地址
        self.dataGain()

        #self.driver.find_element_by_xpath(' //*[@id="ticket_240000G1010Q_01_11"]/td[13]').click()                                         # 获取到点击事件
        #找到点击按钮,执行点击事件train
        time.sleep(5)
        '''
        trains_list = self.driver.find_elements_by_class_name("number")       #车次列表
        start_list = self.driver.find_elements_by_class_name("start-s")       #出发站
        end_list = self.driver.find_elements_by_class_name("end-s")           #终点站
        start_end_time_list = self.driver.find_elements_by_class_name("cds")  #出发时间和到达时间
        last_list = self.driver.find_elements_by_class_name("ls")             #历时
        business_list = self.driver.find_elements_by_class_name("t-num")      #商务座的票
        you_list = self.driver.find_elements_by_class_name("yes")             #一等座
        in_class = self.driver.find_elements_by_class_name("bgc")
        '''
        # 需要等待信息加载......
        self.driver.find_elements(By.ID, 'queryLeftTable')
        # 需要找到tr标签进行加载信息
        tr_list = self.driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr[not(@datatran)]')    #获取到了所有的标签框,里面有所有的车次
        start_list = self.driver.find_elements_by_class_name("cdz")           #出发站和终点站  ok
        start_end_time_list = self.driver.find_elements_by_class_name("cds")  # 出发时间和到达时间  ok
        last_list = self.driver.find_elements_by_class_name("ls")  # 历时         ok
        left_ticket1 = self.driver.find_elements_by_xpath(".//td[2]")[1:]   #商务座的名额剩余,切片操作一下,第一个不是所需要的内容
        left_ticket2 = self.driver.find_elements_by_xpath(".//td[3]")   #一等座的名额剩余
        left_ticket3 = self.driver.find_elements_by_xpath(".//td[4]")   #二等座的名额剩余
        left_ticket4 = self.driver.find_elements_by_xpath(".//td[5]")   #高级软卧的名额剩余
        left_ticket5 = self.driver.find_elements_by_xpath(".//td[6]")   #软卧一等卧的名额剩余
        left_ticket6 = self.driver.find_elements_by_xpath(".//td[7]")   #动卧的名额剩余
        left_ticket7 = self.driver.find_elements_by_xpath(".//td[8]")   #硬卧二等卧的名额剩余
        left_ticket8 = self.driver.find_elements_by_xpath(".//td[9]")   #软座的名额剩余
        left_ticket9 = self.driver.find_elements_by_xpath(".//td[10]")   #硬座的名额剩余
        left_ticket10 = self.driver.find_elements_by_xpath(".//td[11]") #无座的名额剩余
        left_ticket11 = self.driver.find_elements_by_xpath(".//td[12]") #其他的名额剩余
        x = 0
        # 打印出所有的标签
        tplt1 = "{0:<0}\t{1:^9}\t{2:^9}\t{3:^9}\t{4:^9}\t{5:^9}\t{6:^9}\t{7:^9}\t{8:^9}\t{9:^9}\t{10:^5}\t{11:^9}\t{12:^9}\t{13:^9}\t{14:^9}"
        for tr in tr_list:
            x += 1
        print(tplt1.format("编号", "车次", "出发站和终点站", "出发时间和到达时间", "历时", "商务座", "一等座", "二等座", "高等软卧", "软卧一等座", "动卧", "硬卧", "硬座", "无座", "其他", chr(12288)))
        tplt2 = "{0:<0}\t{1:^9}\t{2:^9}\t{3:^9}\t{4:^9}\t{5:^9}\t{6:^9}\t{7:^9}\t{8:^9}\t{9:^9}\t{10:^9}\t{11:^9}\t{12:^9}\t{13:^9}\t{14:^9}"
        for j in range(0,x):
            tr_text = tr_list[j].find_element_by_class_name("number")
            print(tplt2.format(j, tr_text.text,start_list[j].text.replace("\n","到"),start_end_time_list[j].text.replace("\n","—"),last_list[j].text.replace("\n","——"),left_ticket1[j].text,left_ticket2[j].text,left_ticket3[j].text,left_ticket4[j].text,left_ticket5[j].text,left_ticket6[j].text,left_ticket7[j].text,left_ticket8[j].text,left_ticket9[j].text,left_ticket10[j].text,left_ticket11[j].text,chr(12288)))

        z = 5 #int(input("请输入需要查询的车次序号:"))
        #找到那几个标签的内容判断是否有票
        print(tplt1.format("编号", "车次", "出发站和终点站", "出发时间和到达时间", "历时", "商务座", "一等座", "二等座", "高等软卧", "软卧一等座", "动卧", "硬卧",
                          "硬座", "无座", "其他", chr(12288)))
        for j in range(0, x):
            tr_text = tr_list[j].find_element_by_class_name("number")
            if z == j:
                print(tplt2.format(j, tr_text.text,start_list[j].text.replace("\n","到"),start_end_time_list[j].text.replace("\n","—"),last_list[j].text.replace("\n","——"),left_ticket1[j].text,left_ticket2[j].text,left_ticket3[j].text,left_ticket4[j].text,left_ticket5[j].text,left_ticket6[j].text,left_ticket7[j].text,left_ticket8[j].text,left_ticket9[j].text,left_ticket10[j].text,left_ticket11[j].text,chr(12288)))
                left_ticket12 = self.driver.find_elements_by_xpath(".//td[13]")[j].click()
                if WebDriverWait(self.driver, 1000).until(EC.url_to_be(self.purchase_url)) == True:
                    print("进入预付款界面,请输入信息\n")
                    inter = self.driver.find_element_by_class_name("lay-bd")        #获取页面基础信息
                    print(inter.text,"\n")
                    users = self.driver.find_element_by_class_name("per-sel")       #获取所有的人员信息
                    print(users.text,end='')
                    print("\n")

                    nu = 1
                    k = 10
                    while nu == 1:
                        print("0 受让人,乘车人从 1 开始")
                        i = int(input())
                        if i == 0:
                            self.driver.find_element_by_class_name("btn92s").click()
                            break
                        elif i == 1:
                            check = self.driver.find_element_by_class_name("check")
                            check[i].click()
                            self.driver.find_element_by_id("btn92s").click()
                        elif i > 1:
                            check = self.driver.find_element_by_class_name("check")
                            check[i].click()
                            print(self.driver.find_element_by_class_name("tit").text)
                            self.driver.find_element_by_class_name("gb_closeDefaultWarningWindowDialog_id").click()
                        #print("是否继续添加:是:1,否:0")
                        #nu = int(input())


                    #获取所有的车次预约按钮

        '''click_list = self.driver.find_elements_by_class_name("btn72")

        self.driver.find_elements_by_id("tr_id_1")
        self.driver.find_elements_by_xpath(".//td[1]")


        for i,j,k in zip(trains_list,start_list,end_list):
            x += 1
            print(i.text," ",j.text," ",k.text,x)
            print("==============")
            print("=========================================================")
        x = 0
        for l in in_class:
            x += 1
            print(l.text,x)'''
        '''
        x = 0
        for i in business_list:
            x += 1
            print(i.text, x)
            print("==============")
        print("=========================================================")
        x = 0
        for i in you_list:
            x += 1
            print(i.text, x)
            print("==============")
'''


    def run(self):
        self.wait_input()
        self.login()
        self._order_ticket()

if __name__ == '__main__':
    spider = Qiangpiao(text_=None)
    spider.run()
    #spider.wait_input()
    #spider.login()
    #spider._order_ticket()
 类似资料: