小工具知识网

当前位置: 首页 > 行业知识 > python爬虫(三)12306自动抢票--- selenium

行业知识

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

2026-10-26 21:51:43 来源:互联网转载

往期目录

一、

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

然后输入 pip install selenuim  下载selenuim

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

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

​

   然后下载谷歌驱动 chomedriver 下载​

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

​

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

解释器在哪这种问题 你pip 的时候就会显示出来你的这个下载的地址就是你解释器大概的位置找一下就有了​

 -

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

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

​

二、selenium部分代码解读

selenium使用方法大全

本文只需要使用到

定位

点击

输入

清空

定位:

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

wb.implicitly_wait(30) :个人理解为每次定位点击等操作可以有30秒以内的误差时间 比如网页跳转需要时间 在这段时间内没有定位到元素会显示报错

find_element:查找元素的意思

By.XPATH:就是按照xpath定位网页中的元素

元素:可以在控制台找到右键有一个copy xpath/ full xpath 如下图

点击:

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

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

输入:

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

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

清空:

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

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

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

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

 三、开始操作

代码实现:

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, '//*[@]').click()driver.find_element(By.XPATH, '//input[@]').send_keys(from_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').send_keys(to_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').clear()driver.find_element(By.XPATH, '//*[@]').send_keys(tomorrow)driver.find_element(By.XPATH, '//a[@]').click()driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了

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

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

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

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


抢票代码

import timefrom datetime import date, timedeltafrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.action_chains import ActionChainsfrom pprint import pprintfrom tabulate import tabulatedef 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, '//*[@]').click()driver.find_element(By.XPATH, '//input[@]').send_keys(from_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').send_keys(to_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').clear()driver.find_element(By.XPATH, '//*[@]').send_keys(tomorrow)driver.find_element(By.XPATH, '//a[@]').click()driver.switch_to.window(driver.window_handles[-1])  #点击完会打开新的页面 然后要跳转到新的页面去开始我们下一步的操作 没有的话你会卡在第一个窗口 后续代码运行不了before = time.time()driver.find_element(By.XPATH,'/html/body/p[2]/p[8]/p[9]/table/tbody/tr[1]/td[13]/a').click()sleep(0.5)driver.find_element(By.XPATH,'//*[@]').send_keys('账号')driver.find_element(By.XPATH,'//*[@]').send_keys('密码')driver.find_element(By.XPATH,'//*[@]').click()sleep(0.5)driver.find_element(By.XPATH,'//*[@]').click()driver.find_element(By.XPATH,'/html/body/p[4]/p[2]/p[2]/p[2]/a[2]').click()driver.find_element(By.XPATH,'//*[@]').click()  # 确认购买sleep(0.5)driver.find_element(By.XPATH,'/html/body/p[6]/p/p[5]/p[1]/p/p[2]/p[2]/p[9]/a[2]').click()#确认购买

爬取数据代码

import timefrom datetime import date, timedeltafrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.action_chains import ActionChainsfrom pprint import pprintfrom tabulate import tabulatedef 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, '//*[@]').click()driver.find_element(By.XPATH, '//input[@]').send_keys(from_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').send_keys(to_station)driver.find_element(By.XPATH, '//*[@]').click()driver.find_element(By.XPATH, '//*[@]').clear()driver.find_element(By.XPATH, '//*[@]').send_keys(tomorrow)driver.find_element(By.XPATH, '//a[@]').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'//*[@]/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/p[2]/p[8]/p[9]/table/tbody/tr[{i}]').text            if k == '':                pass            else:                data.append(k)                index.append(data)    except:        breakpprint(index)print(tabulate(index,headers='firstrow', tablefmt='grid'))

 带ui的代码和ui

from PySide2.QtUiTools import QUiLoaderfrom PySide2.QtWidgets import QApplication,QMainWindow,QPushButton,QPlainTextEdit,QMessageBoximport smtplibimport timeimport timefrom datetime import date, timedeltafrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepclass 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, '//*[@]').click()        driver.find_element(By.XPATH, '//input[@]').send_keys(from_station)        driver.find_element(By.XPATH, '//*[@]').click()        driver.find_element(By.XPATH, '//*[@]').send_keys(to_station)        driver.find_element(By.XPATH, '//*[@]').click()        driver.find_element(By.XPATH, '//*[@]').clear()        driver.find_element(By.XPATH, '//*[@]').send_keys(tomorrow)        driver.find_element(By.XPATH, '//a[@]').click()        driver.switch_to.window(driver.window_handles[1])        driver.find_element(By.XPATH,'//*[@]').click()        driver.find_element(By.XPATH,'//*[@]/td[13]/a').click()        sleep(0.5)        driver.find_element(By.XPATH,'//*[@]').send_keys('账号')        driver.find_element(By.XPATH,'//*[@]').send_keys('密码')        driver.find_element(By.XPATH,'//*[@]').click()        sleep(0.5)        driver.find_element(By.XPATH,'//*[@]').click()        driver.find_element(By.XPATH,'/html/body/p[4]/p[2]/p[2]/p[2]/a[2]').click()        driver.find_element(By.XPATH,'//*[@]').click()  # 确认购买        sleep(0.5)        # driver.find_element(By.XPATH,'/html/body/p[6]/p/p[5]/p[1]/p/p[2]/p[2]/p[8]/a[2]').click()#确认购买        before = time.time()        print(now - before)

ui代码 

 MainWindow          0    0    800    600          MainWindow                      40      160      351      271                              710      520      93      28                  开始                         450      160      251      271                                       姓名                                                            身份证号                                            12306的账号                                            12306的密码                                         0     0     800     26              

上一篇:点歌服务器怎么开?

下一篇:揭秘Tina下载攻略,轻松获取,无忧操作!