教程丨基于Python爬虫技术的抢票程序及其实现

Posted 笑学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程丨基于Python爬虫技术的抢票程序及其实现相关的知识,希望对你有一定的参考价值。

  • 版本号 Python 3.6.5

  • 编译器 PyCharm PRO 2018.1

  • 浏览器 Google Chrome 71.0.3

教程丨基于Python爬虫技术的抢票程序及其实现

首先,我们用到一个Splinter库:

相信做自动化测试、自动化爬虫的朋友都知道Selenium工具,它可以把人为驱动行为转化为机器执行,Splinter的药效跟它是一样的。我们可以进去cmd后用 pip install splinter

这个命令来安装。

然后,开始使劲地码:

教程丨基于Python爬虫技术的抢票程序及其实现

1. 定义自动购票的类(初始化属性)

class Buy_Tickets(object):# 定义实例属性,初始化def __init__(self, username, passwd, order, passengers, dtime, starts, ends):self.username = usernameself.passwd = passwdself.order = order # 车次,0代表所有车次self.passengers = passengers # 乘客名self.starts = starts # 起始地和终点self.ends = endsself.dtime = dtime # 日期self.login_url = 'https://kyfw.12306.cn/otn/login/init'self.initMy_url = 'https://kyfw.12306.cn/otn/view/index.html'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'self.driver_name = 'chrome'self.executable_path = 'C:pythonchromedriver.exe'

2. 实现登录功能

def login(self):self.driver.visit(self.login_url)self.driver.fill('loginUserDTO.user_name', self.username)# sleep(1)self.driver.fill('userDTO.password', self.passwd)# sleep(1)print('请输入验证码...')while True:if self.driver.url != self.initMy_url:sleep(1)else:break

3. 实现购票功能

def start_buy(self):self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)# 窗口大小的操作self.driver.driver.set_window_size(1200, 700)self.login()self.driver.visit(self.ticket_url)try:print('开始购票...')# 加载查询信息self.driver.cookies.add({"_jc_save_fromStation": self.starts})self.driver.cookies.add({"_jc_save_toStation": self.ends})self.driver.cookies.add({"_jc_save_fromDate": self.dtime})self.driver.reload()count = 0if self.order != 0:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:self.driver.find_by_text('预订')[self.order - 1].click()sleep(1.5)except Exception as e:print(e)print('预订失败...')continue

4. 邮箱通知付款

def sendMail(self, mail_title, mail_content):my_sender = 'xxx@qq.com' # 发件人邮箱账号my_user = 'xxxx@qq.com' # 收件人邮箱账号try:'''发送邮件'''msg = MIMEText(mail_content, "plain", 'utf-8') # 发送邮件内容msg["Subject"] = Header(mail_title, 'utf-8') # 发送邮件主题/标题msg["From"] = formataddr(['Bruce pk', my_sender]) # 邮件发送方msg["To"] = formataddr(['brucepk', my_user]) # 邮件接收方s = smtplib.SMTP("smtp.qq.com", 25) # 邮箱的传输协议,端口默认25s.login(my_sender, 'xxxxx') # 登录邮箱,这里的第二个参数为qq邮箱授权码,不要填你的登录密码s.sendmail(my_sender, [my_user, ], msg.as_string()) # 发送方,接收方,发送消息s.quit() # 退出邮箱print("抢票通知邮件发送成功!")except Exception:print("邮件发送失败~~")

还有,网络不好或者12306的服务器不稳定的时候,就会卡住,针对这种情况,系统会重复查询:

else:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:for i in self.driver.find_by_text('预订'):i.click()sleep(1)except Exception as e:print(e)print('预订失败...')continueprint('开始预订...')sleep(1)print('开始选择用户...')for p in self.passengers:self.driver.find_by_text(p).last.click()sleep(0.5)if p[-1] == ')':self.driver.find_by_id('dialog_xsertcj_ok').click()sleep(3)print('提交订单...')self.driver.find_by_id('submitOrder_id').click()sleep(5)print('确认选座...')self.driver.find_by_id('qr_submit_id').click()print('预订成功...')sleep(5)self.sendMail(mail_title, mail_content)except Exception as e:print(e)

最后,祝大家都能顺利抢到票。


来源丨博客园

作者丨小帝君




你关注的就是我关心的!


以上是关于教程丨基于Python爬虫技术的抢票程序及其实现的主要内容,如果未能解决你的问题,请参考以下文章

春运到了,带你用python来抢票回家!

Python:爬虫助你回家,12306余票监测!

专业的抢票软件 12306bypass

Python爬虫丨大众点评数据爬虫教程

Python爬虫丨大众点评数据爬虫教程

神助攻的抢票软件能否成为真正的惠民神器?