一、基础反爬手段及破解方案
1. User-Agent 检测
- 反爬原理:服务器检查请求头中的
User-Agent
是否为浏览器特征。 - 破解方案:
工具:import requests from fake_useragent import UserAgent headers = { 'User-Agent': UserAgent().random # 随机生成浏览器UA } response = requests.get(url, headers=headers)
fake_useragent
库(自动维护最新UA列表)。
2. IP 频率限制
- 反爬原理:服务器统计单个IP的请求频率,过高则封禁。
- 破解方案:
- 代理IP池(付费/免费):
proxies = { 'http': 'http://12.34.56.78:8888', 'https': 'http://12.34.56.78:8888' } requests.get(url, proxies=proxies)
- 分布式爬虫:使用 Scrapy-Redis 分配任务到多台机器。
推荐服务:快代理、芝麻代理。
- 代理IP池(付费/免费):
3. 登录验证(Cookie/Token)
- 反爬原理:需登录后才能访问数据,通过Cookie或Token验证身份。
- 破解方案:
- 模拟登录(代码示例):
session = requests.Session() login_data = {'username': 'xxx', 'password': 'xxx'} session.post(login_url, data=login_data) response = session.get(target_url) # 自动携带Cookie
- 持久化Cookie:使用
http.cookiejar
保存和加载Cookie文件。
- 模拟登录(代码示例):
二、中级反爬手段及破解方案
4. 验证码识别
- 反爬类型:图形验证码、滑动验证码、点选验证码等。
- 破解方案:
- OCR识别(简单图形):
from PIL import Image import pytesseract image = Image.open('captcha.png') text = pytesseract.image_to_string(image) # OCR识别
- 第三方API(复杂验证码):
import requests result = requests.post('https://api.ruokuai.com/verify', data={ 'image': open('captcha.png', 'rb'), 'typeid': '1010', 'username': 'xxx', 'password': 'xxx' })
- OCR识别(简单图形):
5. 动态内容加载(JavaScript渲染)
- 反爬原理:数据通过JS动态生成,直接请求HTML无法获取。
- 破解方案:
- 无头浏览器(Selenium/Puppeteer):
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') # 无头模式 driver = webdriver.Chrome(options=options) driver.get(url) html = driver.page_source # 获取渲染后的页面
- 逆向JS分析:使用 Chrome DevTools 的 Network 面板追踪数据接口。
- 无头浏览器(Selenium/Puppeteer):
6. 请求参数加密
- 反爬原理:接口参数被加密(如时间戳+Token+Salt)。
- 破解方案:
- 使用浏览器调试工具定位加密函数(搜索关键词如
encrypt
)。 - 用 Python 重写加密逻辑(示例):
import hashlib def generate_token(param): salt = "xxxxx" return hashlib.md5((param + salt).encode()).hexdigest()
- 使用浏览器调试工具定位加密函数(搜索关键词如
三、高级反爬手段及破解方案
7. 浏览器指纹检测
- 反爬原理:通过 Canvas、WebGL、字体等特征识别爬虫。
- 破解方案:
- 修改浏览器指纹(Playwright):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() context = browser.new_context( user_agent='Mozilla/5.0...', viewport={'width': 1920, 'height': 1080} ) page = context.new_page() page.goto(url)
- 随机化硬件参数:使用浏览器自动化工具修改分辨率、时区等。
- 修改浏览器指纹(Playwright):
8. 行为分析(鼠标轨迹、点击频率)
- 反爬原理:检测用户操作是否符合人类行为(如随机移动轨迹)。
- 破解方案:
- 模拟人类操作(PyAutoGUI):
import pyautogui import random # 生成随机移动轨迹 pyautogui.moveTo(x, y, duration=random.uniform(0.5, 2))
- 随机化操作间隔:
import time time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
- 模拟人类操作(PyAutoGUI):
9. Websocket 或 GraphQL 接口
- 反爬原理:数据通过非RESTful API传输,增加抓包难度。
- 破解方案:
- 使用 WebSocket 客户端库:
import websockets async with websockets.connect(ws_url) as websocket: await websocket.send("query data") response = await websocket.recv()
- 抓包工具分析:Wireshark 或 Charles 捕获数据包格式。
- 使用 WebSocket 客户端库:
四、终极防御与应对策略
10. 法律风险规避
- 遵守规则:
- 检查网站的
robots.txt
(如https://example.com/robots.txt
)。 - 控制爬取频率(如每秒不超过1次)。
- 避免爬取敏感数据(个人隐私、商业机密)。
- 检查网站的
11. 对抗分布式防御系统
- 企业级方案:
- 云函数+IP池:使用 AWS Lambda 或阿里云函数动态分配IP。
- 机器学习反反爬:训练模型识别验证码或动态调整策略。
五、工具与框架推荐
场景 | 推荐工具 |
---|---|
无头浏览器 | Playwright(比Selenium更快) |
代理IP管理 | Scrapy-ProxyPool(开源代理池) |
验证码破解 | ddddocr(深度学习OCR库) |
请求分析 | MitmProxy(抓包+修改请求) |
分布式爬虫 | Scrapy-Redis + Kubernetes |