当前位置: 首页 > news >正文

12306爬取基本车次信息(需下载chromedriver)

from selenium import webdriver
from selenium.webdriver.common.by import By
import re
import time
import csv
import pandas as pd
import sys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import os

def request(fromCity,toCity):
def getDriver():
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")#禁用沙盒模式
chrome_options.add_argument("--disable-dev-shm-usage")#禁用/dev/shm使用
#chrome_options.add_argument("--headless")#浏览器隐藏运行
#设置选项参数
service = Service("chromedriver.exe")
driver = webdriver.Chrome(service=service,options=chrome_options)#修改为自己电脑中chromedriver的路径
return driver

def downhandle(ccity):pattern = re.compile(r"[^\u4e00-\u9fa5]")#剔除非汉字模式for i in range(0,6):try:getCity = driver.find_element(By.ID,"citem_%d"%(i))#获取下拉框选定城市select=re.sub(pattern,"",getCity.text)#提取中文城市名if select==ccity:getCity.click()#获取城市名breakexcept Exception:pass##下拉框城市名获取处理
dateTime = time.strftime("%m-%d",time.localtime())#获取当前日期
url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=,SHH&ts=,TJP&date=2024-%s&flag=N,N,Y"%dateTime 
driver = getDriver()
driver.get(url)driver.find_element(By.ID,"fromStationText").clear()
driver.find_element(By.ID,"toStationText").clear()
##清除文本框driver.find_element(By.ID,"fromStationText").send_keys(fromCity)#发送出发城市
time.sleep(0.2)#等待下拉框加载选择
downhandle(fromCity)
driver.find_element(By.ID,"toStationText").send_keys(toCity)#发送目的城市
time.sleep(0.2)#..
downhandle(toCity)
time.sleep(0.5)
driver.find_element(By.ID,"query_ticket").click()#点击查询
time.sleep(0.2)
##城市车次查询allNumbers=[]#车次名列表
Starts=[]#起点站列表
Terminals=[]#到达站列表
startTimes=[]#出发时间列表
endTimes=[]#到达时间列表
totalTime=[]#历时列表
try:numbercount = len(driver.find_elements(By.CLASS_NAME,"number"))#获取车次总数i=0while(numbercount>i):time.sleep(0.2)number = driver.find_elements(By.XPATH,"//a[@class='number']")[i].text#获取车次名start = driver.find_elements(By.XPATH,"//div[@class='cdz']")[i].text#获取起点站名terminal = (driver.find_elements(By.XPATH,"//div[@class='cdz']")[i].text).replace(start,"")#获取到达站名startT = driver.find_elements(By.XPATH,"//div[@class='cds']")[i].text#获取出发时间endT = (driver.find_elements(By.XPATH,"//div[@class='cds']")[i].text).replace(startT,"")#获取到达时间total = driver.find_elements(By.XPATH,"//div[@class='ls']")[i].text#获取历时allNumbers.append(number)#添加车次名Starts.append(start)#添加起点站名Terminals.append(terminal)#添加到达站名startTimes.append(startT)#添加出发时间endTimes.append(endT)#添加到达时间totalTime.append(total)#添加历时i+=1
except Exception:passwith open("data.csv","w+",encoding="utf-8"):#创建csv文件pass
data = {"车次":allNumbers,"出发站":Starts,"到达站":Terminals,"出发时间":startTimes,"到达时间":endTimes,"历时:":totalTime}
dataFrame = pd.DataFrame(data)
dataFrame.to_csv(r"data.csv",encoding="utf_8_sig")
print("已生成车次信息xlsx表格!")
time.sleep(1)
sys.exit()##按列写入车次数据

def main():
while True:
fromCity=input("请输入起点站:")
toCity=input("请输入到达站:")
if fromCity != "" and toCity != "":
request(fromCity,toCity)
else:
print("站名不能为空!")
#获取城市名

if name == "main":
main()

http://www.rkmt.cn/news/78087.html

相关文章:

  • Flask集成MCP的AI Agent
  • 深入解析:OpenAI 新推 GPT-5-Codex-Mini:一款针对开发者的轻量级编码助手
  • rustfs
  • 日总结 37
  • 环境配置
  • RustFS是国产的吗?有人用吗?深度解析这款新兴对象存储
  • 软件工程学习日志2025.12.8
  • 视频号下载视频思路 - 教程
  • 中国鱼竿十大名单——2025年十大良心鱼竿精选:鱼竿名单第一名到第十名
  • 深入解析:Mybatis Dynamic Sql
  • 深入解析:【系统架构设计】用例技术:需求分析的实用工具
  • 割点
  • 2025.12.01~2025.12.07
  • MySQL怎么保证高可用
  • 2025钓鱼竿品牌前十名,口碑好的牌子都在这:耐用款合集
  • ## AI浪潮下的冷思考:技术、泡沫与我们的未来
  • CVE-2025-10971:敏感信息不安全存储漏洞深度解析
  • Steger 脊线提取算法原理
  • 异动拉升横盘突破筛选股票
  • 过碳酸钠生产厂家盘点:靠谱过碳酸钠厂家、优质供应商、制造商汇总
  • 国内生产过碳酸钠的厂家有哪些?质量好的过碳酸钠厂家盘点
  • 像Git一样管理数据:深入解析数据库并发控制MVCC的实现
  • Classic Papers in Programming Languages and Logic | 阅读计划
  • CodeBuddy AI IDE:全栈AI创建平台实战
  • 廊坊婚介所见证:放下挑剔的女人,幸福来得很快
  • 12-8午夜盘思
  • 陈阅视觉摄影培训机构发展历程
  • 【AI】第一篇:语言模型的前世 n-gram的简单介绍
  • 【12.11 直播】时序数据库 IoTDB FAQ 全面解答|下一期聊什么?你来决定!
  • 12/8