生产环境中Selenium是否仅支持无头模式?如何自动显示网球场可用性?
生产环境使用Selenium并非只能采用无头模式
无头模式只是资源占用更低、适合后台静默运行的优化选项,并非强制要求。如果需要可视化展示浏览器操作过程或查询结果,完全可以启动有界面的浏览器,前提是运行环境支持图形输出:
- 若服务器为Linux系统,可安装
Xvfb虚拟显示服务,让浏览器在虚拟桌面中运行,同时通过VNC等工具远程查看界面; - 若使用带桌面环境的云服务器(如Windows Server、带GNOME/KDE的Linux服务器),直接启动普通浏览器即可。
网球场可用情况查询的实现方案
不管用无头还是有头模式,核心流程都是用Selenium自动完成查询操作、提取可用场地信息,再将结果展示出来。
方案1:有头浏览器直接展示操作与结果
如果需要直观看到浏览器的查询过程,直接启动普通浏览器即可,Python示例代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 启动有头Chrome浏览器 driver = webdriver.Chrome() driver.get("目标网球场预订网站地址") # 自动输入查询日期 date_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "date-input")) ) date_input.send_keys("2024-06-15") # 选择查询时间段 time_select = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "time-select")) ) time_select.select_by_value("14:00-16:00") # 点击查询按钮 search_btn = driver.find_element(By.ID, "search-btn") search_btn.click() # 等待结果加载并提取可用场地信息 available_courts = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "available-court")) ) # 打印结果并保持浏览器打开 print("可用网球场:") for court in available_courts: print(court.text) input("按回车键关闭浏览器...") driver.quit()
方案2:无头模式运行,提取结果后单独展示
如果想用无头模式节省资源,无需展示浏览器操作,可提取查询结果后通过HTML报告、命令行输出或消息通知等方式展示,Python示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置无头Chrome浏览器 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920x1080") driver = webdriver.Chrome(options=chrome_options) driver.get("目标网球场预订网站地址") # 自动完成查询操作(逻辑与有头模式一致) date_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "date-input")) ) date_input.send_keys("2024-06-15") time_select = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "time-select")) ) time_select.select_by_value("14:00-16:00") search_btn = driver.find_element(By.ID, "search-btn") search_btn.click() # 提取可用场地信息 available_courts = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "available-court")) ) # 生成HTML报告保存结果 result_html = """ <html> <head><title>网球场可用情况</title></head> <body> <h1>2024-06-15 14:00-16:00 可用网球场</h1> <ul> """ for court in available_courts: result_html += f"<li>{court.text}</li>" result_html += """ </ul> </body> </html> """ with open("tennis_court_availability.html", "w", encoding="utf-8") as f: f.write(result_html) driver.quit()
注意事项
- 确认目标网站无反爬机制(如验证码、IP封禁),必要时可添加
time.sleep()等待、配置代理或模拟真实用户操作(如随机滚动页面); - 生产环境可将脚本设置为定时任务(如Linux的
cron、Windows任务计划),定期自动查询并推送结果。
内容的提问来源于stack exchange,提问作者Topotan
相关产品推荐
相关产品推荐

