如何抓取Capterra平台带“加载更多”按钮的商家全量评论?
解决Capterra评论抓取问题的方案
一、Python + Playwright 实现步骤
- 安装依赖:
pip install playwright,执行playwright install安装浏览器驱动 - 核心逻辑:模拟真实浏览器加载页面,等待动态渲染的评论加载完成,处理分页获取全部评论
- 示例代码:
from playwright.sync_api import sync_playwright def scrape_capterra_reviews(url): with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 调试时可设为False查看浏览器操作 page = browser.new_page() page.goto(url, wait_until="networkidle") # 循环加载更多评论 while True: try: load_more_btn = page.locator('button:has-text("Load More")') if load_more_btn.is_visible(): load_more_btn.click() page.wait_for_timeout(2000) # 等待加载,可根据网络调整时长 else: break except Exception: break # 提取评论信息 reviews = page.locator('.review-card').all() result = [] for review in reviews: author = review.locator('.review-author-name').text_content() rating = review.locator('.star-rating').get_attribute('aria-label') content = review.locator('.review-content').text_content() result.append({ 'author': author.strip(), 'rating': rating.strip(), 'content': content.strip() }) browser.close() return result # 调用示例 hubspot_reviews = scrape_capterra_reviews("https://www.capterra.com/p/152373/HubSpot-CRM/reviews/") for idx, rev in enumerate(hubspot_reviews, 1): print(f"评论{idx}:") print(f"作者: {rev['author']}") print(f"评分: {rev['rating']}") print(f"内容: {rev['content']}\n")
- 注意:页面元素选择器可能随平台更新变化,需用浏览器开发者工具重新定位;设置合理等待时间,避免触发反爬机制
二、JavaScript + Puppeteer 实现步骤
- 安装依赖:
npm install puppeteer - 核心逻辑:和Playwright一致,模拟浏览器操作渲染动态内容,处理分页获取全部评论
- 示例代码:
const puppeteer = require('puppeteer'); async function scrapeCapterraReviews(url) { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto(url, { waitUntil: 'networkidle2' }); // 加载所有评论 while (true) { try { const loadMoreBtn = await page.$('button:has-text("Load More")'); if (loadMoreBtn) { await loadMoreBtn.click(); await page.waitForTimeout(2000); } else { break; } } catch (err) { break; } } // 提取评论数据 const reviews = await page.evaluate(() => { const reviewCards = document.querySelectorAll('.review-card'); return Array.from(reviewCards).map(card => { const author = card.querySelector('.review-author-name').textContent.trim(); const rating = card.querySelector('.star-rating').getAttribute('aria-label').trim(); const content = card.querySelector('.review-content').textContent.trim(); return { author, rating, content }; }); }); await browser.close(); return reviews; } // 调用示例 scrapeCapterraReviews("https://www.capterra.com/p/152373/HubSpot-CRM/reviews/") .then(reviews => { reviews.forEach((rev, idx) => { console.log(`评论${idx+1}:`); console.log(`作者: ${rev.author}`); console.log(`评分: ${rev.rating}`); console.log(`内容: ${rev.content}\n`); }); }) .catch(err => console.error(err));
三、bs4无效的原因及修正方向
- 无效原因:Capterra评论是动态渲染的,初始HTML不包含评论内容,bs4仅能抓取静态HTML,因此无法获取数据
- 修正思路:若不想用浏览器自动化,可尝试抓包找真实API接口:
- 打开浏览器开发者工具的Network面板,刷新页面
- 过滤XHR/Fetch请求,查找含
review/comment等关键词的接口 - 分析请求头参数(如
Authorization),模拟发送请求获取数据
- 注意:平台API可能存在反爬机制,需严格模拟浏览器请求头,且接口可能随时更新
内容的提问来源于stack exchange,提问作者Rustam
相关产品推荐
相关产品推荐

