python爬虫 -- 12306登录刷票

2023-11-09

# -*- 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

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




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫 -- 12306登录刷票 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐