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

使用Scrapy爬取clutch.co遭Cloudflare 403拦截,求绕过方案

解决Scrapy爬取clutch.co遇到Cloudflare 403的问题

一、Scrapy原生方案(无需浏览器)

1. 集成Cloudflare专用中间件

Cloudflare的反爬核心是指纹识别与验证,使用Scrapy专用中间件可自动处理基础验证流程:

  • 安装依赖:
    pip install scrapy-cloudflare-middleware
    
  • 在项目settings.py中添加中间件配置:
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_cloudflare_middleware.middleware.CloudflareMiddleware': 543,
    }
    

2. 优化请求行为(降低被识别概率)

你的现有代码存在几个可优化点,调整后能大幅减少拦截:

  • 移除硬编码过期Cookie:Cookie存在有效期,硬编码旧Cookie无意义且可能触发异常,删除headers中的cookie字段,让Scrapy自动管理会话Cookie。
  • 放缓访问节奏:将DOWNLOAD_DELAY调至2-3秒,CONCURRENT_REQUESTS降至2-3,模拟人类访问频率:
    custom_settings = {
        'DOWNLOAD_DELAY': 2,
        'CONCURRENT_REQUESTS': 2,
        # 其余配置保持不变
    }
    
  • 随机切换User-Agent:固定UA易被识别,安装scrapy-user-agents实现随机UA:
    pip install scrapy-user-agents
    
    在settings.py中配置:
    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
        'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
        # 保留Cloudflare中间件配置
    }
    
  • 调整Referer逻辑:不要固定使用google.com作为Referer,改为从clutch.co首页跳转至目标页面,建立合法会话:
    修改Spider的请求逻辑:
    def start_requests(self):
        # 先访问首页获取合法会话
        yield scrapy.Request(
            url='https://clutch.co/',
            callback=self.go_to_directory,
            headers=self.headers
        )
    
    def go_to_directory(self, response):
        for url in self.input_urls:
            yield scrapy.Request(url=url, callback=self.parse, headers=self.headers)
    

3. 使用高匿代理IP

若以上方法仍被拦截,说明IP已被Cloudflare标记,需使用动态住宅代理(避免数据中心代理)。在settings.py中配置代理中间件,或在请求中动态设置:

# 在settings.py中启用代理中间件
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
})

# 在Spider的请求中添加代理
def start_requests(self):
    proxy = 'http://your-residential-proxy:port'
    yield scrapy.Request(
        url='https://clutch.co/',
        callback=self.go_to_directory,
        headers=self.headers,
        meta={'proxy': proxy}
    )

二、Selenium解决方案(解决403问题)

默认Selenium配置会被Cloudflare检测到,需使用无指纹浏览器方案:

1. 使用undetected-chromedriver

该库会自动修改Chrome的自动化特征,规避Cloudflare检测:

  • 安装依赖:
    pip install undetected-chromedriver
    

2. 示例代码

import time
from selenium.webdriver.common.by import By
import undetected_chromedriver as uc

def scrape_clutch():
    # 初始化无指纹Chrome浏览器
    driver = uc.Chrome()
    try:
        # 先访问首页建立会话
        driver.get('https://clutch.co/')
        time.sleep(2)  # 模拟人类停留时间

        # 跳转至目标目录页
        driver.get('https://clutch.co/directory/mobile-application-developers')
        time.sleep(3)

        # 提取代理机构链接
        agencies = driver.find_elements(By.XPATH, ".//div[@class='company col-md-12 prompt-target sponsor']/a")
        for agency in agencies:
            agency_url = agency.get_attribute('href')
            # 跳转至详情页
            driver.get(agency_url)
            time.sleep(2)
            # 此处添加数据提取逻辑...
    finally:
        driver.quit()

3. 额外优化

  • 配合代理IP启动浏览器:在初始化Chrome时添加代理参数。
  • 模拟人类行为:随机滚动页面、点击元素,避免机械性操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:33