python爬虫 -- 12306登录刷票

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

from splinter.browser import Browser
from time import sleep
import traceback
# Message: 'phantomjs' executable needs to be in PATH.
#    geckodriver 要自行下载
#    phantomjs 自行下载
# we need:
# sudo mv geckodriver /usr/local/bin/
# 1. 自动识别验证码--文字 图片等
# 2. 选择: G?D?C? 靠窗?走廊? 二等座?头等座?
# 3. 12306的验证码是一个jpg,如果你是通过url获取这个图片,会和登陆界面的不同,由随机因子产生的.通过截图方式来解析:
#      识别文字: 转换为图片中的图画,给个位置然后触发click事件
#初始化信息
# 用户名,密码
username = u"username@mail.cn"
passwd = u"yourpassword"
# cookies值: 页面信息--安全--查看cookies
shenzhen = u"%u6DF1%u5733%2CSZQ" #深圳
wuhan = u"%u6B66%u6C49%2CWHN" #武汉
yueyangdong = u"%u5CB3%u9633%u4E1C%2CYIQ" #岳阳东
#shanghai = u"%u4E0A%u6D77%2CSHH" #上海
#taiyuan = u"%u592A%u539F%2CTYV" # 太原
#hangzhou = u"%u676D%u5DDE%u4E1C%2CHGH" #杭州东
starts = shenzhen
ends = yueyangdong
# 时间格式2018-01-02
dtime = u"2018-02-10"
# 车次,选择第几趟,0则从上之下依次点击
order = 0
###乘客名,如果是自己,则上面有个链接是自己的,会跳转到个人中心,用index[1]
#如果乘客不是自己,则用index[0]
pa = u"张三"
###乘客名
users = [u"张三", u"李四"]

"""网址"""
ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
login_url = "https://kyfw.12306.cn/otn/login/init"
initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"


def login():
    #点击登录,从购票页面调到了登录页面
    b.find_by_text(u"登录").click()
    sleep(3)
    #给name为loginUserDTO.user_name附上用户名
    #也可以用Id查找的方法b.find_by_id(‘username‘).fill(username)
    b.fill("loginUserDTO.user_name", username)
    sleep(1)
    #给name为userDTO.password值
    b.fill("userDTO.password", passwd)
    sleep(1)
    # 手动输入验证码, 自动验证的方式还在研究中: a.获取图片验证码(截图方式,应该是不能通过获取图片的链接地址来获取图片?,或者其他方式:cookies/session? b.解析图片验证码(通过位置?还是真正意义的图像识别?) 
    # 了解下ocr( tesseract-ocr), pytesseract?CNN卷积神经网络?
    print u"等待验证码,自行输入..."
    #检测页面是否跳转(用户是否输入了验证码并且提交)
    while True:
        if b.url != initmy_url:
            sleep(1)
        else:
            break

def huoche():
    global b
#    b = Browser(driver_name="firefox", executable_path="/usr/bin/firefox")
    b = Browser(driver_name="firefox")
    print u"访问12306..."
    b.visit(ticket_url)

    #查找带登录的字符串,u是避免中文报错
    while b.is_text_present(u"登录"):
        sleep(1)
        #如果存在调用登录方法
        login()
        if b.url == initmy_url:
            break
        #当执行完login方法后,登录成功,继续向下执行
    try:
        print u"购票页面..."
        # 跳回购票页面
        b.visit(ticket_url)

        # 加载查询信息
        b.cookies.add({"_jc_save_fromStation": starts})
        b.cookies.add({"_jc_save_toStation": ends})
        b.cookies.add({"_jc_save_fromDate": dtime})
        b.reload()

        sleep(2)
        # 增加过滤条件,,,
        b.find_by_text(u"GC-高铁/城际").click()
        count = 0
        # 循环点击预订
        #order=0则从第一班车开始全部一次预订
        if order != 0:
            #如果页面没有跳转到,说明没有抢到票,继续抢票
            while b.url == ticket_url:
                #点击查询进行刷新
                b.find_by_text(u"查询").click()
                count +=1
                print u"循环点击查询... 第 %s 次" % count
                sleep(1)
                try:
                    #点击预订的那班车
                    b.find_by_text(u"预订")[order - 1].click()
                except:
                    print u"还没开始预订"
                    continue
        else:
            while b.url == ticket_url:
                b.find_by_text(u"查询").click()
                count += 1
                print u"循环点击查询... 第 %s 次" % count
                sleep(1)
                try:
                    #从第一个开始一次预订
                    for i in b.find_by_text(u"预订"):
                        i.click()
                except:
                    print u"还没开始预订"
                    continue
        sleep(1)
        print u"开始选择用户..."
        for user in users:
            b.find_by_text(user).last.click()
        #for user in self.users:
        #    b.find_by_text(user).last.click()
        print u"提交订单..."
        sleep(1)
        b.find_by_text(u"提交订单").click()
        sleep(0.5)
        b.find_by_text(u"确认").click()#此处是脚本,待改善
        #若循环结束了,则选择联系人
        #b.find_by_text(pa)[0].click()
        print  u"能做的都做了.....不再对浏览器进行任何操作"
    except Exception as e:
        print(traceback.print_exc())

if __name__ == "__main__":
    huoche()


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

# 仅可用来爬取数据后来进行测试分析
#import ssl
import urllib2
import time

i=1
while(1):
    print "开始捕获第%s张图片" % str(i)
    #if hasattr(ssl, '_create_unverified_context'):
    #    ssl._create_default_https_context = ssl._create_unverified_context
    #ssl._create_default_https_context = ssl._create_unverified_context
    #req = urllib2.Request("https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.03777190844118017")
    req = urllib2.Request("https://kyfw.12306.cn/passport/captcha/captcha-image?*")
    u = urllib2.urlopen(req)
    data = u.read()
    print "捕获中.........."
    with open("CodePng20180119-"+str(i)+".jpg", 'wb') as f:
        time.sleep(2)
        f.write(data)
        i += 1
        print "捕获结束!"
# python3中使用 urllib.request 代替urllib2

补充下: 获取验证码,用于今后自动识别的源.




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值