本文目录导读:

- 伪造请求头(最基本的伪装)
- 控制请求频率(最有效的反封策略)
- 使用代理IP(突破IP级封禁)
- 处理Cookies和Session(避免被“记住”)
- 抓取内容的“痕迹”处理(应对反爬JS验证)
- 处理验证码(最头疼的问题)
- 模拟鼠标和键盘操作(破解行为分析)
- 使用专业的反爬绕过库(一键集成)
- 总结:一套可执行的“反封”流程
- 最终建议
防止爬虫被封禁的核心原则是模拟真实用户行为,而不是让服务器觉得你在“扫荡”,以下是Python爬虫开发中常用的8个实战策略,从基础到进阶:
伪造请求头(最基本的伪装)
原因:服务器会检测 User-Agent、Referer 等字段,Python的 requests 默认UA会被一眼识别。
代码:
import requests
headers = {
'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',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,en;q=0.6',
'Referer': 'https://www.google.com/', # 模拟从搜索引擎跳转
'Connection': 'keep-alive',
}
进阶技巧:维护一个UA池,每次随机选择一个,避免单一UA被拉黑。
import random
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
'Mozilla/5.0 (X11; Linux x86_64) ...',
]
headers['User-Agent'] = random.choice(user_agents)
控制请求频率(最有效的反封策略)
原因:瞬时大量请求会触发服务器的限流机制(如429 Too Many Requests)。
代码:
import time import random # 每个请求之间随机休眠1~3秒 time.sleep(random.uniform(1, 3))
高级做法:使用指数退避(Exponential Backoff),遇错时暂停时间递增:
def request_with_retry(url, max_retries=3):
for i in range(max_retries):
try:
return requests.get(url, headers=headers, timeout=5)
except Exception as e:
wait = (2 ** i) + random.random()
time.sleep(wait)
continue
使用代理IP(突破IP级封禁)
原因:同IP多次请求容易被封,尤其对于反爬严格的网站。
代码:
import requests
proxy = {
'http': 'http://10.10.1.10:3128', # 这种通常需要购买付费代理
'https': 'http://10.10.1.10:1080',
}
# 付费代理池(如快代理、芝麻代理)会自动轮换IP
response = requests.get('https://example.com', proxies=proxy, headers=headers)
实战建议:直接使用付费代理API会更省心,免费代理不稳定且易被污染。
处理Cookies和Session(避免被“)
原因:有些网站会根据Cookie跟踪你的行为,如果第一次请求没有Cookie,第二次突然换了,可能会被标记。
做法:使用 requests.Session() 自动管理Cookie。
session = requests.Session()
# 先访问首页获取Cookie
session.get('https://example.com', headers=headers)
# 后续请求会自动携带Cookie
response = session.get('https://example.com/data', headers=headers)
的“痕迹”处理(应对反爬JS验证)
原因:部分网站会检测浏览器是否运行了JavaScript(如加密参数、鼠标轨迹)。
工具:
- Selenium / Playwright:模拟真实浏览器环境,但速度慢且耗资源。
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://example.com') driver.implicitly_wait(5) # 等待页面JS渲染 - DrissionPage:结合requests速度和selenium功能,更轻量。
处理验证码(最头疼的问题)
方案优先级:
- 绕过:使用
adblock插件拦截验证码脚本(如Cloudflare的turnstile)。 - 识别:使用
pytesseract(简单图形验证码)或付费打码平台(如超级鹰)。 - 人工介入:当概率低时,保留失败请求,等待人工处理。
模拟鼠标和键盘操作(破解行为分析)
场景:网站检测“点击频率”、“滚动速度”。
Selenium 模拟:
from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.move_to_element(element).perform() # 悬停 actions.click().perform()
使用专业的反爬绕过库(一键集成)
GitHub 经典项目:
- fake-useragent:自动生成随机、真实的User-Agent
from fake_useragent import UserAgent ua = UserAgent() headers = {'User-Agent': ua.random} - requests-html:支持解析JavaScript,比纯requests更方便
- cloudscraper:专门绕过Cloudflare的防护
import cloudscraper scraper = cloudscraper.create_scraper() response = scraper.get('https://site-protected-by-cloudflare.com')
一套可执行的“反封”流程
import time
import random
import requests
from fake_useragent import UserAgent
ua = UserAgent()
session = requests.Session()
# 配置代理(可选)
proxies = {'http': 'http://your_proxy:port'}
def safe_request(url, retries=3):
for i in range(retries): # 重试机制
try:
# 1. 随机UA
headers = {'User-Agent': ua.random}
# 2. 模拟浏览器常见附加头
headers['Accept-Language'] = 'en-US,en;q=0.9'
# 3. 使用Session保持Cookie
response = session.get(url, headers=headers, proxies=proxies, timeout=10)
# 4. 检测状态码
if response.status_code == 200:
return response
elif response.status_code == 429: # 请求过多
wait = 2 ** i + random.random()
time.sleep(wait)
else:
time.sleep(2)
except Exception as e:
time.sleep(3)
return None
# 5. 每个请求间随机延迟
time.sleep(random.uniform(1, 3))
data = safe_request('https://example.com')
最终建议
- 先观察再动手:抓包分析网站的反爬机制(如Cookie有效期、AJAX请求参数)。
- 尊重robots.txt:纯道德层面,但很多网站会据此封IP。
- 优先选择API接口:如果网站有官方API,优先使用,这是最合法的方式。