Linux服务器仅支持Headless模式时,如何绕过Cloudflare实现网页抓取?
突破Cloudflare防护:Linux Headless浏览器解决方案
1. 配置Headless浏览器模拟Headful环境
Cloudflare会通过窗口尺寸、自动化标识、GPU状态等浏览器特征区分无头与正常浏览器,可通过以下参数伪装:
Playwright Chromium 示例:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch( headless="new", # 新版无头模式更接近真实Headful环境 args=[ "--disable-blink-features=AutomationControlled", # 禁用自动化检测特征 "--window-size=1920,1080", # 设置真实桌面窗口尺寸 "--enable-gpu", # 服务器有GPU时启用,无GPU可忽略 "--no-sandbox", # Linux服务器必备参数 "--disable-dev-shm-usage" ], user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" # 模拟主流浏览器UA ) page = browser.new_page() page.goto("https://swappie.com/en/iphone/") # 后续业务操作 browser.close()
Selenium Chrome 示例:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--window-size=1920,1080") 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/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options) driver.get("https://swappie.com/en/iphone/") # 后续业务操作 driver.quit()
2. 优化代理策略
普通代理易被Cloudflare标记为爬虫IP,需升级为住宅代理/动态IP代理,并遵循以下规则:
- 代理地域与目标站点受众匹配(如swappie为欧洲站点,优先选择欧洲住宅IP)
- 单次会话保持同一IP,避免频繁换IP触发风控
- 确保代理支持HTTPS且无真实IP泄漏风险
3. 使用反检测工具
Undetected Chromedriver(Selenium专用)
该工具自动修改Chrome的自动化特征,绕过Cloudflare检测:
from undetected_chromedriver import Chrome, ChromeOptions options = ChromeOptions() options.add_argument("--headless=new") options.add_argument("--window-size=1920,1080") options.add_argument("--no-sandbox") driver = Chrome(options=options) driver.get("https://swappie.com/en/iphone/") # 后续业务操作 driver.quit()
Playwright指纹伪装
手动修改浏览器指纹,模拟真实用户环境:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless="new", args=["--no-sandbox"]) page = browser.new_page() # 禁用webdriver标识 page.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") # 添加常用插件信息 page.add_init_script(""" navigator.plugins = [ {name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer'}, {name: 'Widevine Content Decryption Module', filename: 'widevinecdmadapter.dll'} ] """) page.goto("https://swappie.com/en/iphone/") # 后续业务操作 browser.close()
4. 模拟真实用户行为
Cloudflare会监控请求频率与行为模式,需添加以下模拟操作:
- 随机等待:每次页面跳转后等待2-5秒(避免固定间隔)
- 页面滚动:执行JavaScript模拟滚动行为
- 随机点击:偶尔点击页面非关键元素(如导航栏)
示例(Playwright):
import random from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless="new", args=["--no-sandbox"]) page = browser.new_page() page.goto("https://swappie.com/en/iphone/") # 随机等待 page.wait_for_timeout(random.randint(2000, 5000)) # 分阶段模拟滚动 page.evaluate("window.scrollTo(0, document.body.scrollHeight * 0.5)") page.wait_for_timeout(random.randint(1000, 2000)) page.evaluate("window.scrollTo(0, document.body.scrollHeight)") # 后续业务操作 browser.close()
5. 保持浏览器版本更新
确保使用最新版Chrome/Chromium,新版无头模式(headless: 'new')修复了大量可被检测的特征,Cloudflare对新版浏览器的检测阈值更低。
内容的提问来源于stack exchange,提问作者Igor Savinkin
相关产品推荐
相关产品推荐

