精华内容
下载资源
问答
  • 利用python抢火车票

    2019-01-08 17:12:03
    sel = webdriver.Chrome(r'C:\Python\Scripts\chromedriver')#启动chromedriver的文件的位置 # sel=webdriver.Firefox() sel.implicitly_wait(30) login_url = 'https://kyfw.12306.cn/otn/login/init' sel.get...

    直接上代码

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait  # available since 2.4.0
    from selenium.webdriver.support import expected_conditions as EC  # available since 2.26.0
    import time
    
    value_fromstation = '%u5357%u5B81%2CNNZ'  # 始发站(南宁)
    value_tostation = '%u6B66%u6C49%2CWHN'  # 终点站(武汉)
    value_date = '2019-01-29'  # 出发时间
    
    
    def login_proc(username, password):
        # 打开登录页面
        sel = webdriver.Chrome(r'C:\Python\Scripts\chromedriver')#启动chromedriver的文件的位置
        # sel=webdriver.Firefox()
        sel.implicitly_wait(30)
        login_url = 'https://kyfw.12306.cn/otn/login/init'
        sel.get(login_url)
        # sign in the username
        try:
            user_input = sel.find_element_by_id("username")
            user_input.clear()
            user_input.send_keys(username)
            print('user-id write success!')
        except:
            print('user-id write error!')
        # sign in the pasword
        try:
            pwd_input = sel.find_element_by_id("password")
            pwd_input.clear()
            pwd_input.send_keys(password)
            print('pw write success!')
        except:
            print('pw write error!')
    
        # Check for Login success
        while True:
            curpage_url = sel.current_url
            if curpage_url != login_url:
                if curpage_url[:-1] != login_url:  # choose wrong verify_pic
                    print('Login finished!')
                    break
            else:
                time.sleep(5)
                print(u'------------>等待用户图片验证')
        return sel
    
    
    def search_proc(sel, train_type='', timer=False):
        print(u'--------->选择车次类型', train_type)
        # 定时抢票时间点
        if timer == True:
            while True:
                current_time = time.localtime()
                if ((current_time.tm_hour == 14) and (current_time.tm_min >= 25) and (
                            current_time.tm_sec >= 00)):
                    print(u'开始刷票...')
                    break
                else:
                    time.sleep(5)
                    if current_time.tm_sec % 30 == 0:
                        print(time.strftime('%H:%M:%S', current_time))
    
        # 打开订票网页
        book_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
        sel.get(book_url)
        # 始发站
        # sel.find_element_by_id('fromStationText').click()
        # from_station = sel.find_element_by_xpath('//*[@id="ul_list1"]/li[32]') # 深圳
        # from_station.click()
        sel.add_cookie({"name": "_jc_save_fromStation", "value": value_fromstation})
        # 终点站
        # sel.find_element_by_id('toStationText').click()
        # sel.find_element_by_id('nav_list3').click()#点击事件
        # tation = sel.find_element_by_xpath('//*[@id="ul_list1"]/li[9]') # 广州
        # to_station.click()
        sel.add_cookie({"name": "_jc_save_toStation", "value": value_tostation})
        # 出发日期
        # date_sel = sel.find_element_by_id('train_date')
        # js = "document.getElementById('train_date').removeAttribute('readonly')" # del train_date readonly property
        # sel.execute_script(js)
        # date_sel.clear()
        # date_sel.send_keys(leave_date)
        sel.add_cookie({"name": "_jc_save_fromDate", "value": value_date})
        sel.refresh()
        # 车次类型选择
        train_type_dict = {'T': '//input[@name="cc_type" and @value="T"]',  # 特快
                           'G': '//input[@name="cc_type" and @value="G"]',  # 高铁
                           'D': '//input[@name="cc_type" and @value="D"]',  # 动车
                           'Z': '//input[@name="cc_type" and @value="Z"]'}  # 直达
        if train_type == 'T' or train_type == 'G' or train_type == 'D' or train_type == 'Z':
            sel.find_element_by_xpath(train_type_dict[train_type]).click()
        else:
            print(u"车次类型异常或未选择!(train_type=%s)" % train_type)
    
    
    def book_proc(sel, refresh_interval=0):
        # 等待状态查询
        query_times = 0
        time_begin = time.time()
        while True:
            # 循环查询
            time.sleep(refresh_interval)
            # 开始查询 @id="ZE_6c000D281201"
            search_btn = WebDriverWait(sel, 10).until(
                EC.presence_of_element_located((By.XPATH, '//*[@id="query_ticket"]')))
            search_btn.click()
            # 扫描查询结果
            try:
                # T17
                tic_tb_item = WebDriverWait(sel, 20).until(
                    EC.presence_of_element_located((By.XPATH, '//*[@id="YW_710000Z28604"]')))
                # G381
                # tic_tb_item = WebDriverWait(sel,20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="ZE_240000G38107"]')))
                tic_ava_num = tic_tb_item.text
            except:  # 应对查询按钮一次点击后,网站未返回查询结果
                search_btn.click()
                # T17
                tic_tb_item = WebDriverWait(sel, 5).until(
                    EC.presence_of_element_located((By.XPATH, '//*[@id="YW_710000Z28604"]')))
                # G381
                # tic_tb_item = WebDriverWait(sel,20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="ZE_240000G38107"]')))
                tic_ava_num = tic_tb_item.text
    
            if tic_ava_num == u'无' or tic_ava_num == u'*':  # 无票或未开售
                query_times += 1
                time_cur = time.time()
                print(u'第%d次查询,总计耗时%s秒' % (query_times, time_cur - time_begin))
                continue
            else:
                # 订票 @id="ticket_6c000D281201"
                sel.find_element_by_xpath('//*[@id="6i000G291204_IOQ_IXQ"]/td[13]/a').click()  # T17
                # sel.find_element_by_xpath('//*[@id="ticket_240000G38107"]/td[13]/a').click()  # G381
                break
        # 判断页面跳是否转至乘客选择页面
        cust_sel_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
        while True:
            if (sel.current_url == cust_sel_url):
                print(u'页面跳转成功!')
                break
            else:
                print(u'等待页面跳转...')
        # 乘车人选择
        while True:
            try:
                sel.find_element_by_xpath('//*[@id="normalPassenger_0"]').click()
                sel.find_element_by_xpath('//*[@id="normalPassenger_1"]').click()
                sel.find_element_by_xpath('//*[@id="normalPassenger_2"]').click()
                break
            except:
                print(u'等待常用联系人列表...')
    
        # 席别选择
        # 提交订票
        sel.find_element_by_xpath('//*[@id="submitOrder_id"]').click()
        # 确认订票信息
        while True:
            try:
                sel.switch_to.frame(sel.find_element_by_xpath('//*[@id="body_id"]/iframe[2]'))
                print
                sel.find_element_by_xpath('//*[@id="qr_submit_id"]').click()
                print('Pass!')
                break
            except:
                print(u'请手动通过图片验证码')
                time.sleep(5)
                break
        return 'yeah'
    
    
    if __name__ == '__main__':
        # 变量定义
        leave_date = '2019-1-29'
        train_type = 'Z'
        refresh_interval = 0.1
        timer = False
    
        sel = login_proc('********', '*******')#账号密码
        search_proc(sel, train_type, timer)
        book_proc(sel, refresh_interval)
    

    但是与112306服务器多次对抗之后,会出现掉线的情况,下面加上

    from res import login_proc,search_proc,book_proc
    import configparser
    
    config=configparser.ConfigParser()
    config.read('user.cfg')
    
    result = 'gogogo'
    username=config.get('user','username')
    password=config.get('user','password')
    begin_time = '12:33:00'
    refresh_interval = 0.1
    timer=False
    type='Z'
    
    for i in range(1,5):
        if result == 'gogogo':
            try:
                sel = login_proc(username,password)
                search_proc(sel,type,timer)
                book_proc(sel,refresh_interval)
            except:
                continue
        else:
            print(result)
            break
    
    [user]
    username =********
    password =********
    

    代码参考GitHub,链接:https://github.com/karmalove/2017-12306/blob/master/auto_book.py

    展开全文
  • 最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正。话不多说,进入正题:在进入正题之前,我想说明一下,由于12306官网的改版更新,所以脚本作了...

    最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正。话不多说,进入正题:

    在进入正题之前,我想说明一下,由于12306官网的改版更新,所以脚本作了一点小小的变化,具体修改后的源码,可以到GitHub上面查看……新版脚本源码

    python学习资料获取在文末

    这个脚本目前只能刷一趟车的,人数可以是多个,支持选取作为类型等。

    实现思路是splinter.browser模拟浏览器登陆和操作,由于12306的验证码不好自动识别,所以,验证码需要用户进行手动识别,并进行登陆操作,之后的事情,就交由脚本来操作就可以了,下面是我测试时候的一些截图:

    第一步:如下图,首先输入抢票基本信息

    第二步:然后进入登录页,需要手动输入验证码,并点击登陆操作

    第三步:登陆后,自动进入到抢票页面,如下图这样的

    最后:就是坐等刷票结果就好了,如下图这样,就说是刷票成功了,刷到票后,会进行短信和邮件的通知,请记得及时前往12306进行支付,不然就白抢了。

    Python运行环境:python3.6

    用到的模块:re、splinter、time、sys、httplib2、urllib、SMtplib、email

    未安装的模块,请使用pip instatll进行安装,例如:pip install splinter

    如下代码是这个脚本所有用到的模块引入:

    import re

    from splinter.browser import Browser

    from time import sleep

    import sys

    import httplib2

    from urllib import parse

    import SMtplib

    from email.mime.text import MIMEText

    刷票前信息准备,我主要说一下始发站和目的地的cookie值获取,因为输入城市的时候,需要通过cookie值,cookie值可以通过12306官网,然后在F12(相信所有的coder都知道这个吧)的network里面的查询请求cookie中可以看到,在请求的header里面可以找到,_jc_save_fromStation值是出发站的cookie,_jc_save_toStation的值是目的地的cookie,然后加入到代码里的城市的cookie字典city_list里即可,键是城市的首字母,值是cookie值的形式。

    抢票,肯定需要先登录,我这里模拟的登录操作,会自动填充12306的账号名和密码,当然,你也可以在打开的浏览器中修改账号和密码,实现的关键代码如下:

    def do_login(self):

    """登录功能实现,手动识别验证码进行登录"""

    self.driver.visit(self.login_url)

    sleep(1)

    self.driver.fill('loginUserDTO.user_name', self.user_name)

    self.driver.fill('userDTO.password', self.password)

    print('请输入验证码……')

    while True:

    if self.driver.url != self.init_my_url:

    sleep(1)

    else:

    break

    登录之后,就是控制刷票的各种操作处理了,这里,我就不贴代码了,因为代码比较多,别担心,在最后,我会贴出完整的代码的。

    当刷票成功后,我会进行短信和邮件的双重通知,当然,这里短信通知的平台,就看你用那个具体来修改代码了,我用的是互亿无线的体验版的免费短信通知接口;发送邮件模块我用的是SMtplib,发送邮件服务器用的是163邮箱,如果用163邮箱的话,你还没有设置客户端授权密码,记得先设置客户端授权密码就好了,挺方便的。以下是主要实现代码:

    def send_SMs(self, mobile, SMs_info):

    """发送手机通知短信,用的是-互亿无线-的测试短信"""

    host = "106.ihuyi.com"

    SMs_send_uri = "/webservice/SMs.php?method=Submit"

    account = "C59782899"

    pass_word = "19d4d9c0796532c7328e8b82e2812655"

    params = parse.urlencode(

    {'account': account, 'password': pass_word, 'content': SMs_info, 'mobile': mobile, 'format': 'json'}

    )

    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}

    conn = httplib2.HTTPConnectionWithTimeout(host, port=80, timeout=30)

    conn.request("POST", SMs_send_uri, params, headers)

    response = conn.getresponse()

    response_str = response.read()

    conn.close()

    return response_str

    def send_mail(self, receiver_address, content):

    """发送邮件通知"""

    # 连接邮箱服务器信息

    host = 'SMtp.163.com'

    port = 25

    sender = 'xxxxxx@163.com'  # 你的发件邮箱号码

    pwd = '******'  # 不是登陆密码,是客户端授权密码

    # 发件信息

    receiver = receiver_address

    body = '

    温馨提醒:

    ' + content + '

    '

    msg = MIMEText(body, 'html', _charset="utf-8")

    msg['subject'] = '抢票成功通知!'

    msg['from'] = sender

    msg['to'] = receiver

    s = SMtplib.SMTP(host, port)

    # 开始登陆邮箱,并发送邮件

    s.login(sender, pwd)

    s.sendmail(sender, receiver, msg.as_string())

    说了那么多,感觉都是说了好多废话啊,哈哈,不好意思,耽误大家时间来看我瞎扯了,我贴上大家最关心的源码,请接码:

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    """

    通过splinter刷12306火车票

    可以自动填充账号密码,同时,在登录时,也可以修改账号密码

    然后手动识别验证码,并登陆,接下来的事情,交由脚本来做了,静静的等待抢票结果就好(刷票过程中,浏览器不可关闭)

    author: cuizy

    time: 2018-05-30

    """

    import re

    from splinter.browser import Browser

    from time import sleep

    import sys

    import httplib2

    from urllib import parse

    import SMtplib

    from email.mime.text import MIMEText

    class BrushTicket(object):

    """买票类及实现方法"""

    def __init__(self, user_name, password, passengers, from_time, from_station, to_station, number, seat_type, receiver_mobile, receiver_email):

    """定义实例属性,初始化"""

    # 1206账号密码

    self.user_name = user_name

    self.password = password

    # 乘客姓名

    self.passengers = passengers

    # 起始站和终点站

    self.from_station = from_station

    self.to_station = to_station

    # 乘车日期

    self.from_time = from_time

    # 车次编号

    self.number = number.capitalize()

    # 座位类型所在td位置

    if seat_type == '商务座特等座':

    seat_type_index = 1

    seat_type_value = 9

    elif seat_type == '一等座':

    seat_type_index = 2

    seat_type_value = 'M'

    elif seat_type == '二等座':

    seat_type_index = 3

    seat_type_value = 0

    elif seat_type == '高级软卧':

    seat_type_index = 4

    seat_type_value = 6

    elif seat_type == '软卧':

    seat_type_index = 5

    seat_type_value = 4

    elif seat_type == '动卧':

    seat_type_index = 6

    seat_type_value = 'F'

    elif seat_type == '硬卧':

    seat_type_index = 7

    seat_type_value = 3

    elif seat_type == '软座':

    seat_type_index = 8

    seat_type_value = 2

    elif seat_type == '硬座':

    seat_type_index = 9

    seat_type_value = 1

    elif seat_type == '无座':

    seat_type_index = 10

    seat_type_value = 1

    elif seat_type == '其他':

    seat_type_index = 11

    seat_type_value = 1

    else:

    seat_type_index = 7

    seat_type_value = 3

    self.seat_type_index = seat_type_index

    self.seat_type_value = seat_type_value

    # 通知信息

    self.receiver_mobile = receiver_mobile

    self.receiver_email = receiver_email

    # 主要页面网址

    self.login_url = 'https://kyfw.12306.cn/otn/login/init'

    self.init_my_url = 'https://kyfw.12306.cn/otn/index/initMy12306'

    self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'

    # 浏览器驱动信息,驱动下载页:https://sites.google.com/a/chromium.org/chromedriver/downloads

    self.driver_name = 'chrome'

    self.executable_path = 'C:\\Users\cuizy\AppData\Local\Programs\Python\Python36\Scripts\chromedriver.exe'

    def do_login(self):

    """登录功能实现,手动识别验证码进行登录"""

    self.driver.visit(self.login_url)

    sleep(1)

    self.driver.fill('loginUserDTO.user_name', self.user_name)

    self.driver.fill('userDTO.password', self.password)

    print('请输入验证码……')

    while True:

    if self.driver.url != self.init_my_url:

    sleep(1)

    else:

    break

    def start_brush(self):

    """买票功能实现"""

    self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)

    # 浏览器窗口的大小

    self.driver.driver.set_window_size(900, 700)

    self.do_login()

    self.driver.visit(self.ticket_url)

    try:

    print('开始刷票……')

    # 加载车票查询信息

    self.driver.cookies.add({"_jc_save_fromStation": self.from_station})

    self.driver.cookies.add({"_jc_save_toStation": self.to_station})

    self.driver.cookies.add({"_jc_save_fromDate": self.from_time})

    self.driver.reload()

    count = 0

    while self.driver.url.split('?')[0] == self.ticket_url:

    self.driver.find_by_text('查询').click()

    sleep(1)

    count += 1

    print('第%d次点击查询……' % count)

    try:

    car_no_location = self.driver.find_by_id("queryLeftTable")[0].find_by_text(self.number)[1]

    current_tr = car_no_location.find_by_xpath("./../../../../..")

    if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':

    print('无此座位类型出售,已结束当前刷票,请重新开启!')

    sys.exit(1)

    elif current_tr.find_by_tag('td')[self.seat_type_index].text == '无':

    print('无票,继续尝试……')

    else:

    # 有票,尝试预订

    print('刷到票了(余票数:' + str(current_tr.find_by_tag('td')[self.seat_type_index].text) + '),开始尝试预订……')

    current_tr.find_by_css('td.no-br>a')[0].click()

    sleep(1)

    key_value = 1

    for p in self.passengers:

    # 选择用户

    print('开始选择用户……')

    self.driver.find_by_text(p).last.click()

    # 选择座位类型

    print('开始选择席别……')

    if self.seat_type_value != 0:

    seat_select = self.driver.find_by_id("seatType_" + str(key_value))[0]

    seat_select.find_by_xpath("//option[@value='" + str(self.seat_type_value) + "']")[0].click()

    key_value += 1

    sleep(0.5)

    if p[-1] == ')':

    self.driver.find_by_id('dialog_xsertcj_ok').click()

    print('正在提交订单……')

    self.driver.find_by_id('submitOrder_id').click()

    sleep(2)

    # 查看放回结果是否正常

    submit_false_info = self.driver.find_by_id('orderResultInfo_id')[0].text

    if submit_false_info != '':

    print(submit_false_info)

    self.driver.find_by_id('qr_closeTranforDialog_id').click()

    sleep(0.2)

    self.driver.find_by_id('preStep_id').click()

    sleep(0.3)

    continue

    print('正在确认订单……')

    self.driver.find_by_id('qr_submit_id').click()

    print('预订成功,请及时前往支付……')

    # 发送通知信息

    self.send_mail(self.receiver_email, '恭喜您,抢到票了,请及时前往12306支付订单!')

    self.send_SMs(self.receiver_mobile, '您的验证码是:8888。请不要把验证码泄露给其他人。')

    except Exception as error_info:

    print(error_info)

    except Exception as error_info:

    print(error_info)

    def send_SMs(self, mobile, SMs_info):

    """发送手机通知短信,用的是-互亿无线-的测试短信"""

    host = "106.ihuyi.com"

    SMs_send_uri = "/webservice/SMs.php?method=Submit"

    account = "C59782899"

    pass_word = "19d4d9c0796532c7328e8b82e2812655"

    params = parse.urlencode(

    {'account': account, 'password': pass_word, 'content': SMs_info, 'mobile': mobile, 'format': 'json'}

    )

    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}

    conn = httplib2.HTTPConnectionWithTimeout(host, port=80, timeout=30)

    conn.request("POST", SMs_send_uri, params, headers)

    response = conn.getresponse()

    response_str = response.read()

    conn.close()

    return response_str

    def send_mail(self, receiver_address, content):

    """发送邮件通知"""

    # 连接邮箱服务器信息

    host = 'SMtp.163.com'

    port = 25

    sender = '******@163.com'  # 你的发件邮箱号码

    pwd = '******'  # 不是登陆密码,是客户端授权密码

    # 发件信息

    receiver = receiver_address

    body = '

    温馨提醒:

    ' + content + '

    '

    msg = MIMEText(body, 'html', _charset="utf-8")

    msg['subject'] = '抢票成功通知!'

    msg['from'] = sender

    msg['to'] = receiver

    s = SMtplib.SMTP(host, port)

    # 开始登陆邮箱,并发送邮件

    s.login(sender, pwd)

    s.sendmail(sender, receiver, msg.as_string())

    if __name__ == '__main__':

    # 12306用户名

    user_name = input('请输入12306用户名:')

    while user_name == '':

    user_name = input('12306用户名不能为空,请重新输入:')

    # 12306登陆密码

    password = input('请输入12306登陆密码:')

    while password == '':

    password = input('12306登陆密码不能为空,请重新输入:')

    # 乘客姓名

    passengers_input = input('请输入乘车人姓名,多人用英文逗号“,”连接,(例如单人“张三”或者多人“张三,李四”):')

    passengers = passengers_input.split(",")

    while passengers_input == '' or len(passengers) > 4:

    print('乘车人最少1位,最多4位!')

    passengers_input = input('请重新输入乘车人姓名,多人用英文逗号“,”连接,(例如单人“张三”或者多人“张三,李四”):')

    passengers = passengers_input.split(",")

    # 乘车日期

    from_time = input('请输入乘车日期(例如“2018-08-08”):')

    date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}$')

    while from_time == '' or re.findall(date_pattern, from_time) == []:

    from_time = input('乘车日期不能为空或者时间格式不正确,请重新输入:')

    # 城市cookie字典

    city_list = {

    'bj': '%u5317%u4EAC%2CBJP',  # 北京

    'hd': '%u5929%u6D25%2CTJP',  # 邯郸

    'nn': '%u5357%u5B81%2CNNZ',  # 南宁

    'wh': '%u6B66%u6C49%2CWHN',  # 武汉

    'cs': '%u957F%u6C99%2CCSQ',  # 长沙

    'ty': '%u592A%u539F%2CTYV',  # 太原

    'yc': '%u8FD0%u57CE%2CYNV',  # 运城

    'gzn': '%u5E7F%u5DDE%u5357%2CIZQ',  # 广州南

    'wzn': '%u68A7%u5DDE%u5357%2CWBZ',  # 梧州南

    }

    # 出发站

    from_input = input('请输入出发站,只需要输入首字母就行(例如北京“bj”):')

    while from_input not in city_list.keys():

    from_input = input('出发站不能为空或不支持当前出发站(如有需要,请联系管理员!),请重新输入:')

    from_station = city_list[from_input]

    # 终点站

    to_input = input('请输入终点站,只需要输入首字母就行(例如北京“bj”):')

    while to_input not in city_list.keys():

    to_input = input('终点站不能为空或不支持当前终点站(如有需要,请联系管理员!),请重新输入:')

    to_station = city_list[to_input]

    # 车次编号

    number = input('请输入车次号(例如“G110”):')

    while number == '':

    number = input('车次号不能为空,请重新输入:')

    # 座位类型

    seat_type = input('请输入座位类型(例如“软卧”):')

    while seat_type == '':

    seat_type = input('座位类型不能为空,请重新输入:')

    # 抢票成功,通知该手机号码

    receiver_mobile = input('请预留一个手机号码,方便抢到票后进行通知(例如:18888888888):')

    mobile_pattern = re.compile(r'^1{1}\d{10}$')

    while receiver_mobile == '' or re.findall(mobile_pattern, receiver_mobile) == []:

    receiver_mobile = input('预留手机号码不能为空或者格式不正确,请重新输入:')

    receiver_email = input('请预留一个邮箱,方便抢到票后进行通知(例如:test@163.com):')

    while receiver_email == '':

    receiver_email = input('预留邮箱不能为空,请重新输入:')

    # 开始抢票

    ticket = BrushTicket(user_name, password, passengers, from_time, from_station, to_station, number, seat_type, receiver_mobile, receiver_email)

    ticket.start_brush()

    学习Python编程知识,想要成为一个更加优秀的程序员,或者你学习Python的时候有难度, 可以来UP主页的Python学习交流圈,里面有学习视频和文件资料,欢迎初学者和想转行的朋友,和我-起交流成长会比自己琢磨更快哦! UP也收藏了一些Python学习的视频教程和Python基础教程,有兴趣的小伙伴可以看看~谢谢阅读!原作者:gxcuizy

    原文链接:https://juejin.cn/post/6844903615581126670

    原出处:掘金

    展开全文
  • python抢火车票

    2018-05-04 12:47:10
    利用python抢火车票的修改代码,部分代码修改过,利用chrome浏览器,其他的百度一下
  • 导语在“python抢火车票(上)”一文中我们完成了项目内容1和项目内容2,即利用python实现火车/高铁票查询功能以及利用python实现抢火车/高铁票功能,对项目内容1和项目内容2进行优化。开发工具python版本:3.5.4(64...

    导语

    在“python抢火车票(上)”一文中我们完成了项目内容1和项目内容2,即利用python实现火车/高铁票查询功能以及利用python实现抢火车/高铁票功能,对项目内容1和项目内容2进行优化。

    开发工具

    python版本:3.5.4(64bit)

    chromedriver_win32版本:2.3.4

    chrome版本:65.0.3298.4

    相关模块:

    requests模块、prettytable模块、splinter模块以及python自带的一些基本模块。(相关模块均使用pip安装即可)

    主要改进:

    (1)出发地和目的地cookie值自动生成,无需再手工查找;

    (2)将项目内容1和项目内容2功能进行合并;

    (3)使用方式更加简便与人性化;

    (4)增加了抢票成功后语音提示功能;

    (5)避免了更多由于用户非法输入引起的程序异常;

    (6)增加了抢票成功后邮件提示功能,但由于邮件发送容易失败所以我将该部分代码注释掉了,有需要者可自行修改(最后做成Demo时我会添加邮件提示功能的)。

    具体原理请参考相关文件中的源代码,本人已进行了较为详细的注释。

    环境搭建:

    安装python(添加到环境变量)并pip安装相关的第三方库,最后将相关文件中提供的chromedriver.exe文件放在python安装文件夹中的Scripts文件夹内。

    使用方式:

    在cmd中运行后根据提示输入相关信息即可。

    使用演示:

    (1)查询功能:

    (2)抢票功能:

    抢到票之后我们需要手动打开12306官网或者官方APP在未完成订单中进行支付后购票:

    展开全文
  • 原标题:Python3实现抢火车票功能(上)项目内容(1)利用python实现火车/高铁票查询功能;(2)利用python实现抢火车/高铁票功能;项目内容1相关模块:requests模块、prettytable模块以及python自带的一些基本模块。(相关...

    原标题:Python3实现抢火车票功能(上)

    项目内容

    (1)利用python实现火车/高铁票查询功能;

    (2)利用python实现抢火车/高铁票功能;

    项目内容1

    相关模块:

    requests模块、prettytable模块以及python自带的一些基本模块。(相关模块均使用pip安装即可)

    主要思路:

    构建相关的URL请求,并对返回的JSON数据进行解析处理最后显示即可。

    其中值得一提的有:

    (1)需要对特殊的URL发送请求来获得输入车站的字母代号;

    (2)车票余量查询的URL有两个,任意某时刻两个URL中仅有一个是有效的。

    环境搭建:

    安装python3.5.4(添加到环境变量)并pip安装相关第三方库即可。

    使用方式:

    使用演示:

    最终代码:

    见相关文件。

    项目内容2

    相关模块:

    splinter模块以及python自带的一些基本模块。(相关模块均使用pip安装即可)

    主要思路:

    其实无非是利用splinter库,来实现模拟登陆、查询、订票等操作。换句话说只要找到相关的控件名称即可,具体流程可以参考相关文件中的源代码,我都做了详细的注释。

    值得一提的有:

    (1)出发地和目的地不是直接输入的页面值,需要在cookie中查出;

    (2)验证码需要手动输入。

    环境搭建:

    安装python(添加到环境变量)并pip安装相关的第三方库,最后将相关文件中提供的chromedriver.exe文件放在python安装文件夹中的s文件夹内。

    使用方式:

    在下图所示的代码段中填写相关信息:

    确认无误后在cmd中运行即可。

    其中cookie值查找方式如下图:

    使用演示:

    输入验证码后其余操作均将自动进行:

    抢到票之后我们需要手动打开12306官网或者官方APP在未完成订单中进行支付后购票:

    最终代码:

    太长了,不好排版,需要的小伙伴可以加Python学习群:516107834获取返回搜狐,查看更多

    责任编辑:

    展开全文
  • 利用Python制作自动抢火车票小程序,过年再也不要担心没票了! 前言 每次过年很多人都会因为抢不到火车票而回不了家,所以小编利用Python写了一个自动抢火车票的工具,希望大家能抢到火车票,回家过个好年! 话...
  • 临近春节了,大家也都开始抢火车票了,pk 哥每年过年也要抢火车票回去过年。我还记得去年过年用软件抢了一个月都没抢到,当时计划第二天返程上班,当天坐在电脑前不停的刷新,提交订单,在无数次的点击刷新下,还真...
  • 临近春节了,大家也都开始抢火车票了,pk 哥每年过年也要抢火车票回去过年。我还记得去年过年用软件抢了一个月都没抢到,当时计划第二天返程上班,当天坐在电脑前不停的刷新,提交订单,在无数次的点击刷新下,还真...
  • 利用Python实现车票

    2020-06-29 10:32:10
    随着春节返乡潮的临近,“黄牛党”又开始活跃起来。《法制日报》记者调查发现,一些网络“黄牛”仍通过社交平台招揽客户,有“黄牛”称抢票一张加收60元到150元不等作为佣金。但是可以实现自己写代码抢火车票
  • 只要你加钱就会让你更快的到回家的车票,然而并没有什么用,如果你自己有去手动刷过的话,就会发现,你在12306上面看到有但是这些抢票软件并没有给你,所以那些都是假....用Python抢票就是不停的刷新...
  • (2)利用python实现抢火车/高铁功能;项目内容1相关模块:requests模块、prettytable模块以及python自带的一些基本模块。(相关模块均使用pip安装即可)主要思路:构建相关的URL请求,并对返回的JSON数据进行解析处理...
  • 欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来...
  • 今年你不妨自己写一段代码来回家的火车票,是不是很Cool。准备工具:12306网站用户名和密码chrome浏览器及下载chromedriver下载Python代码代码用的Python+Splinter开发,Splinter是一个使用Python开发的开源Web...
  • 导语在“python抢火车票(上)”一文中我们完成了项目内容1和项目内容2,即利用python实现火车/高铁票查询功能以及利用python实现抢火车/高铁票功能,对项目内容1和项目内容2进行优化。开发工具python版本:3.5.4(64...
  • 在“python抢火车票(上)”一文中我们完成了项目内容1和项目内容2,即利用python实现火车/高铁票查询功能以及利用python实现抢火车/高铁票功能,对项目内容1和项目内容2进行优化。开发工具 python版本:3.5.4(64...
  • (2)利用python实现抢火车/高铁功能;项目内容1相关模块:requests模块、prettytable模块以及python自带的一些基本模块。(相关模块均使用pip安装即可)主要思路:构建相关的URL请求,并对返回的JSON数据进行解析...
  • 100行Python代码实现自动抢火车票

    千次阅读 2018-01-21 00:00:00
    又到一年一度春运大会,2017年春运抢火车票还是那么难,各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率,有些代售火车票点,说给100元服务费,可以帮抢到,看来这水很深啊!下面我们利用...
  • 又到一年一度春运大会,2017年春运抢火车票还是那么难,各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率,有些代售火车票点,说给100元服务费,可以帮抢到,看来这水很深啊! 下面...
  • 2020 年铁路春运自 1 月 10 日开始,2 月 18 日结束,共 40 天,节前 15 天,节后 25 天,今年的 12 月 12 日春运火车票正式发售。即使再难,家还是要回的,票还是要的,所以这一周,GitHub 上用 Python 抢票的...
  • 春运来了,快过年了,又到一年中最一票难求的时候了,在外辛辛苦苦打拼了一年,为了让大家尽早的和亲朋好友家人团聚,本人今年很英勇的出来帮大家代抢火车票啦!特地为大家建立了一个捡漏票微信群,加微信qq同步:9 ...
  • 2020年春运正式启动了,很多还在外地打工的朋友都还没有,其中就是我们的码农朋友,但是码农朋友平时都在写代码,没有时间抢票怎么办?这个时候就可以充分的利用自身优势了,用Python识别12306验证码来帮我们...
  • (温馨提示:点击标题即可进入阅读)用Python自动刷新12306火车票一年一度的春运又来了,作者自己写了个抢票脚本。使用Python+Splinter自动刷新抢票,可以成功到。Python分析《羞羞的铁拳》电影观众评论去年上映...
  • 下面小编就整理了在编程中,比较常用的【初识爬虫】入门到进阶的用法。1. 初识爬虫​到底什么是爬虫呢?...在学完爬虫课之后,你可以自己动手写个爬虫,比如:分析北京各地区的房租情况、自动抢火车票、自动抢...
  • 中科大EPC课程查询&自动选课

    千次阅读 2019-04-14 12:29:59
    造成的结果就是经常收到一堆垃圾邮件,每日发送邮件总是达到上限,在参考了使用Python和Splinter实现12306火车票查询与抢票和利用Python制作自动抢火车票小程序,过年再也不要担心没票了!两篇博文之后,学习有...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

利用python抢火车票

python 订阅