# 通用 Cloudflare 反爬虫绕过指南
本文档提供了一套完整的绕过 Cloudflare 反爬虫检测的解决方案。这些方法综合了多种反检测技术,可以有效应对大多数 Cloudflare 的检测机制。
## 目录
- [基础配置](#基础配置)
- [Chrome 选项配置](#chrome-选项配置)
- [高级配置](#高级配置)
- [代理支持](#代理支持)
- [请求控制](#请求控制)
- [完整实现](#完整实现)
- [注意事项](#注意事项)
## 基础配置
使用 undetected_chromedriver
作为基础:
```python
import undetected_chromedriver as uc
driver = uc.Chrome(version_main=138) # 指定 Chrome 版本
```
## Chrome 选项配置
基本的 Chrome 配置选项:
```python
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 禁用自动化控制特征
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 模拟真实用户代理
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
# 设置语言
chrome_options.add_argument("--accept-language=en-US,en;q=0.9")
# 禁用沙箱
chrome_options.add_argument("--no-sandbox")
# 禁用共享内存
chrome_options.add_argument("--disable-dev-shm-usage")
```
## 高级配置
### 指纹随机化
```python
# 添加指纹随机化
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-software-rasterizer")
# 随机化窗口大小
import random
window_width = random.randint(1024, 1920)
window_height = random.randint(768, 1080)
chrome_options.add_argument(f"--window-size={window_width},{window_height}")
# WebGL 指纹随机化
chrome_options.add_argument("--use-fake-ui-for-media-stream")
chrome_options.add_argument("--use-fake-device-for-media-stream")
```
## 代理支持
如果需要使用代理:
```python
def get_proxy():
# 这里替换为你的代理获取逻辑
return "http://your-proxy-address:port"
chrome_options.add_argument(f'--proxy-server={get_proxy()}')
```
## 请求控制
### 延迟和随机化
```python
import time
import random
def random_sleep():
time.sleep(random.uniform(2, 5))
def make_request(driver, url):
random_sleep() # 随机延迟
driver.get(url)
```
### Cookies 管理
```python
def save_cookies(driver):
cookies = driver.get_cookies()
return cookies
def load_cookies(driver, cookies):
for cookie in cookies:
driver.add_cookie(cookie)
```
### 错误处理和重试
```python
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def fetch_with_retry(driver, url):
try:
driver.get(url)
# 检查是否遇到 Cloudflare 检查
if "checking your browser" in driver.page_source.lower():
time.sleep(5) # 等待 Cloudflare 检查完成
return driver.page_source
except Exception as e:
print(f"Error: {str(e)}")
raise
```
## 完整实现
完整的类实现示例:
```python
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
import time
import random
class CloudflareBypass:
def init(self):
self.options = self._setup_options()
self.driver = None
def setupoptions(self):
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument(f"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
return options
def start_browser(self):
self.driver = uc.Chrome(options=self.options)
return self.driver
def fetch_page(self, url, retries=3):
for attempt in range(retries):
try:
time.sleep(random.uniform(2, 5))
self.driver.get(url)
if "checking your browser" in self.driver.page_source.lower():
time.sleep(5)
return self.driver.page_source
except Exception as e:
print(f"Attempt {attempt + 1} failed: {str(e)}")
if attempt == retries - 1:
raise
def close(self):
if self.driver:
self.driver.quit()
```
## 注意事项
1. 版本更新
- 定期更新 Chrome 和 undetected_chromedriver 版本
- 保持与最新的反检测技术同步
2. 请求控制
- 避免频繁请求
- 添加随机延迟
- 模拟真实用户行为
3. IP 管理
- 使用代理池轮换 IP(如需要)
- 监控 IP 是否被封禁
4. 会话管理
- 合理使用 cookies
- 保持会话状态
- 实现错误处理和重试机制
5. 合规性
- 遵守网站的使用条款
- 遵守爬虫协议
- 合理控制爬取频率
## 使用建议
根据具体网站的防护级别,可以选择性地启用或禁用某些功能。建议在使用时:
1. 从基础配置开始,逐步添加必要的功能
2. 持续监控爬取效果,及时调整策略
3. 保持代码更新,适应新的防护机制
4. 遵守网站的使用政策和限制
## 参考资源
- [undetected_chromedriver 文档](https://github.com/ultrafunkamsterdam/undetected-chromedriver)
- [Selenium 文档](https://www.selenium.dev/documentation/)
- [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)
- [V2EX - Cloudflare 绕过验证讨论](https://v2ex.com/t/1051072)
## 实战示例
下面提供一个实际的爬虫示例,这个示例展示了如何使用上述的 Cloudflare 绕过技术来爬取小说网站的内容。这个爬虫程序具有以下特点:
1. 使用 undetected_chromedriver 绕过 Cloudflare 检测
2. 实现了完整的错误处理和日志记录
3. 支持自动翻页和内容保存
4. 使用显式等待确保页面元素加载完成
5. 优雅地处理各种异常情况
```python
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
def save_to_file(chapter_number, title, content, filename="novel.txt"):
"""追加章节内容到单一 txt 文件"""
with open(filename, 'a', encoding='utf-8') as f:
f.write(f"第 {chapter_number} 章\n")
f.write(f"{title}\n\n")
f.write(f"{content}\n\n")
print(f"已保存章节 {chapter_number} 到 {filename}")
def main():
# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
chrome_options.add_argument("--accept-language=en-US,en;q=0.9")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# chrome_options.add_argument("--headless") # 取消注释以启用无头模式
# 初始化浏览器
try:
driver = uc.Chrome(options=chrome_options, version_main=138)
except Exception as e:
print(f"初始化 ChromeDriver 失败:{str(e)}")
return
try:
# 初始页面
url = "https://www.69shuba.com/txt/85122/40429717"
chapter_number = 1
while True:
print(f"正在抓取章节 {chapter_number}: {url}")
driver.get(url)
# 等待正文加载
try:
WebDriverWait(driver, 30).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.txtnav"))
)
except Exception as e:
print(f"正文加载失败,链接:{url}")
print(f"错误:{str(e)}")
print("原始 HTML(前1000字符):")
print(driver.page_source[:1000])
break
# 解析页面
soup = BeautifulSoup(driver.page_source, 'html.parser')
content = soup.select_one('div.txtnav')
title = soup.select_one('h1') # 假设标题在 <h1>
if content:
chapter_content = content.get_text(strip=True)
chapter_title = title.get_text(strip=True) if title else f"章节 {chapter_number}"
print(f"章节标题:{chapter_title}")
print(f"正文(前200字符):{chapter_content[:200]}...")
save_to_file(chapter_number, chapter_title, chapter_content)
else:
print(f"未找到正文,链接:{url}")
print("原始 HTML(前1000字符):")
print(driver.page_source[:1000])
break
# 点击"下一章"按钮
try:
next_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.LINK_TEXT, "下一章"))
)
next_url = next_button.get_attribute("href")
next_button.click()
url = driver.current_url # 获取点击后的 URL
except Exception as e:
print(f"无法点击'下一章'按钮,链接:{url}")
print(f"错误:{str(e)}")
print("原始 HTML(前1000字符):")
print(driver.page_source[:1000])
break
chapter_number += 1
except Exception as e:
print(f"抓取失败,链接:{url}")
print(f"错误:{str(e)}")
print("原始 HTML(前1000字符):")
print(driver.page_source[:1000])
finally:
driver.quit()
if name == "__main__":
main()
```
这个示例代码展示了如何将本文档中介绍的各种技术整合到一个实际的爬虫应用中。它包含了完整的错误处理、日志记录、内容提取和保存功能。代码中使用了 undetected_chromedriver 来绕过 Cloudflare 的检测,并实现了自动翻页和内容保存的功能。
特别注意以下几点:
1. 代码使用了显式等待来确保页面元素完全加载
2. 实现了完整的错误处理和异常情况的日志记录
3. 使用 BeautifulSoup 来解析页面内容
4. 支持自动保存内容到文件
5. 包含了详细的调试信息输出