如何使用Python的Beautiful Soup、Selenium或Scrapy爬取Kaggle数据集名称?
我来帮你解决这个问题~你之前的代码没返回结果主要有两个原因:一是Kaggle页面很多内容是通过JavaScript动态渲染的,用requests.get()只能拿到静态HTML,可能根本没有你要找的那个元素;二是你用的class是React生成的动态类名,每次页面加载这些类名都可能变化,完全不可靠。下面给你几种可行的解决方案:
1. 改进BeautifulSoup方法(适配静态可抓取场景)
优先选择页面中固定不变的标识(比如meta标签、固定的测试ID)来定位元素,同时模拟浏览器请求头避免被反爬:
from bs4 import BeautifulSoup import requests url = 'https://www.kaggle.com/heptapod/titanic' # 模拟浏览器请求头,避免被Kaggle拦截 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' } res = requests.get(url, headers=headers) soup = BeautifulSoup(res.content, 'html.parser') # 方法1:从页面meta标签获取数据集名称(最稳定的静态方式) meta_title = soup.find('meta', property='og:title') if meta_title: print("从meta标签获取的名称:", meta_title['content']) # 方法2:通过固定的测试ID定位标题元素(如果静态HTML中存在) dataset_title = soup.find('h1', {'data-testid': 'dataset-title'}) if dataset_title: print("从标题元素获取的名称:", dataset_title.get_text(strip=True))
2. 使用Selenium处理动态渲染内容
如果页面内容完全是JS动态生成的,requests拿不到有效内容,就用Selenium模拟浏览器加载完整页面:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://www.kaggle.com/heptapod/titanic' # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) try: # 等待标题元素加载完成(最多等10秒) dataset_title = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'h1[data-testid="dataset-title"]')) ) print("数据集名称:", dataset_title.text.strip()) finally: # 关闭浏览器 driver.quit()
3. 使用Scrapy批量爬取(适合多数据集场景)
如果需要批量获取多个数据集名称,可以用Scrapy结合Playwright插件处理JS渲染:
import scrapy from scrapy_playwright.page import PageCoroutine class KaggleDatasetSpider(scrapy.Spider): name = 'kaggle_dataset' start_urls = ['https://www.kaggle.com/heptapod/titanic'] def start_requests(self): for url in self.start_urls: yield scrapy.Request( url, meta={ 'playwright': True, 'playwright_page_coroutines': [ # 等待标题元素加载完成 PageCoroutine('wait_for_selector', 'h1[data-testid="dataset-title"]'), ], } ) def parse(self, response): dataset_name = response.css('h1[data-testid="dataset-title"]::text').get().strip() yield {'数据集名称': dataset_name}
4. 推荐:使用Kaggle官方API(最可靠的方式)
爬取页面容易受页面结构变化影响,官方API是最稳定且合规的方案:
- 先安装Kaggle API:
pip install kaggle - 在Kaggle账户设置中生成API Token,将
kaggle.json放到指定目录(Linux/macOS:~/.kaggle/;Windows:C:\Users\<你的用户名>\.kaggle\) - 运行以下代码:
from kaggle.api.kaggle_api_extended import KaggleApi api = KaggleApi() api.authenticate() # 获取指定数据集的详细信息 dataset_info = api.dataset_view('heptapod/titanic') print("数据集名称:", dataset_info.title)
内容的提问来源于stack exchange,提问作者Abdellah-ELAAROUB
相关产品推荐
相关产品推荐

