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

