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

使用CSS Locator爬取DataCamp课程返回空列表,求排查指导

问题排查与解决办法

1. 动态CSS类名导致选择器失效

DataCamp页面里的css-xxx这类类名是动态生成的,每次请求或页面更新都会变化,你课程实操中用的选择器到本地就不匹配了。

解决:

  • 换用更稳定的选择逻辑,比如基于标签结构或者语义化属性,别依赖动态类名。比如直接通过article下的h2定位课程标题:
    courses_names = sel.css('article h2 ::text').extract()
    
    你也可以先打印返回的HTML,看看课程标题实际的标签结构,再调整选择器。

2. 页面内容是JS动态加载的

requests.get()只能拿到服务器返回的初始静态HTML,而DataCamp的课程列表可能是浏览器加载后通过JS异步拉取的,初始HTML里根本没有课程内容,自然查不到元素。

解决:

  • 用能模拟浏览器渲染JS的工具,比如selenium或者playwright。举个selenium的例子:
    from selenium import webdriver
    from scrapy import Selector
    
    driver = webdriver.Chrome()
    driver.get('https://www.datacamp.com/courses-all')
    # 可以加个等待,确保课程列表加载完成
    html = driver.page_source
    sel = Selector(text=html)
    courses_names = sel.css('article h2 ::text').extract()
    print(courses_names)
    driver.quit()
    

3. 缺请求头被反爬拦截

requests默认的请求头会被服务器识别成爬虫,返回的内容不含课程数据。

解决:

  • 手动加个浏览器的User-Agent头,模拟正常请求:
    from scrapy import Selector
    import requests
    
    url = 'https://www.datacamp.com/courses-all'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    html = requests.get(url, headers=headers).content
    # 先打印HTML内容,确认有没有课程数据
    print(html.decode())
    sel = Selector(text=html)
    courses_names = sel.css('article h2 ::text').extract()
    print(courses_names)
    

4. 先验证返回的HTML内容

调试的时候先把html.decode()打出来看看,如果返回的是登录页、验证页或者空内容,说明被反爬了,可能需要加Cookie或者用代理。

内容的提问来源于stack exchange,提问作者mohamed sultan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:58:34