You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium爬取Beatport Top100时元素定位失败问题求助

Beatport Top100爬虫元素定位问题修复

问题概述

开发Beatport Top100页面爬虫时,根元素div#__next可正常定位,但深层歌曲列表容器元素定位失败,抛出TimeoutException。

原代码

def scrape_beatport():
    user_agent = UserAgent().random
    chrome_options = Options()
    chrome_options.add_argument(f"user-agent={user_agent}")
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        driver.get('https://www.beatport.com/top-100')
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div#__next')))
        
        test1 = driver.find_elements(By.CSS_SELECTOR, 'div#__next')
        test2 = driver.fin_elements(By.CSS_SELECTOR, 'div.TracksList-style__Wrapper-sc-3fb03d50-8 bWXYsy row')
        
    finally:
        driver.quit()


if __name__ == '__main__':
    scrape_beatport()    

报错信息

Traceback (most recent call last):
  File "/Users/just/Documents/python/yt_test.py", line 84, in <module>
    scrape_beatport()    
    ^^^^^^^^^^^^^^^^^
  File "/Users/just/Documents/python/yt_test.py", line 71, in scrape_beatport
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.__next div.MainLayout-style__MainWrapper-sc-9f30c253-0 div div.MainLayout-style__Main-sc-9f30c253-1 main.MainLayout-style__MainContent-sc-9f30c253-2 div.TracksList-style__Wrapper-sc-3fb03d50-8')))
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/support/wait.py", line 105, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
Stacktrace:
0   chromedriver                        0x0000000105272940 chromedriver + 4368704
1   chromedriver                        0x000000010526add4 chromedriver + 4337108
2   chromedriver                        0x0000000104e8ec04 chromedriver + 289796
3   chromedriver                        0x0000000104ed0e00 chromedriver + 560640
4   chromedriver                        0x0000000104f095ec chromedriver + 792044
5   chromedriver                        0x0000000104ec5ab4 chromedriver + 514740
6   chromedriver                        0x0000000104ec650c chromedriver + 517388
7   chromedriver                        0x0000000105236e5c chromedriver + 4124252
8   chromedriver                        0x000000010523bc4c chromedriver + 4144204
9   chromedriver                        0x000000010521c824 chromedriver + 4016164
10  chromedriver                        0x000000010523c57c chromedriver + 4146556
11  chromedriver                        0x000000010520e2d8 chromedriver + 3957464
12  chromedriver                        0x000000010525bec4 chromedriver + 4275908
13  chromedriver                        0x000000010525c040 chromedriver + 4276288
14  chromedriver                        0x000000010526aa34 chromedriver + 4336180
15  libsystem_pthread.dylib             0x000000018a0bd034 _pthread_start + 136
16  libsystem_pthread.dylib             0x000000018a0b7e3c thread_start + 8

问题分析与修复方案

1. 拼写错误

原代码中driver.fin_elements是笔误,正确应为driver.find_elements。

2. CSS选择器错误

原选择器div.TracksList-style__Wrapper-sc-3fb03d50-8 bWXYsy row格式错误:bWXYsy和row是元素的类名,需用.连接,正确写法为div.TracksList-style__Wrapper-sc-3fb03d50-8.bWXYsy.row。但Beatport使用动态生成的类名,会随页面更新变化,建议改用稳定的属性选择器,比如页面中歌曲列表容器的data-testid="tracks-list"属性,选择器为div[data-testid="tracks-list"],避免类名变更导致定位失败。

3. 等待逻辑优化

原代码仅等待根元素存在,深层元素可能未完成渲染。应直接等待目标元素的可见性(而非仅存在),使用EC.visibility_of_element_located替代EC.presence_of_element_located,确保元素已渲染完成。

4. 反爬应对

Beatport会检测爬虫,可添加页面滚动、隐式等待,或处理可能出现的Cookie弹窗,提升爬取稳定性。

修正后的代码

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
from fake_useragent import UserAgent

def scrape_beatport():
    user_agent = UserAgent().random
    chrome_options = Options()
    chrome_options.add_argument(f"user-agent={user_agent}")
    # 可选:禁用图片加载提升速度
    chrome_options.add_argument("--blink-settings=imagesEnabled=false")
    
    driver = webdriver.Chrome(options=chrome_options)
    driver.implicitly_wait(5)  # 全局隐式等待
    
    try:
        driver.get('https://www.beatport.com/top-100')
        
        # 处理Cookie弹窗(若存在)
        try:
            accept_btn = WebDriverWait(driver, 5).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="cookie-accept"]'))
            )
            accept_btn.click()
        except:
            pass
        
        # 等待歌曲列表容器可见
        tracks_container = WebDriverWait(driver, 15).until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[data-testid="tracks-list"]'))
        )
        
        # 验证定位结果
        test1 = driver.find_elements(By.CSS_SELECTOR, 'div#__next')
        test2 = driver.find_elements(By.CSS_SELECTOR, 'div[data-testid="tracks-list"]')
        
        print(f"test1找到元素数量:{len(test1)}")
        print(f"test2找到元素数量:{len(test2)}")
        
        # 后续可在此处提取歌曲信息
        
    finally:
        driver.quit()

if __name__ == '__main__':
    scrape_beatport()    

内容的提问来源于stack exchange,提问作者Just Verhagen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:55:04