当前位置: 首页 > 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.jsqmd.com/news/67558/

相关文章:

  • 微信小程序渗透测试
  • 大数据数仓设计:分层架构与维度建模 - Binge
  • 2025年折弯机上下模实力厂家推荐榜
  • Day14-20251208
  • 遇到的前端ts语法问题记录 - wuzx
  • Flask集成MCP的AI Agent
  • 阅读笔记四
  • 从纯数学到应用AI科学的职业转变
  • 深入解析:OpenAI 新推 GPT-5-Codex-Mini:一款针对开发者的轻量级编码助手
  • rustfs
  • threadDay01
  • 20232404 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • Python数据可视化全攻略:Matplotlib/Seaborn从入门到实战
  • 2025.12.7 百度之星决赛 2025
  • 日总结 37
  • 深入设计模式
  • 环境配置
  • 工程模拟分析软件 Abaqus 2024 免费下载安装教程(含中文版设置+ 激活步骤)
  • RustFS是国产的吗?有人用吗?深度解析这款新兴对象存储
  • 软件工程学习日志2025.12.8
  • 视频号下载视频思路 - 教程
  • 2025.12.1周总结
  • 小爱帮你拍-使用教程
  • 中国鱼竿十大名单——2025年十大良心鱼竿精选:鱼竿名单第一名到第十名
  • 2025新手买钓鱼竿指南:高性价比品牌推荐,避坑看这篇
  • 深入解析:Mybatis Dynamic Sql
  • 20232403 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 20232421 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 深入解析:【系统架构设计】用例技术:需求分析的实用工具
  • 20251206 - 并查集 总结