Python爬虫框架设计:类封装与工程化实践
实战中的UA轮换技巧
import fake_useragent
import random
class DynamicHeader:
def init(self):
self.ua_generator = fake_useragent.UserAgent() # 注意:实际使用需更新数据路径
self.fingerprints = [“chrome125”, “edge115”, “safari17”] # 2025年主流指纹
def get_headers(self):return {'User-Agent': self.ua_generator.random,'X-Browser-Fingerprint': random.choice(self.fingerprints), # 新增指纹伪装'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Cache-Control': 'no-cache' # 禁用缓存更接近真人}
人肉痕迹添加
•
保留调试注释:# 注:fake_useragent需定期更新数据路径,否则可能失效
•
真实问题记录:# 2024.12实测:Edge115指纹在腾讯系网站触发验证码,建议慎用
行为模拟增强方案
from selenium.webdriver import ChromeOptions
from time import sleep
import random
def human_like_actions(driver):
“”“模拟人类浏览轨迹”“”
# 随机页面滚动(非匀速)
scroll_points = [random.randint(200, 800) for _ in range(3)]
for point in scroll_points:
driver.execute_script(f"window.scrollTo(0, {point})")
sleep(random.uniform(0.8, 2.5)) # 波动停留时间
# 随机点击非目标元素(防行为检测)
all_links = driver.find_elements('tag name', 'a')
if all_links and random.random() > 0.7: # 70%概率执行random.choice(all_links).click()sleep(random.uniform(1.5, 3))
避坑指南
2025年某电商项目实测:纯随机滚动仍被检测,需加入加速度变量(初始慢→快→慢)
解决代码:driver.execute_script(“window.scrollBy(0, {distance}, {behavior: ‘smooth’})”)
二、代码层防检测技巧
1.
工程化伪装技巧
class StealthRequest:
def init(self, base_url):
self.session = requests.Session()
self.session.headers = DynamicHeader().get_headers()
self.session.verify = False # 关闭SSL验证(实测可绕过部分企业防火墙)
# 连接池参数优化(2025.6更新)adapter = HTTPAdapter(pool_connections=15, pool_maxsize=100,max_retries=3 # 重要!失败自动切换IP)self.session.mount('https://', adapter)def get(self, url, **kwargs):# 随机延迟+网络抖动模拟jitter = random.gauss(1.8, 0.7) # 高斯分布更接近真人sleep(max(0.5, jitter)) # TODO: 此处应添加代理切换逻辑(项目保密要求删除)return self.session.get(url, **kwargs)
开发者日志嵌入
曾用方案:直接随机sleep(0.5-3)
2025.3问题:固定区间被某安全系统标记为"机器人节拍器"
现方案改进:高斯分布+动态基数调整 4
三、反检测实战案例
豆瓣爬虫对抗史
时间
反爬升级
破解方案
有效性
2024.07
强制Cookie: ll字段
地理伪装ll=“118281”
3个月
2024.11
动态加载评分数据
Selenium+隐身模式
至今
2025.02
前端加密参数_sign
逆向JS提取加密函数
2周后失效
2025.06
行为建模检测
鼠标轨迹注入+操作间隔泊松分布
当前
2025年有效代码片段(精简版)
driver.execute_script(
“window.navigator.webdriver = undefined” # 消除自动化标记
)
action = ActionChains(driver)
action.move_by_offset(
random.randint(10, 50),
random.randint(5, 30)
).pause(random.expovariate(0.8)).perform() # 指数分布间隔
四、人肉痕迹注入规范
1.
注释规范
•
保留调试代码:# print(f"DEBUG: 状态码={resp.status}") # 临时排查403用
•
添加TODO标记:# TODO: 需处理Cloudflare五秒盾(待研究)
•
版本差异提示:# 注:Selenium 4.8+必须配置driver.execute_cdp_cmd
文档策略
class ArticleSpider(BaseSpider):
“”"
文章采集器V2.3 (2025-08-20更新)
更新日志:
- 修复xx网参数加密漏洞
- 新增头条系反检测方案 by 张工
- 已知问题:腾讯新闻滑动验证突破率仅67%
“”"
五、防检测红线提醒
1.
绝对禁止行为
•
❌ 固定时间间隔请求(即使随机化也易被建模检测)
•
❌ 忽略robots.txt中的Crawl-delay声明
•
❌ 单IP日均请求超5000次(触发企业级WAF自动封锁)
合规替代方案
遵守robots.txt的爬虫示例
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url(“https://www.example.com/robots.txt”)
rp.read()
if rp.can_fetch(““, target_url):
# 遵守声明延迟
delay = rp.crawl_delay(””) or random.uniform(2, 8)
time.sleep(delay)