使用BeautifulSoup爬取SoundCloud返回None或AttributeError如何解决
问题根因
- SoundCloud的页面内容采用客户端JavaScript动态渲染机制,你用
requests发起请求拿到的仅为未加载数据的初始HTML骨架,歌曲列表这类业务数据是页面加载完成后由JS调用后端接口拉取、再动态插入到DOM中的,初始HTML里不存在soundList__item类的节点,因此find方法返回None,后续对None调用属性就会触发AttributeError。 - SoundCloud配备基础反爬策略,未携带符合要求的请求头的普通请求,大概率会拿到被拦截的异常响应,你可以先打印
html_text校验内容是否和浏览器中查看的页面源码一致。
可行解决方案
- 方案1:使用动态渲染工具获取完整DOM
用selenium、playwright这类可以模拟浏览器运行的自动化工具,等页面JS执行完成、内容渲染完毕后再提取DOM节点,示例代码如下:from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式不弹出浏览器 driver = webdriver.Chrome(options=chrome_options) driver.get('https://soundcloud.com/jujubucks') time.sleep(3) # 等待页面渲染完成,也可以用显式等待优化 html_text = driver.page_source driver.quit() soup = BeautifulSoup(html_text,'lxml') song = soup.find('li', class_='soundList__item') print(song) - 方案2:直接调用官方接口获取数据
打开浏览器F12开发者工具,切换到「网络」面板,筛选Fetch/XHR请求,刷新页面后找到返回歌曲列表数据的接口,直接模拟请求该接口获取JSON格式数据,该方案执行效率远高于渲染整个页面,只需注意请求头、参数和浏览器发起的请求保持一致即可。 - 方案3:使用第三方封装的SoundCloud爬取SDK
社区有很多已经适配好SoundCloud接口的第三方SDK,可直接调用对应方法获取用户、歌曲等数据,无需自行适配页面结构或接口参数。
内容的提问来源于stack exchange,提问作者Houston Khanyile
相关产品推荐
相关产品推荐

