大众点评反爬破解终极指南从字体加密到分布式采集的完整解决方案【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址: https://gitcode.com/gh_mirrors/di/dianping_spider大众点评数据采集面临着业界最严格的动态字体加密和反爬机制本项目提供了从基础请求到高级反爬对抗的完整解决方案。通过Python实现支持全站数据采集包括搜索页、详情页、评论页并解决动态字体加密问题无需OCR识别。本文将详细介绍技术挑战、解决方案、实战应用和最佳实践帮助你快速搭建稳定的大众点评数据采集系统。 技术挑战大众点评的反爬机制有多强大众点评作为国内领先的本地生活服务平台其反爬系统达到了L4级成熟度主要技术挑战包括1. 动态字体加密这是最核心的反爬手段。大众点评使用自定义字体文件渲染关键数据评分、价格、评论数等常规爬虫只能获取到乱码或特殊符号。字体文件会动态更新不同页面甚至不同时间访问都可能使用不同的字体映射关系。图字体加密破解前后的数据对比左侧为加密显示右侧为解密后真实数据2. 请求签名验证所有API请求都需要携带动态生成的签名参数包含设备信息、时间戳和请求内容的加密组合。签名算法会定期更新静态的爬虫很快就会失效。3. Cookie池与IP检测大众点评严格监控Cookie和IP的使用频率短时间内大量请求会导致IP被封禁、Cookie失效。需要智能的Cookie轮换和IP代理管理策略。4. 行为模式识别系统会分析用户的操作模式如请求间隔、浏览路径、停留时间等识别非人类行为模式。 解决方案完整的反爬技术栈1. 字体加密破解技术本项目通过fontTools库解析字体文件实现动态字体映射from fontTools.ttLib import TTFont import re class FontDecoder: def __init__(self): self.font_map {} def parse_font(self, font_content): 解析字体文件建立Unicode到真实字符的映射 font TTFont(BytesIO(font_content)) glyph_order font.getGlyphOrder()[2:] # 跳过前两个特殊字符 # 提取每个字符的轮廓特征 for glyph_name in glyph_order: glyph font[glyf][glyph_name] if glyph.numberOfContours 0: # 计算轮廓特征点 coordinates [] for contour in glyph.contours: for point in contour: coordinates.append((point.x, point.y)) # 根据特征点识别字符 char self.identify_character(coordinates) self.font_map[glyph_name] char return self.font_map def decode_text(self, encrypted_text): 解密字体加密的文本 # 匹配加密字符模式如 #xe639; pattern r#x([0-9a-f]); matches re.findall(pattern, encrypted_text) for match in matches: unicode_point funi{match.upper()} if unicode_point in self.font_map: encrypted_text encrypted_text.replace( f#x{match};, self.font_map[unicode_point] ) return encrypted_text2. 请求签名算法实现在function/get_encryption_requests.py中我们实现了完整的请求签名生成import zlib import base64 import time def get_token(shop_url): 生成请求token ts int(time.time() * 1000) cts int(time.time() * 1000) - 600 # 构造签名数据 tokens str({ rId: 100041, ver: 1.0.6, ts: ts, cts: cts, brVD: [1920, 186], brR: [[1920, 1080], [1920, 1040], 24, 24], bI: [shop_url, shop_url], mT: [1244,588], kT: [], aT: [], tT: [], aM: , sign: eJxTKs7IL/BMsTU2NTAwMLVUAgApvgRP }).encode() # 压缩并编码 _token zlib.compress(tokens) token base64.b64encode(_token).decode() return token3. 分布式代理与Cookie管理通过utils/spider_config.py配置代理和Cookie池# config.ini配置示例 [proxy] use_proxy true repeat_nub 3 http_extract your_proxy_api key_extract your_key_api proxy_host proxy_server_ip proxy_port proxy_server_port key_id your_key_id key_key your_key_key [config] use_cookie_pool true Cookie your_cookie_string uuid your_uuid tcv your_tcv user-agent Mozilla/5.0... 实战应用构建旅游攻略数据采集系统1. 系统架构设计本项目采用模块化设计主要组件包括任务调度器负责任务分发与进度监控代理管理器管理代理IP池与动态切换请求引擎处理HTTP请求与响应解析数据解析器提取目标数据并进行清洗反爬处理器处理字体加密、签名验证等反爬机制数据存储支持MongoDB等多种存储方式图反爬系统监控面板展示关键性能指标与告警信息2. 数据采集流程搜索页数据采集# 完整流程搜索 python main.py --normal 1 --detail 1 --review 1 --keyword 火锅 --location_id 1详情页数据采集# 只采集详情页 python main.py --normal 0 --detail 1 --review 0 --shop_id k30YbaScPKFS0hfP评论页数据采集# 只采集评论页 python main.py --normal 0 --detail 0 --review 1 --shop_id k30YbaScPKFS0hfP --need_more True3. 数据字段展示店铺搜索结果包含店铺ID、店铺名、评分、人均价格、地址、推荐菜等完整字段评论数据包含用户ID、评论内容、评论时间、评分、图片链接等详细信息JSON数据结构嵌套JSON结构包含店铺详细信息的多层字段 最佳实践高效稳定的数据采集策略1. 配置优化建议代理策略配置在config.ini中合理配置代理参数[proxy] ; 启用代理池 use_proxy true ; 每个IP重复使用次数 repeat_nub 3 ; HTTP代理提取接口 http_extract http://your-proxy-api.com/get ; 秘钥模式代理 key_extract http://your-proxy-api.com/get_keyCookie管理策略使用Cookie池轮换避免单个Cookie过度使用定期更新Cookie保持会话有效性结合用户代理(User-Agent)随机化2. 请求频率控制# 在utils/requests_utils.py中实现智能请求间隔 import random import time class SmartRequest: def __init__(self): self.last_request_time 0 self.min_interval 2 # 最小间隔2秒 self.max_interval 5 # 最大间隔5秒 def smart_sleep(self): 智能休眠模拟人类浏览行为 current_time time.time() elapsed current_time - self.last_request_time if elapsed self.min_interval: sleep_time self.min_interval - elapsed random.uniform(0.5, 1.5) time.sleep(sleep_time) self.last_request_time time.time()3. 错误处理与重试机制def safe_request(url, max_retries3): 带重试机制的请求函数 for attempt in range(max_retries): try: response requests.get(url, timeout10) if response.status_code 200: return response elif response.status_code 403: # IP被封禁切换代理 switch_proxy() time.sleep(5) else: time.sleep(2 ** attempt) # 指数退避 except Exception as e: logger.error(f请求失败: {e}, 重试 {attempt 1}/{max_retries}) time.sleep(2 ** attempt) return None4. 数据质量保障完整性检查验证必填字段是否完整检查数据格式是否符合预期验证关联数据的一致性准确性验证对比多个数据源的同一信息验证字体解密结果的正确性检查时间戳的合理性 性能优化与监控1. 监控指标请求成功率目标 90%数据完整性目标 95%代理可用率目标 80%解密成功率目标 99%2. 性能优化技巧并发控制from concurrent.futures import ThreadPoolExecutor, as_completed def concurrent_crawl(urls, max_workers5): 并发爬取控制并发数 results [] with ThreadPoolExecutor(max_workersmax_workers) as executor: future_to_url { executor.submit(fetch_url, url): url for url in urls } for future in as_completed(future_to_url): url future_to_url[future] try: data future.result() results.append(data) except Exception as e: logger.error(fURL {url} 爬取失败: {e}) return results内存优化使用生成器处理大数据集及时释放不再使用的资源分批写入数据库避免内存溢出 注意事项与法律合规1. 使用限制仅限学习交流使用禁止商用未经授权禁止转载遵守网站robots.txt协议控制采集频率避免对目标网站造成影响2. 法律风险提示尊重数据版权和隐私权不采集个人敏感信息遵守相关法律法规合理使用采集的数据 快速开始指南1. 环境配置# 克隆项目 git clone https://gitcode.com/gh_mirrors/di/dianping_spider # 安装依赖 cd dianping_spider pip install -r requirements.txt2. 基础配置修改config.ini配置文件配置代理和Cookie信息设置数据库连接参数调整采集参数关键词、地区等3. 运行采集# 完整采集流程 python main.py --normal 1 --detail 1 --review 1 --keyword 旅游景点 --location_id 2 # 查看采集结果 # 数据将保存到配置的MongoDB数据库中4. 自定义采集通过修改require.ini配置文件可以灵活控制采集内容是否需要店铺电话是否需要详细评论需要采集的评论页数其他高级选项 未来发展方向1. 技术演进深度学习在反爬对抗中的应用更智能的行为模拟算法自适应反爬策略调整2. 功能扩展支持更多数据源增加数据清洗和预处理功能提供数据分析和可视化工具支持更多数据库类型3. 性能提升分布式采集架构更高效的代理管理算法智能请求调度优化 总结大众点评数据采集是一个技术挑战与机遇并存的领域。通过本项目的完整解决方案你可以快速上手提供开箱即用的采集框架稳定运行内置多重反爬对抗机制灵活配置支持多种采集场景和需求高效扩展模块化设计便于功能扩展无论是用于市场研究、竞品分析还是学术研究这个项目都能为你提供可靠的数据采集能力。记住技术是工具合理、合法、合规地使用才是关键。项目地址https://gitcode.com/gh_mirrors/di/dianping_spider注本项目遵循GPL-3.0开源协议仅限学习交流使用。【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址: https://gitcode.com/gh_mirrors/di/dianping_spider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考