Selenium定位Spotify登录按钮失败及免登录爬取方案咨询
解决Spotify榜单爬取的两个问题
一、修复Selenium定位登录按钮的错误
你遇到的NoSuchElementException有两个核心原因:
- 原代码定位的是
button标签,但实际登录按钮是a标签,标签类型匹配错误 - 页面加载需要时间,代码未等待元素加载完成就执行查找操作
更稳定的定位方式
优先使用data-testid属性定位,这个属性专为测试场景设计,比动态变化的class属性更可靠:
- CSS选择器:
a[data-testid="charts-login"] - XPath:
//a[@data-testid="charts-login"]
加上显式等待逻辑
通过WebDriverWait等待元素可点击,避免因页面未加载完成导致的报错。修改后的完整代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC website = 'https://charts.spotify.com/charts/view/citytoptrack-barcelona-weekly/2024-02-29' path = '/home/isaac/chromedriver/chromedriver' service = Service(executable_path=path) driver = webdriver.Chrome(service=service) driver.get(website) # 等待登录按钮可点击,最长等待10秒 login_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[data-testid="charts-login"]')) ) login_btn.click()
二、无需登录直接爬取榜单数据的方法
Spotify图表页面的榜单数据是通过异步API请求加载的,你可以直接抓取后台接口,完全跳过登录流程:
- 打开目标页面,按F12打开开发者工具,切换到「Network」标签
- 筛选「XHR」类型请求,找到类似
https://charts.spotify.com/api/charts/view/citytoptrack-barcelona-weekly/2024-02-29的接口 - 用
requests库直接请求该接口,即可获取JSON格式的原始榜单数据
示例代码:
import requests url = 'https://charts.spotify.com/api/charts/view/citytoptrack-barcelona-weekly/2024-02-29' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) data = response.json() # 提取并打印榜单信息 for track in data['tracks']: print(f"排名: {track['chartEntry']['position']}") print(f"歌曲名: {track['trackName']}") print(f"歌手: {track['artists'][0]['name']}") print(f"播放量: {track['chartEntry']['streams']}") print("---")
这种方法比Selenium效率更高,无需处理登录交互,适合批量爬取多期榜单数据。
内容的提问来源于stack exchange,提问作者isaacmunoz
相关产品推荐
相关产品推荐

