使用bs4+Pandas爬取clutch.co生成空DataFrame问题求助(Colab环境)
问题排查与修复方案
1. 核心问题分析
你的DataFrame为空,本质是BeautifulSoup未匹配到任何目标元素,主要由两个原因导致:
- 页面选择器与当前clutch.co的实际DOM结构不匹配
- 页面动态内容未完全加载就获取源码,且Headless模式被网站反爬机制识别
2. 具体修复步骤
(1)修正元素选择器
当前clutch.co的公司名称和所在地DOM结构已更新:
- 公司名称:位于
.provider-row条目下的h3.company-name a标签 - 所在地:位于
.provider-row条目下的.locality span标签
(2)解决页面加载与反爬问题
- 添加等待逻辑,确保目标元素加载完成
- 为Headless模式添加模拟正常浏览器的参数,规避反爬拦截
3. 修复后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import pandas as pd # 配置Chrome选项,规避反爬并模拟正常浏览器 options = Options() options.add_argument("--headless=new") # 新版Headless模式,更难被检测 options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("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") options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=options) driver.get("https://clutch.co/it-services/msp") # 等待目标元素加载完成(最多等待10秒) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "provider-row")) ) except Exception as e: print("页面加载超时:", e) page_source = driver.page_source driver.quit() soup = BeautifulSoup(page_source, "html.parser") # 提取公司名称和所在地 company_names = [] company_locations = [] # 遍历每个公司条目 for provider in soup.select(".provider-row"): name_tag = provider.select_one("h3.company-name a") if name_tag: company_names.append(name_tag.get_text(strip=True)) location_tag = provider.select_one(".locality span") if location_tag: company_locations.append(location_tag.get_text(strip=True)) # 构建DataFrame并保存 data = { "Company Name": company_names, "Location": company_locations } df = pd.DataFrame(data) df.to_csv("clutch_data.csv", index=False) print(f"成功提取{len(df)}条数据")
4. 额外注意事项
- 如果后续仍出现数据为空,需重新在浏览器开发者工具(F12)中确认元素选择器(网站可能更新DOM结构)
- 频繁爬取可能触发IP封禁,建议添加请求间隔,避免给服务器造成过大压力
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

