一、代码架构优化方案
1. 模块化重构(改进前 vs 改进后)
# 原始代码结构
for i in range(1,100):
# 重复定义headers/payload
for h in range(...):
# 嵌套请求逻辑
# 优化后结构
class XHSCrawler:
def __init__(self):
self.session = requests.Session()
self.workbook = openpyxl.Workbook()
self.__init_headers()
def __init_headers(self):
"""动态请求头管理"""
self.headers = {
'X-t': self.generate_timestamp(),
'X-S-Common': self.get_x_common_token(),
# 其他动态参数...
}
def crawl_pages(self, max_page=100):
"""分页控制主逻辑"""
for page in range(1, max_page+1):
self.process_page(page)
time.sleep(random.uniform(1.5, 3.0))
def process_page(self, page):
"""单页处理逻辑"""
data = self.fetch_page_data(page)
for item in data['items']:
self.process_item(item)
二、动态参数破解技巧
1. 12位时间戳生成优化
def generate_timestamp(self):
now = datetime.datetime.now()
return int(now.timestamp() * 1000 + now.microsecond // 1000)
2. X-S-Common 参数逆向(伪代码示例)
def get_x_common_token(self):
# 需通过逆向工程实现动态生成
base_str = "2UQAPsHC+aIjqArjwjHjNsQhPsHCH0rjN..."
dynamic_part = hashlib.md5(str(time.time()).encode()).hexdigest()[:8]
return f"{base_str}{dynamic_part}"
三、反反爬策略升级
1. 请求特征动态化
def rotate_headers(self):
self.headers.update({
'User-Agent': random.choice(USER_AGENTS),
'X-Mns': self.generate_fingerprint(),
})
def generate_fingerprint(self):
# 生成浏览器指纹的伪代码
canvas_hash = hashlib.md5(str(random.random()).encode()).hexdigest()
return f"awiZ/{canvas_hash[:10]}"
2. 智能延时策略
class AdaptiveDelayer:
def __init__(self):
self.last_response_time = None
def get_delay(self):
if self.last_response_time > 2.0:
return random.uniform(5.0, 8.0)
return random.expovariate(1/3.0)
四、数据解析强化
1. 健壮的XPath选择器
CONTENT_SELECTORS = [
'//div[@id="detail-desc"]//text()',
'//meta[@property="og:description"]/@content',
'//article[contains(@class,"content")]//text()'
]
def extract_content(self, tree):
for selector in CONTENT_SELECTORS:
if result := tree.xpath(selector):
return ' '.join(result).strip()
return "内容解析失败"
2. 数据校验机制
def validate_item(self, item):
required_fields = ['id', 'note_card', 'xsec_token']
if not all(field in item for field in required_fields):
raise InvalidDataError("缺少关键字段")
if len(item['id']) < 16:
raise InvalidDataError("ID格式异常")
五、工程化改进方案
1. 配置管理
# config.yaml
crawler:
max_retries: 5
timeout: 10
proxy_pool:
- http://proxy1.example.com:8080
- http://proxy2.example.com:8080
rate_limit: 3.0 # 请求间隔下限
2. 日志监控系统
class CrawlerMonitor:
def __init__(self):
self.stats = {
'success': 0,
'failed': 0,
'last_error': None
}
def show_dashboard(self):
print(f"\n[实时统计] 成功: {self.stats['success']} | 失败: {self.stats['failed']}")
if self.stats['failed'] > 100:
self.trigger_alert()
六、法律合规建议
- 数据脱敏处理示例
def anonymize_data(self, row):
return {
'title': hashlib.sha256(row['标题'].encode()).hexdigest(),
'content': re.sub(r'\b\d{11}\b', '[PHONE]', row['文章']),
'link': row['链接'][:50]+'...'
}
💡 本代码示例仅供参考学习,实际应用需遵循《数据安全法》和《个人信息保护法》规定,建议在合法授权范围内使用。建议添加数据采集量自动熔断机制,当日采集超过1000条自动停止。