大众点评爬虫深度解析:从动态字体加密到稳定数据采集的技术实现

张开发
2026/5/4 5:08:44 15 分钟阅读
大众点评爬虫深度解析:从动态字体加密到稳定数据采集的技术实现
大众点评爬虫深度解析从动态字体加密到稳定数据采集的技术实现【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址: https://gitcode.com/gh_mirrors/di/dianping_spider在大数据驱动的餐饮行业分析中大众点评爬虫作为一款专业的数据采集工具能够高效获取商家信息、用户评价和消费数据为市场研究和商业决策提供坚实的数据基础。这款开源工具不仅解决了大众点评平台复杂的反爬机制还通过智能策略确保了数据采集的稳定性和完整性。 核心技术原理揭秘如何突破动态字体加密字体加密的挑战与解决方案大众点评采用了动态字体加密技术来保护数据这是爬虫面临的首要技术挑战。传统的网页解析方法在这里完全失效因为页面中显示的文字与实际HTML中的字符编码完全不同。字体加密的工作原理服务器动态生成字体文件每个字体文件都有独特的字符映射关系页面中的文字使用CSS类名和字体映射来显示相同的字符在不同时间、不同页面可能使用不同的编码项目的解决方案# function/get_encryption_requests.py 中的字体映射解析逻辑 def get_font_msg(): 获取字体映射信息 # 动态下载并解析字体文件 # 建立加密字符与真实字符的对应关系 # 实时更新映射规则以应对字体变化图1通过开发者工具分析字体加密的网络请求找到动态字体文件下载接口请求参数动态生成机制除了字体加密大众点评还通过复杂的请求参数验证机制来阻止自动化访问。项目通过分析网络请求识别了关键参数参数名称作用获取方式uuid用户唯一标识从Cookie或网络请求中提取tcv时间戳验证动态生成的时间戳编码token访问令牌通过JavaScript加密算法生成shopId店铺唯一标识从URL或页面源码提取# 请求参数构建示例 params { shopId: H2noKWCDigM0H9c1, cityId: 19, shopType: 10, tcv: owlg0h6bkv, token: 动态生成的加密字符串, uuid: ad0a6c5-9211-42ae-ce66-d6df55e5ca6d, platform: 1, optimusCode: 10 } 快速实战十分钟搭建你的数据采集环境环境配置与依赖安装首先克隆项目仓库并安装必要的依赖# 克隆项目 git clone https://gitcode.com/gh_mirrors/di/dianping_spider # 进入项目目录 cd dianping_spider # 安装Python依赖 pip install -r requirements.txt核心依赖包说明lxml高效的HTML/XML解析库requestsHTTP请求库支持会话保持fontTools字体文件处理关键用于解析加密字体beautifulsoup4HTML解析处理页面结构pymongoMongoDB数据库连接配置文件深度解析项目提供了两个核心配置文件每个配置项都有其特定的作用config.ini - 核心运行配置[config] use_cookie_pool False # 是否启用Cookie池 save_mode mongo # 数据存储方式 requests_times 1,2;3,5;10,50 # 智能请求间隔控制 [detail] keyword 自助餐 # 搜索关键词 location_id 8 # 地区ID上海1北京2广州4 need_pages 5 # 爬取页数 [proxy] use_proxy False # 是否使用代理IPrequire.ini - 数据采集策略[shop_phone] need True # 是否需要店铺电话 need_detail False # 是否获取完整电话号码 [shop_review] need False # 是否需要店铺评论 more_detail False # 是否需要更多评论 need_pages 4 # 评论页数小贴士对于初次使用者建议从简单配置开始逐步增加复杂度。可以先关闭Cookie池和代理功能专注于理解基本的数据采集流程。三种运行模式对比项目支持灵活的采集模式满足不同场景需求运行模式命令示例适用场景数据完整性完整流程python main.py全流程数据采集⭐⭐⭐⭐⭐仅详情python main.py --normal 0 --detail 1 --review 0 --shop_id k30YbaScPKFS0hfP已有店铺ID只需基础信息⭐⭐⭐⭐仅评论python main.py --normal 0 --detail 0 --review 1 --shop_id k30YbaScPKFS0hfP用户评价分析⭐⭐⭐图2采集到的商家信息以结构化表格形式存储包含评分、地址、电话等关键信息⚡️ 性能优化手册让爬虫飞起来请求频率智能控制大众点评对高频访问有严格的限制。项目通过智能的请求间隔控制来模拟人类浏览行为# utils/requests_utils.py 中的请求控制逻辑 def parse_stop_time(self, requests_times): 解析请求间隔配置 格式1,2;3,5;10,50 含义每1次请求休息2秒每3次请求休息5秒每10次请求休息50秒 推荐配置策略使用场景请求间隔配置并发数Cookie池大小个人研究1,2;5,10;20,601-21-2个Cookie团队使用1,3;3,8;15,1203-55-10个Cookie大规模采集1,5;5,15;20,180需配合代理10个Cookie内存与资源管理优化长时间运行的爬虫需要良好的资源管理# utils/cache.py 中的缓存管理 class Cache: def __init__(self): self.font_cache {} # 字体映射缓存 self.request_cache {} # 请求结果缓存 self.max_cache_size 1000 # 最大缓存条目数优化建议定期清理缓存设置合理的缓存过期时间连接复用保持HTTP会话减少连接建立开销异步处理对于I/O密集型操作考虑使用异步请求错误处理与重试机制稳定的爬虫需要完善的错误处理# function/get_encryption_requests.py 中的重试逻辑 def get_retry_time(): 获取重试时间间隔 # 指数退避策略 # 首次失败等待2秒第二次4秒第三次8秒... # 最大重试次数3次️ 反爬对抗策略从基础到高级多层防御体系构建大众点评采用了多层次的防御机制项目通过综合策略应对反爬机制应对策略实现模块IP频率限制代理IP轮换 智能间隔utils/requests_utils.pyCookie验证Cookie池管理 动态更新utils/cookie_utils.py设备指纹随机UA 参数模拟function/get_encryption_requests.py行为分析随机延迟 操作模拟utils/spider_controller.py字体加密动态字体解析utils/get_font_map.pyCookie池的智能管理Cookie是维持登录状态的关键项目实现了完整的Cookie管理# utils/cookie_utils.py 中的Cookie管理 class CookieUtils: def get_cookie(self, mission_type): 根据任务类型获取合适的Cookie # 1. 检查Cookie有效性 # 2. 根据任务类型选择合适的Cookie # 3. 更新Cookie使用状态 # 4. 返回可用的CookieCookie池配置建议多账号轮换准备3-5个大众点评账号定期更新每天更新一次Cookie任务分离不同Cookie用于不同类型的请求图3分析请求参数了解反爬机制的关键参数如token、uuid、tcv等 数据采集实战从搜索到评论的完整流程搜索页数据采集搜索页是数据采集的起点项目通过以下步骤获取搜索结果# function/search.py 中的搜索逻辑 def search(self, search_url, request_typeproxy, cookie, last_chanceFalse): 搜索页数据采集 1. 构建搜索URL 2. 发送请求获取页面 3. 解析HTML提取店铺列表 4. 处理字体加密 5. 提取关键信息店铺ID、名称、评分等 搜索参数配置表参数说明示例值keyword搜索关键词自助餐location_id地区ID8大连channel_id频道ID0默认need_pages爬取页数5详情页深度解析详情页包含店铺的核心信息项目通过接口和页面解析两种方式获取# function/detail.py 中的详情获取 def get_detail(self, shop_id, request_typeproxy, cookie, last_chanceFalse): 获取店铺详情信息 支持两种方式 1. 接口方式速度快但部分信息可能不全 2. 页面解析信息完整但速度较慢 详情信息字段对比信息类型接口方式页面解析建议店铺名称✅ 完整✅ 完整两者均可评分信息✅ 准确❌ 可能不准推荐接口联系电话❌ 部分隐藏✅ 完整需要完整电话时用页面营业时间✅ 完整✅ 完整两者均可人均消费✅ 完整✅ 完整两者均可评论数据智能采集评论数据是用户研究的宝贵资源项目支持灵活的评论采集策略# function/review.py 中的评论获取 def get_review(self, shop_id, request_typeproxy, cookie, last_chanceFalse): 获取店铺评论 支持两种模式 1. 精选评论10条高质量评论 2. 全部评论分页获取所有评论 评论采集策略配置[shop_review] need True # 是否需要评论数据 more_detail True # 是否获取更多评论非精选 need_pages 3 # 需要爬取的评论页数图4采集到的用户评论数据包含评分、内容、标签等多维度信息 常见陷阱与避坑指南字体加密解析失败问题现象采集到的文本显示为乱码或特殊字符可能原因字体文件下载失败字体映射关系解析错误字体文件已更新但映射未更新解决方案检查网络连接确保能访问字体文件URL更新字体映射文件utils/get_font_map.py启用字体缓存机制减少重复下载# 字体映射更新示例 from utils.get_font_map import get_search_map_file # 强制更新字体映射 font_map get_search_map_file(page_source, force_updateTrue)Cookie失效或被封禁问题现象请求返回验证页面或访问被拒绝可能原因Cookie过期账号被封禁请求频率过高解决方案使用Cookie池轮换降低请求频率验证Cookie有效性# Cookie有效性检查 from utils.cookie_utils import CookieUtils cookie_utils CookieUtils() valid cookie_utils.check_cookie(cookie) if not valid: # 更新Cookie new_cookie cookie_utils.update_cookie()代理IP失效问题现象连接超时或请求失败可能原因代理IP被目标网站封禁代理服务器不稳定代理配置错误解决方案使用高质量的代理服务实现代理IP自动检测和切换设置合理的超时时间# config.ini 中的代理配置优化 [proxy] use_proxy True repeat_nub 3 # 每个IP重复使用次数 http_extract True # 使用HTTP提取模式 高级配置与自定义扩展自定义数据存储项目默认支持MongoDB存储但可以轻松扩展其他存储方式# utils/saver.py 中的数据存储抽象 class Saver: def save_data(self, data, data_type): 数据存储抽象方法 if self.save_mode mongo: # MongoDB存储 elif self.save_mode csv: # CSV文件存储 elif self.save_mode custom: # 自定义存储逻辑扩展自定义存储创建新的存储类继承Saver实现save_search_list,save_detail_list,save_review_list方法在配置中指定存储方式自定义数据清洗规则采集到的原始数据可能需要进一步清洗# 自定义数据清洗示例 def clean_shop_data(raw_data): 清洗店铺数据 cleaned {} # 处理空值 cleaned[name] raw_data.get(name, ).strip() # 格式化评分 score raw_data.get(score, 0) cleaned[score] float(score) if score else 0.0 # 提取地址信息 address raw_data.get(address, ) cleaned[province], cleaned[city] extract_location(address) return cleaned自定义请求头与参数针对特定的反爬策略可以自定义请求参数# 自定义请求头示例 custom_headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://www.dianping.com/, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Accept-Encoding: gzip, deflate, br, Connection: keep-alive, } # 在请求中使用自定义头 response requests.get(url, headerscustom_headers, timeout10) 性能监控与日志分析日志系统配置项目内置了完善的日志系统帮助监控运行状态# utils/logger.py 中的日志配置 def set_logger(): 配置日志系统 logger logging.getLogger(dianping_spider) logger.setLevel(logging.INFO) # 控制台输出 console_handler logging.StreamHandler() console_handler.setLevel(logging.INFO) # 文件输出 file_handler logging.FileHandler(spider.log) file_handler.setLevel(logging.DEBUG) # 添加到logger logger.addHandler(console_handler) logger.addHandler(file_handler) return logger日志级别建议日志级别使用场景信息量DEBUG开发调试详细的技术细节INFO日常运行关键操作记录WARNING潜在问题需要关注的警告ERROR错误情况需要立即处理的问题性能指标监控监控关键性能指标确保爬虫稳定运行指标正常范围异常处理请求成功率95%检查网络或代理平均响应时间3秒优化请求频率内存使用500MB清理缓存错误率5%检查配置和Cookie 最佳实践集锦高手的使用心得数据采集策略优化分时段采集高峰期19:00-22:00降低采集频率避免影响用户体验低谷期02:00-06:00提高采集效率减少被封风险分区采集# 按城市分区采集 cities { 上海: 1, 北京: 2, 广州: 4, 深圳: 7, 杭州: 3 } for city_name, city_id in cities.items(): config.set(detail, location_id, str(city_id)) # 执行采集任务数据质量保证数据验证机制完整性检查确保必填字段不为空格式验证检查电话号码、评分等格式一致性验证同一店铺不同时间的数据一致性def validate_shop_data(data): 验证店铺数据 required_fields [shop_id, name, score, address] for field in required_fields: if field not in data or not data[field]: return False, fMissing required field: {field} # 评分范围验证 if not 0 float(data.get(score, 0)) 5: return False, Invalid score range return True, Validation passed长期运行维护定期维护任务Cookie更新每周更新一次Cookie池字体映射更新每月更新字体映射文件代理IP检测每天检测代理IP可用性数据备份定期备份采集的数据图5从页面访问到数据提取的完整采集流程包含请求分析、参数构造、数据解析等步骤 未来发展方向与技术展望技术演进路线短期改进支持更多数据库类型MySQL、PostgreSQL等增加数据导出格式Excel、JSON等优化内存使用支持更大规模数据采集中长期规划集成机器学习算法智能识别反爬策略变化支持分布式爬取提高采集效率开发Web管理界面降低使用门槛生态扩展建议插件系统# 插件架构示例 class Plugin: def before_request(self, url, headers): 请求前处理 pass def after_response(self, response, data): 响应后处理 pass def on_error(self, error): 错误处理 pass社区贡献提交Issue报告问题提交Pull Request贡献代码分享使用经验和最佳实践编写文档和教程 下一步行动建议新手入门路径环境搭建按照快速实战部分完成基础环境配置简单测试使用默认配置运行一次完整采集理解原理阅读核心代码理解字体加密和反爬机制定制配置根据需求调整配置文件生产部署配置稳定的运行环境进阶学习资源官方文档docs/cookie_pool.mdCookie池使用指南docs/proxy.md代理配置详解docs/problems.md常见问题解决方案技术文章字体加密原理与破解反爬策略分析与应对高性能爬虫架构设计社区支持与交流问题反馈在项目仓库提交Issue技术讨论参与相关技术社区讨论经验分享撰写博客分享使用经验通过本指南您应该已经掌握了大众点评爬虫的核心技术和实战应用。记住技术只是工具合理、合法、合规地使用数据采集技术才能真正发挥其价值。祝您在数据采集的道路上越走越远图6大众点评爬虫的整体架构展示了从数据采集到存储的完整流程【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址: https://gitcode.com/gh_mirrors/di/dianping_spider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章