使用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
相关产品推荐
相关产品推荐

