python爬虫(三)12306自动抢票--- selenium

这篇具有很好参考价值的文章主要介绍了python爬虫(三)12306自动抢票--- selenium。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

往期目录

一、

python爬虫入门篇https://blog.csdn.net/weixin_64050468/article/details/130501830?spm=1001.2014.3001.5501

二 、

python爬虫入门篇https://blog.csdn.net/weixin_64050468/article/details/130583771?spm=1001.2014.3001.5501


文章目录

前言

一、按照selenuim模块+配置+可能报错解释

二、selenium部分代码解读

 三、开始操作

抢票代码

爬取数据代码


前言

后面文章主打用爬虫整活了 边学边玩


一、安装selenuim模块+配置+可能报错解释

win + r 打开cmd

爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

然后输入 pip install selenuim  下载selenuim

如果显示没有pip 那么你的环境没配好  可以看看这个问题解决 虽然比较老但是操作是一样的

先确定谷歌版本 我的就是113.0.5672.127 64位版本的 但是只有32位能下载也能用

爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

   然后下载谷歌驱动 chomedriver 下载爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

 随便哪个都可以 我的是window系统的就选这个了

爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

 然后解压到你的解释器下面

解释器在哪这种问题 你pip 的时候就会显示出来你的这个下载的地址就是你解释器大概的位置找一下就有了爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

 -

然后试试这段代码 应该就能看到这么个页面了

import time
from selenium import webdriver

driver = webdriver.Chrome() # 启动浏览器
driver.get("https://www.baidu.com") # 打开某个网址
time.sleep(10)
driver.quit()   # 关闭浏览器

爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

二、selenium部分代码解读

selenium使用方法大全

本文只需要使用到
定位
点击
输入
清空

定位:

wb = webdriver.Chrome()
wb.implicitly_wait(30) 
wb.get('https://laicj.cn/#/') #网址
wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[1]/div[1]/textarea')

wb.implicitly_wait(30) :个人理解为每次定位点击等操作可以有30秒以内的误差时间 比如网页跳转需要时间 在这段时间内没有定位到元素会显示报错
find_element:查找元素的意思
By.XPATH:就是按照xpath定位网页中的元素
元素:可以在控制台找到右键有一个copy xpath/ full xpath 如下图
爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

点击:

wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[1]/button').click()

在定位元素后面直接加.click()

输入:

wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[1]/div[1]/textarea').send_keys(f'{data_msg}')

在定位元素后面直接加.send_key(‘内容’)

清空:

wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[1]/div[1]/textarea').clear()

在定位元素后面直接加.clear()

最后我在源代码中加入了判断语句 为的是判断ai是否写完 如果写完则返回内容

    def yes_or_no():
        a = wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[2]/div/p')
        time.sleep(10)
        b = wb.find_element(By.XPATH,'/html/body/div/section/main/div/div[1]/div[2]/div/p')
        if a == b:
            return a.text

 三、开始操作

爬虫抢票,爬虫入门到进阶,python,爬虫,selenium,chrome

代码实现:

def date_n(n):#获取时间函数
    return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))
from_station, to_station = '佛山西', '广州北'
tomorrow = date_n(1)
print(tomorrow)
driver = webdriver.Chrome()
driver.maximize_window() #窗口最大
driver.implicitly_wait(5) #允许有五秒的寻找时间
driver.get('https://www.12306.cn/index/')
driver.find_element(By.XPATH, '//*[@id="fromStationText"]').click()
driver.find_element(By.XPATH, '//input[@id="fromStationText"]').send_keys(from_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="toStationText"]').send_keys(to_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="train_date"]').clear()
driver.find_element(By.XPATH, '//*[@id="train_date"]').send_keys(tomorrow)
driver.find_element(By.XPATH, '//a[@id="search_one"]').click()
driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了

 driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了

 后续就是看你们要抢哪一个票 或者爬取数据也可以 如果真的想做好 我觉得应该把数据爬下来做成表然后给用户选择输入最好 当然我这只是做一个简单的讲解就不想做这么深了

当然结尾提供了两个代码 可以试试去整合起来做成一个exe

以前做个一个带ui的 但是由于网页的更新 应该是不能运行了 下次如果有用pyside2的话再说吧


抢票代码

import time
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from pprint import pprint
from tabulate import tabulate



def date_n(n):#获取时间函数
    return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))
from_station, to_station = '佛山西', '广州北'
tomorrow = date_n(1)
print(tomorrow)
driver = webdriver.Chrome()
driver.maximize_window() #窗口最大
driver.implicitly_wait(5) #允许有五秒的寻找时间
driver.get('https://www.12306.cn/index/')
driver.find_element(By.XPATH, '//*[@id="fromStationText"]').click()
driver.find_element(By.XPATH, '//input[@id="fromStationText"]').send_keys(from_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="toStationText"]').send_keys(to_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="train_date"]').clear()
driver.find_element(By.XPATH, '//*[@id="train_date"]').send_keys(tomorrow)
driver.find_element(By.XPATH, '//a[@id="search_one"]').click()
driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了
before = time.time()

driver.find_element(By.XPATH,'/html/body/div[2]/div[8]/div[9]/table/tbody/tr[1]/td[13]/a').click()
sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="J-userName"]').send_keys('账号')
driver.find_element(By.XPATH,'//*[@id="J-password"]').send_keys('密码')
driver.find_element(By.XPATH,'//*[@id="J-login"]').click()
sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="normalPassenger_0"]').click()
driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[2]/div[2]/a[2]').click()
driver.find_element(By.XPATH,'//*[@id="submitOrder_id"]').click()  # 确认购买
sleep(0.5)
driver.find_element(By.XPATH,'/html/body/div[6]/div/div[5]/div[1]/div/div[2]/div[2]/div[9]/a[2]').click()#确认购买

爬取数据代码

import time
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from pprint import pprint
from tabulate import tabulate



def date_n(n):#获取时间函数
    return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))
from_station, to_station = '佛山西', '广州北'
tomorrow = date_n(1)
print(tomorrow)
driver = webdriver.Chrome()
driver.maximize_window() #窗口最大
driver.implicitly_wait(5) #允许有五秒的寻找时间
driver.get('https://www.12306.cn/index/')
driver.find_element(By.XPATH, '//*[@id="fromStationText"]').click()
driver.find_element(By.XPATH, '//input[@id="fromStationText"]').send_keys(from_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="toStationText"]').send_keys(to_station)
driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
driver.find_element(By.XPATH, '//*[@id="train_date"]').clear()
driver.find_element(By.XPATH, '//*[@id="train_date"]').send_keys(tomorrow)
driver.find_element(By.XPATH, '//a[@id="search_one"]').click()
driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了
index = []
mid = []
for i in range(1,17):
    mid.append(driver.find_element(By.XPATH,f'//*[@id="float"]/th[{i}]').text)
index.append(mid.copy())
mid.clear()
for i in range(1,1000):
    data = []
    try:
        for p in range(5):
            k = driver.find_element(By.XPATH,f'/html/body/div[2]/div[8]/div[9]/table/tbody/tr[{i}]').text
            if k == '':
                pass
            else:
                data.append(k)
                index.append(data)
    except:
        break
pprint(index)
print(tabulate(index,headers='firstrow', tablefmt='grid'))

 带ui的代码和ui

from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication,QMainWindow,QPushButton,QPlainTextEdit,QMessageBox
import smtplib
import time
import time
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


class email:
    def __init__(self):
        self.ui = QUiLoader().load('12306.ui')
        self.ui.button.clicked.connect(self.start)
    def start(self):
        name = self.ui.lineEdit.text()
        time = self.ui.dateTimeEdit.text()
        cookie = self.ui.lineEdit_4.text()
        zh_12306 = self.ui.lineEdit_3.text()
        mm_12306 = self.ui.lineEdit_2.text()
        now = time.time()

        def date_n(n):
            return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))

        from_station, to_station = '佛山西', '广州北'
        tomorrow = date_n(1)
        print(tomorrow)
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get('https://www.12306.cn/index/')
        driver.find_element(By.XPATH, '//*[@id="fromStationText"]').click()
        driver.find_element(By.XPATH, '//input[@id="fromStationText"]').send_keys(from_station)
        driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
        driver.find_element(By.XPATH, '//*[@id="toStationText"]').send_keys(to_station)
        driver.find_element(By.XPATH, '//*[@id="citem_0"]').click()
        driver.find_element(By.XPATH, '//*[@id="train_date"]').clear()
        driver.find_element(By.XPATH, '//*[@id="train_date"]').send_keys(tomorrow)
        driver.find_element(By.XPATH, '//a[@id="search_one"]').click()
        driver.switch_to.window(driver.window_handles[1])
        driver.find_element(By.XPATH,'//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
        driver.find_element(By.XPATH,'//*[@id="ticket_66000K924704_06_07"]/td[13]/a').click()
        sleep(0.5)
        driver.find_element(By.XPATH,'//*[@id="J-userName"]').send_keys('账号')
        driver.find_element(By.XPATH,'//*[@id="J-password"]').send_keys('密码')
        driver.find_element(By.XPATH,'//*[@id="J-login"]').click()
        sleep(0.5)
        driver.find_element(By.XPATH,'//*[@id="normalPassenger_0"]').click()
        driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[2]/div[2]/a[2]').click()
        driver.find_element(By.XPATH,'//*[@id="submitOrder_id"]').click()  # 确认购买
        sleep(0.5)
        # driver.find_element(By.XPATH,'/html/body/div[6]/div/div[5]/div[1]/div/div[2]/div[2]/div[8]/a[2]').click()#确认购买
        before = time.time()
        print(now - before)

ui代码 文章来源地址https://www.toymoban.com/news/detail-720400.html

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QTextBrowser" name="textBrowser">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>160</y>
      <width>351</width>
      <height>271</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>710</x>
      <y>520</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>开始</string>
    </property>
   </widget>
   <widget class="QWidget" name="">
    <property name="geometry">
     <rect>
      <x>450</x>
      <y>160</y>
      <width>251</width>
      <height>271</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QLineEdit" name="lineEdit">
       <property name="text">
        <string>姓名</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QDateTimeEdit" name="dateTimeEdit"/>
     </item>
     <item>
      <widget class="QLineEdit" name="lineEdit_4">
       <property name="text">
        <string>身份证号</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLineEdit" name="lineEdit_3">
       <property name="text">
        <string>12306的账号</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLineEdit" name="lineEdit_2">
       <property name="text">
        <string>12306的密码</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

到了这里,关于python爬虫(三)12306自动抢票--- selenium的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python编写一个多线程的12306抢票程序

    国庆长假即将到来,大家纷纷计划着自己的旅行行程。然而,对于很多人来说,抢购火车票人们成了一个令人头疼的问题。12306网站的服务器经常因为流量高而崩溃,导致抢票变得越来越严重异常困难。 首先,让我们来了解一下12306抢票的难点。由于很多人都在同一时间段内

    2024年02月07日
    浏览(44)
  • 基于Python和Selenium的大麦网自动抢票脚本

    自动化抢票的脚本,需通过Selenium库来实现自动化操作。(学习参考) 优化后的完整代码: 需要注意的: 我用了 with 语句保证浏览器实例在函数结束后正确关闭。 我用了几个 try-except 块处理在各个步骤可能出现的异常,它可以在异常的时候打印出错误的信息。 我把大部分代

    2024年02月11日
    浏览(30)
  • 爬虫日常练习-selenium登录12306

    hello,好兄弟们。经过前面几篇文章后,想必小伙伴们对于简单的网页文本爬取,图片爬取类的内容已经熟练掌握了。今天我们开始练习一个新的内容:selenium。有关这一块的基础知识网上太多了,我们作为进阶的练习文章就不在这里从基础说起了。直接上实际案例,与大家分

    2024年02月05日
    浏览(32)
  • 爬虫日常-selenium登录12306,绕过验证

    hello兄弟们,这里是无聊的网友。愉快的周末过去了,欢迎回到学习频道。书接上文,我们说到了再用selenium登录12306时遇到了滑块验证的问题。当前的网站几乎每家都会在登录模块添加一个认证,来规避各种爬虫,而我们则不断的去想办法绕过这些验证模块。目前一些简单的

    2024年02月07日
    浏览(34)
  • 【Python从入门到进阶】39、使用Selenium自动验证滑块登录

    接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能,首先我们来讲解如何进行滑块自动验证的操作。 我们要通过selenium来实现目前常见的滑块验证码的验证,

    2024年02月08日
    浏览(37)
  • Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解

    是否还在为网页测试而烦恼?是否还在为重复的点击、等待而劳累?试试强大的 Selenium !让你的网页自动化测试变得轻松有趣! Selenium 是一个强大的自动化测试工具,它可以让你直接操控浏览器,完成各种与网页交互的任务。通过使用 Python 的 Selenium 库,你可以高效地实现

    2024年02月10日
    浏览(36)
  • 爬虫日常-12306自动购票程序

    hello兄弟们,最近在钻研新鲜知识,一不留神没想起来更新。今天我们顺着前面几篇文章完整的写出一篇12306的自动购票软件。 首先把我们已经写完的前期步骤代码再顺一遍 在前面几篇文章中,我们实现了自动打开浏览器并且完成登录以及绕过验证码操作。 完成这些步骤后,

    2023年04月21日
    浏览(30)
  • 爬虫练习-12306自动购票升级版

    hello兄弟们,偷懒归来了。别问为啥这么久没更,问就是失踪了 最近一直在学习Django以及爬虫进阶之类的知识,加上快期末了,一直没有想起来自己还有一个账号没有更新,sorry啦 言归正传,今天抽空把前面的文章升级了一下。这里先把整理好的代码提前放给大家 代码放上,

    2024年02月06日
    浏览(47)
  • 12306 抢票开源脚本登上热榜!

    本期推荐开源项目目录: 1. 12306 抢票软件 2. 企业级低代码平台 3. 提问的智慧 4. 开箱即用的 Douyin API 12306 抢票软件 十一黄金周又来了,每到这个期间总有一个开源项目登上开源热榜。12306 抢票脚本,基于 Python 开发,支持自动登录、准点预售、捡漏,智能候补、邮件通知。目

    2024年02月06日
    浏览(42)
  • 28. 实战:基于selenium实现12306自动购票

    目录 前言 目的 思路 代码实现 1. 进入登录界面,输入账号密码 2. 点击登录按钮,完成滑块验证 3. 在个人中心点击购票,跳转 4. 输入出发地、目的地,从控制台输入得到 5. 文本框输入出发日 6. 若是学生票则切换票型 7. 点击查询 8. 定位预定按钮,点击跳转购票页面 9. 选择

    2024年01月22日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包