使用CSS Locator爬取DataCamp课程返回空列表,求排查指导
问题排查与解决办法
1. 动态CSS类名导致选择器失效
DataCamp页面里的css-xxx这类类名是动态生成的,每次请求或页面更新都会变化,你课程实操中用的选择器到本地就不匹配了。
解决:
- 换用更稳定的选择逻辑,比如基于标签结构或者语义化属性,别依赖动态类名。比如直接通过
article下的h2定位课程标题:
你也可以先打印返回的HTML,看看课程标题实际的标签结构,再调整选择器。courses_names = sel.css('article h2 ::text').extract()
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
相关产品推荐
相关产品推荐

