网页爬取遇无href导出按钮:能否替代pynput获取NHL数据?
替代pynput模拟点击的更优方案
方案1:用Selenium直接定位元素点击
无需依赖屏幕坐标,直接通过元素的class属性定位按钮,用Selenium原生点击方法更可靠,不受窗口大小、设备分辨率变化影响。
修改后的代码:
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 import time # 初始化Chrome浏览器 driver = webdriver.Chrome(executable_path='somepath\chromedriver.exe') URL = 'https://www.nhl.com/stats/teams' driver.get(URL) # 显式等待导出按钮加载完成(比固定sleep更稳定) try: # 通过class定位导出按钮 export_button = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'styles__ExportIcon-sc-16o6kz0-0')) ) # 执行点击操作 export_button.click() finally: # 等待下载启动后关闭浏览器(可根据需求调整) time.sleep(3) driver.quit()
优势:
- 摆脱屏幕坐标依赖,适配不同设备和窗口状态
- 显式等待确保元素加载完成后再操作,避免页面加载慢导致的报错
- 无需额外安装
pynput库,仅依赖Selenium原生API
方案2:抓包获取直接下载链接
如果希望跳过浏览器模拟,可通过开发者工具抓包找到Excel导出的真实请求链接,用requests库直接下载,效率更高。
操作步骤:
- 打开目标页面,按F12打开开发者工具
- 切换到「网络」标签页,点击页面上的导出按钮
- 在请求列表中找到导出相关的接口(通常包含
export或xlsx关键词),复制完整请求URL和请求头(重点是Cookie和Referer) - 用
requests发送请求下载文件
示例代码:
import requests # 替换为抓包得到的真实下载链接 download_url = "https://www.nhl.com/stats/teams/export?format=xlsx&..." headers = { "Cookie": "你的页面Cookie", "Referer": "https://www.nhl.com/stats/teams" } response = requests.get(download_url, headers=headers) with open("nhl_teams_data.xlsx", "wb") as f: f.write(response.content)
注意事项:
- Cookie存在时效性,过期后需要重新抓包获取
- 部分网站的导出链接可能包含签名参数,需每次抓包更新
总结
优先选择方案1,实现简单且稳定性高;若追求无浏览器的高效下载,可采用方案2抓包获取直链。
内容的提问来源于stack exchange,提问作者Dominik Streibl
相关产品推荐
相关产品推荐

