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

使用BS4+Requests爬取Clutch.co数据失败及Cloudflare验证问题求助

解决Clutch.co数据爬取问题的方案

一、为什么requests+BS4会返回空文件?

Clutch.co有反爬机制,会校验请求的浏览器特征,而且页面核心内容是JavaScript动态渲染的。直接用requests发起请求,拿到的要么是未渲染的空HTML骨架,要么是被拦截的反爬页面,自然提取不到数据。

修复方案:用Selenium模拟真实浏览器

直接模拟浏览器加载页面,就能拿到完整渲染后的内容。以下是Colab环境适用的可运行代码:

# 安装依赖
!pip install selenium pandas webdriver-manager

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
import time

# 初始化Chrome浏览器(带基础反爬配置)
options = webdriver.ChromeOptions()
options.add_argument('--headless=new')  # 无头模式适配Colab
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')

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

# 目标页面URL
url = "https://clutch.co/il/it-services"
driver.get(url)
time.sleep(3)  # 等待页面渲染完成

# 解析页面
soup = BeautifulSoup(driver.page_source, 'html.parser')
companies = soup.find_all('li', class_='provider-row')

# 提取数据
data = []
for company in companies:
    # 企业名称
    name = company.find('h3', class_='company-name').get_text(strip=True) if company.find('h3', class_='company-name') else 'N/A'
    # 地址
    location = company.find('span', class_='locality').get_text(strip=True) if company.find('span', class_='locality') else 'N/A'
    # 企业详情页URL
    company_url = "https://clutch.co" + company.find('a', class_='company-link')['href'] if company.find('a', class_='company-link') else 'N/A'
    # 评分
    rating = company.find('span', class_='rating').get_text(strip=True) if company.find('span', class_='rating') else 'N/A'
    
    data.append({
        '企业名称': name,
        '地址': location,
        '企业URL': company_url,
        '评分': rating
    })

# 存入DataFrame并导出CSV
df = pd.DataFrame(data)
df.to_csv('clutch_it_services.csv', index=False, encoding='utf-8-sig')

driver.quit()

二、解决Cloudflare v2验证码拦截问题

cloudscraper免费版不支持Cloudflare v2验证码,推荐两种可行方案:

方案1:用undetected-chromedriver绕过检测

这个库专门修改Chrome的指纹特征,避免被Cloudflare识别为自动化工具。Colab环境代码示例:

# 安装依赖
!pip install undetected-chromedriver pandas

import undetected_chromedriver as uc
from bs4 import BeautifulSoup
import pandas as pd
import time

# 初始化浏览器
options = uc.ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = uc.Chrome(options=options)
driver.get("https://clutch.co/il/it-services")
time.sleep(5)  # 给Cloudflare验证留足够时间

# 后续解析、提取数据逻辑和Selenium代码一致
soup = BeautifulSoup(driver.page_source, 'html.parser')
# ...(重复前面的数据提取、导出步骤)

driver.quit()

方案2:付费反爬API(备选)

如果免费方案还是被拦截,可使用ScrapingBee、BrightData这类付费服务,它们自带Cloudflare破解能力,只需调用API即可获取数据,无需自行处理验证码。

三、提取更多数据的技巧

要获取员工规模、服务类型、客户评价数等额外字段,只需找到对应HTML元素解析:

# 在企业循环内添加以下提取逻辑
# 员工规模
employee_size = company.find('div', class_='employee').get_text(strip=True) if company.find('div', class_='employee') else 'N/A'
# 服务类型
services = [s.get_text(strip=True) for s in company.find_all('div', class_='specialization')] if company.find_all('div', class_='specialization') else ['N/A']
# 客户评价数
review_count = company.find('a', class_='reviews-link').get_text(strip=True) if company.find('a', class_='reviews-link') else 'N/A'

将这些字段加入data字典,即可同步导出到CSV。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:12:59