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登录刷票 的相关文章

  • 如何检索分配给 Django 中的组的所有权限

    我正在执行一项任务来检索分配给 Django 中的组的一组权限 我可以使用以下代码获取创建的组 但无法使用它来获取分配给它们的权限 from django contrib auth models import Group Permissio
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 将多索引转换为行式多维 NumPy 数组。

    假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http pandas pydata org pandas docs stable advanced html gt gt gt df 0 1 2 3 fir
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • dask apply:AttributeError:“DataFrame”对象没有属性“name”

    我有一个参数数据框 并对每一行应用一个函数 该函数本质上是几个 sql queries 和对结果的简单计算 我正在尝试利用 Dask 的多处理 同时保持结构和界面 下面的例子有效并且确实有显着的提升 def get metrics row
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • 如何让 Streamlit 每 5 秒重新加载一次?

    我必须每 5 秒重新加载 Streamlit 图表 以便在 XLSX 报告中可视化新数据 如何实现这一目标 import streamlit as st import pandas as pd import os mainDir os pa
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 我可以在 if 语句中使用“as”机制吗

    是否可以使用as in if类似的声明with我们使用的 例如 with open tmp foo r as ofile do something with ofile 这是我的代码 def my list rtrn lst True if
  • 操作错误:尝试在 ubuntu 服务器中写入只读数据库

    我正在使用 FlaskApp 运行mod wsgi and apache2在 Ubuntu 服务器上 我尝试运行烧瓶应用程序localhost成功 然后部署到ubuntu服务器上 但是当我尝试更新数据库时 出现错误 Failed to up
  • 在不同的 GPU 上同时训练多个 keras/tensorflow 模型

    我想在 Jupyter Notebook 中同时在多个 GPU 上训练多个模型 我正在使用 4GPU 的节点上工作 我想将一个 GPU 分配给一个模型并同时训练 4 个不同的模型 现在 我通过 例如 为一台笔记本选择 GPU import
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐