python爬虫抢火车票_你的票被服务器上的爬虫“吃”了,本文解析爬虫抢票的源码!...

本文详细解析了使用Python爬虫抢购12306火车票的过程,包括登录、验证码识别、自动刷新抢票页面直至购票成功。还介绍了配合短信和邮件通知的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过年啦!黄牛们又开始猖獗了,我们为什么总是抢不到票?实际上票都被黄牛们部署在云服务器上的脚本不断刷着!我们手再快能快过爬虫吗?成都七中chengqigou清华大学shu20200124888.8张铁柱本文下方包含大量源码,对代码不适的“童鞋”咳咳咳……不过python代码做了美化哦!五颜六色外加合理的Tab看起来赏心悦目!

“爬虫”究竟是如何抢票的(火车票同理)

此前,在线票务服务公司携程的“反爬虫”专家在技术分享中透露,某网站的一个页面,每分钟的浏览量是1.2万,真实用户只有500个,“爬虫”流量占比为95.8%。采访中,很多业内人士也表示,即使在“爬虫”活动的淡季,虚假流量也占到订票网站总流量的50%,高峰期更是在90%以上。那么,“爬虫”究竟是如何实现抢票的呢?对此,小睿告诉您原理,主要是机票代理公司利用“爬虫”技术,不断抓取航空公司售票官网网页信息,如果发现该航空公司有低价票放出,“爬虫”即刻利用虚假客源身份进行批量预定但不实际支付,以达到抢占低价票源的目的。由于“爬虫”的效率远远超过正常的手动操作,导致通过正常操作几乎无法抢到票。随后,机票代理公司会通过其自身销售渠道(包括公司网站、在线旅行社、客户电话订购等)找到真正的客源,在航空公司允许的账期内,退订此前使用虚假客源身份预定的低价票,然后使用真实身份信息进行订购,最后实现该低价票的加价转售。如果未在航空公司规定的账期内找到真正客源,机票代理公司会在订单失效前再追加虚假身份订单,继续“霸占”该低价票,如此反复,直至找到真正客源售出为止。这个脚本目前只能刷一趟车的,人数可以是多个,支持选取作为类型等。小睿给您分享一下爬虫抢票的源码!实现思路是splinter.browser模拟浏览器登陆和操作,由于12306的验证码不好自动识别,所以,验证码需要用户进行手动识别,并进行登陆操作,之后的事情,就交由脚本来操作就可以了,下面是我测试时候的一些截图:第一步:如下图,首先输入抢票基本信息

ae6ef5231b9fe326fd48929060805476.png

抢票信息

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

d3adb893565696802e3e3c40bef47726.png

12306登录

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

 5812dec5c76e849ad24a8bab241153fb.png

12306抢票

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

13a5b67d53e1a651233176d447164780.png 

云服务器抢票过程

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 = '[email protected]'  # 你的发件邮箱号码

    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:2020-01-02

"""

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 im

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值