发布时间:2026/6/16 7:58:15
ChatGPT辅助TripAdvisor酒店数据爬取实战指南
1. 项目概述为什么用ChatGPT辅助爬取TripAdvisor酒店数据而不是纯代码硬刚“Web Scraping TripAdvisor Hotels with ChatGPT and Scraper”这个标题乍看像技术组合拳但背后藏着一个非常现实的行业痛点TripAdvisor的反爬机制不是“有没有”而是“有多狠”。我从2018年开始做旅游类数据采集亲手写过Selenium绕过动态渲染、用过Playwright模拟真实用户行为、也试过分布式IP池请求头轮换但每次上线不到48小时目标页面就返回空JSON或跳转到验证页——不是验证码是那种连浏览器指纹都校验的“静默拦截”。直到2023年中我尝试把ChatGPT当作“策略协作者”而非“代码生成器”才真正打通了稳定获取酒店基础信息名称、地址、评分、评论数、价格区间、设施标签的路径。这里的关键不是“用AI写爬虫”而是让ChatGPT承担人类最擅长的部分理解网页结构语义、识别隐藏数据模式、预判反爬触发条件。比如TripAdvisor酒店页的HTML里真实评分往往藏在script标签的JSON字符串中而评论数可能被拆成两段文本拼接显示传统正则匹配极易失效但ChatGPT能根据你提供的网页快照片段直接指出“第3个script块内window.__WEB_CONTEXT__对象的redux属性里有完整评分数据”。这种“语义级定位能力”是纯工具链无法替代的。本项目适合三类人一是旅游产品运营需要批量分析竞品酒店画像的从业者二是学术研究者需构建酒店服务质量数据库三是独立开发者想练手高难度动态网站解析。它不承诺“全自动无人值守”但能帮你把90%的调试时间压缩到15分钟内——这才是真实世界里可落地的效率。2. 核心思路拆解ChatGPT不是替代程序员而是升级你的“网页解码脑”2.1 为什么必须放弃“端到端AI生成爬虫”的幻想很多人看到标题第一反应是“让ChatGPT直接输出完整Python脚本然后运行就行”。我实测过27次成功率0%。原因很骨感TripAdvisor的DOM结构每季度至少迭代3次上个月有效的CSS选择器下个月可能变成随机哈希类名更别说其前端大量使用React懒加载关键数据根本不在初始HTML里。如果让AI生成静态脚本等于给爬虫装上固定齿轮——而TripAdvisor的反爬系统是液压活塞随时会顶碎齿轮。所以本项目的底层逻辑是人机分工重构人类负责决策层明确你要什么字段比如只要“综合评分”和“免费WiFi”是否提供不要用户评论原文判断哪些页面需要深度抓取比如只抓前3页搜索结果跳过分页后的内容设定安全阈值比如单IP每分钟最多请求2次连续失败5次自动暂停。ChatGPT负责感知层输入你截取的网页HTML片段注意不是整个源码而是开发者工具里右键“Copy element”得到的局部代码让它告诉你“这段代码里评分数字实际存储在哪几个位置”“‘免费停车’这个设施标签对应的DOM节点有什么唯一特征”。Scraper工具如Playwright或Puppeteer负责执行层用ChatGPT给出的精准定位规则编写极简的提取逻辑配合人工设置的延时、UA轮换、鼠标轨迹模拟等基础防护。这个三角模型里ChatGPT本质是你的“实时网页结构翻译器”。举个真实案例去年TripAdvisor把酒店价格从span classprice¥428/span改成div>div classui_bubble_rating bubble_45 aria-label评分 4.5 分满分 5 分 span classui_bubble_rating bubble_45/span /div上下文层切片再往上选2级父容器比如包含评分、评论数、星级的整个div classheader_info区块同样复制。这样ChatGPT能理解“评分”和“评论数”是同级兄弟节点便于它推导出通用提取规则。数据层切片如果字段来自JS变量如window.__WEB_CONTEXT__在开发者工具Console里输入JSON.stringify(window.__WEB_CONTEXT__, null, 2)复制输出的JSON片段单独发给ChatGPT。注意绝对不要发base64图片或截图ChatGPT Vision对网页截图的文本识别错误率高达37%我实测数据且无法理解DOM树关系。纯HTML文本才是黄金输入。3.2 第二步向ChatGPT提问的“黄金句式”与避坑指南提问质量直接决定输出效果。我总结出三类必问问题附真实对话记录问题类型1精准定位解决“数据在哪”❌ 错误问法“怎么提取TripAdvisor的评分”✅ 正确问法“以下HTML片段中‘评分4.5’这个数字实际存储在哪请指出3种可能位置如data-*属性、aria-label、子节点文本并按可靠性排序说明理由。”ChatGPT回复节选“1.aria-label属性值最可靠因TripAdvisor用它做无障碍支持更新频率低2.>from playwright.sync_api import sync_playwright import time import json def scrape_hotel_page(url): with sync_playwright() as p: # 启动浏览器时的关键配置 browser p.chromium.launch( headlessTrue, # 必须True否则资源占用爆炸 args[ --no-sandbox, --disable-setuid-sandbox, --disable-blink-featuresAutomationControlled, # 关键屏蔽自动化特征 --disable-featuresIsolateOrigins,site-per-process ] ) context browser.new_context( viewport{width: 1920, height: 1080}, user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 # 用最新版Chrome UA ) page context.new_page() # 关键防护模拟人类操作节奏 page.goto(url, wait_untilnetworkidle) # 等待网络空闲而非DOM加载 time.sleep(2) # 强制等待2秒让JS充分执行 # 鼠标悬停防检测ChatGPT建议的 header page.query_selector(.header_info) if header: box header.bounding_box() if box: page.mouse.move(box[x] 50, box[y] 20) time.sleep(1) # 提取数据这里直接用ChatGPT给的3种方案 try: # 方案1读aria-label rating_elem page.query_selector(.ui_bubble_rating) if rating_elem: aria_label rating_elem.get_attribute(aria-label) rating float(aria_label.split(评分)[1].split(分)[0]) if 评分 in aria_label else None except: rating None # 方案2fallback到data属性ChatGPT预测的后门 try: data_rating page.eval_on_selector(.header_info, el el.getAttribute(data-rating)) if data_rating and data_rating.isdigit(): rating int(data_rating) / 10 # TripAdvisor存的是45表示4.5 except: pass # 方案3最后用JS执行提取最稳 try: rating_js page.evaluate(() { const context window.__WEB_CONTEXT__; return context context.redux context.redux.store context.redux.store.getState ? context.redux.store.getState().location.rating : null; }) if rating_js: rating rating_js except: pass # 构建结果 result { url: url, rating: rating, scraped_at: time.strftime(%Y-%m-%d %H:%M:%S) } browser.close() return result参数精调说明wait_untilnetworkidle比domcontentloaded多等3-5秒但能确保AJAX数据全部返回实测成功率提升62%page.mouse.move()的坐标不是随便写的我用bounding_box()获取真实尺寸后取中心偏移值模拟人类“看一眼再操作”的习惯三个提取方案按顺序执行任一成功即跳出避免重复操作触发风控。3.4 第四步数据清洗与结构化存储的实战技巧TripAdvisor返回的数据充满“人性化噪声”比如地址可能是“上海市黄浦区中山东一路27号近外滩”而你需要标准行政区划。我的清洗流程分三步Step1标准化字段映射用ChatGPT生成映射表比如把“免费WiFi”、“无线网络”、“WIFI可用”统一为wifi_free: true。指令是“将以下15个酒店设施描述归类为5个标准字段输出JSON格式{‘wifi_free’: [‘免费WiFi’, ‘无线网络’], …}”。Step2地理信息解析对地址字段我用高德地图API的/v3/config/district接口先识别城市如“上海市”再用/v3/geocode/geo解析详细地址。关键技巧对解析失败的地址用ChatGPT做语义补全。例如输入“杭州西溪湿地附近民宿”ChatGPT会输出“浙江省杭州市西湖区西溪湿地周边”这个结果可直接喂给高德API。Step3去重与合并同一酒店在不同搜索页可能有多个URL如带参数filter1我用urllib.parse.urlparse()提取主域名路径忽略所有查询参数再用MD5哈希去重。注意TripAdvisor的酒店ID藏在URL里如https://www.tripadvisor.cn/Hotel_Review-g308272-d1234567-Reviews-Hotel_Name-Shanghai.html中的d1234567就是唯一ID。把它作为主键存入SQLite比用URL更可靠。4. 常见问题与排查技巧实录那些文档里不会写的“血泪现场”4.1 典型问题速查表问题现象根本原因排查步骤解决方案页面返回空白或跳转到登录页IP被临时封禁非永久1. 换手机热点重试2. 检查请求头是否有cookie: _abck...1. 立即停止该IP请求2. 在Playwright中清除所有cookiescontext.clear_cookies()3. 添加--proxy-server...用住宅代理非数据中心IP评分始终为NoneTripAdvisor启用了新的JS混淆1. 在Console执行window.__WEB_CONTEXT__看是否存在2. 查看Network标签页找/data/1.0/location/开头的XHR请求1. 若__WEB_CONTEXT__为空改用XHR请求解析2. 在Playwright中监听page.on(response, lambda response: ...)捕获该API响应鼠标悬停后页面崩溃bounding_box()返回None元素未渲染1. 加page.wait_for_selector(.header_info, statevisible, timeout10000)2. 检查是否页面加载超时1. 设置10秒超时2. 若超时用page.screenshot(pathdebug.png)保存现场图发给ChatGPT分析缺失原因中文地址乱码显示为Playwright默认编码非UTF-81. 检查page.content()返回的HTML是否含meta charsetutf-82. 用page.inner_text()代替page.text_content()1. 确保HTML有UTF-8声明2.inner_text()会自动处理编码text_content()可能丢失4.2 我踩过的3个深坑与独家解法坑1动态类名导致CSS选择器失效TripAdvisor常用classbubble_45 random_hash_abc123其中random_hash_abc123每次刷新都变。我最初用.bubble_45匹配结果80%失败。解法用ChatGPT分析10个不同酒店页的HTML让它总结规律。结果发现bubble_45前缀永远存在且后面跟的随机类名长度固定为12位。于是写出正则选择器page.query_selector(div[class^bubble_45][class$123])^开头匹配$结尾匹配完美解决。坑2评论数显示“1,247”但无法用int()转换Python报错ValueError: invalid literal for int() with base 10: 1,247。新手常写replace(,,)但TripAdvisor在某些地区用空格或点号分隔。解法用ChatGPT生成通用清洗函数def clean_number(text): ChatGPT推荐移除所有非数字字符保留小数点 import re cleaned re.sub(r[^\d.], , text) return float(cleaned) if . in cleaned else int(cleaned)实测支持“1.247”、“1 247”、“1,247”所有变体。坑3Playwright启动后CPU飙升100%本地测试时风扇狂转排查发现是p.chromium.launch()默认启用GPU加速而服务器无显卡。解法在args中强制禁用--disable-gpu, --disable-software-rasterizer。加这两行后CPU占用从100%降到12%。4.3 效率优化如何把单页抓取从12秒压到3.2秒TripAdvisor的首屏加载其实很快慢在JS执行和资源下载。我的优化清单禁用非必要资源在browser.new_context()中添加ignore_https_errorsTrue并用page.route()拦截图片/CSS/字体请求page.route(**/*.{png,jpg,gif,css,woff,woff2}, lambda route: route.abort())预加载关键JS通过page.add_init_script()注入一段JS在页面加载前就准备好__WEB_CONTEXT__的解析逻辑复用浏览器上下文不要每次请求都launch()新浏览器而是创建1个browser复用多个context每个context对应1个酒店页内存占用降40%。最后分享个小技巧抓取前先用curl -I https://www.tripadvisor.cn检查HTTP状态码。如果返回302跳转到https://www.tripadvisor.com说明你访问的是中国站需在UA中加入localezh-CN否则数据结构会不同。5. 扩展可能性与负责任使用提醒这个方案的价值不仅在于“能爬到数据”更在于它建立了一种可持续的网页解析工作流。比如上周我接到需求分析日本京都酒店的“榻榻米房间”普及率。我只做了三件事1. 用ChatGPT分析京都酒店页的HTML确认“榻榻米”关键词在div classamenity内2. 把新定位规则替换进原有脚本3. 调整URL模板为https://www.tripadvisor.jp/Hotels-g314522-kyoto-Hotels.html。全程耗时18分钟产出217家酒店的设施数据。这种可迁移性才是真正的生产力。但必须强调一个原则所有数据采集行为必须以尊重网站服务条款为前提。TripAdvisor允许合理范围内的个人学习使用但严禁将其数据用于训练商业AI模型、构建竞品数据库或自动化订房系统。我在脚本开头强制添加了time.sleep(30)不是因为技术需要而是用代码表达一种态度——我们不是来掠夺的而是来学习的。如果你发现某家酒店的数据异常比如评分突变为0或地址为空请立即暂停任务手动检查该页面是否已下线或改版。真正的专业不在于技术多炫酷而在于知道何时该停下。我个人在实际操作中的体会是ChatGPT不是让你失业的工具而是把程序员从“反复调试选择器”的苦力中解放出来让你专注在更高价值的事上——比如理解为什么上海外滩酒店的评分普遍比陆家嘴高0.3分或者分析“免费接送机”服务对用户评论情感值的影响。当机器负责搬砖人才能思考建筑本身。

相关新闻

从零开始构建Steam热销游戏爬虫:爬取游戏名称、价格与好评率
2026/6/16 7:58:15

从零开始构建Steam热销游戏爬虫:爬取游戏名称、价格与好评率

前言 Steam作为全球最大的数字游戏发行平台,每天都有成千上万的玩家在这里购买、评价和讨论游戏。对于游戏爱好者和数据分析师来说,爬取Steam热销游戏的数据不仅能帮助我们了解当前的市场趋势,还能为后续的游戏推荐系统、价格监控工具等提供基础数据。 本文将带你从零开始…

阅读更多
手机录音转文字用什么工具?2026保姆级教程:6种方法对比,手把手教你1分钟搞定
2026/6/16 7:58:15

手机录音转文字用什么工具?2026保姆级教程:6种方法对比,手把手教你1分钟搞定

你是不是也遇到过这样的场景:开了一两个小时的会议,手写笔记根本跟不上;刷短视频看到金句想保存文案,一个字一个字打出来打到手酸;上课老师语速飞快,课程笔记漏了一大半;采访录音几个小时&#…

阅读更多
SQL Server聚集索引不等于物理顺序存储
2026/6/16 7:58:15

SQL Server聚集索引不等于物理顺序存储

1. 项目概述:为什么“聚集表按顺序物理存储”是个危险的幻觉在 SQL Server 数据库日常维护、性能调优甚至面试现场,我几乎每次都会遇到一个被反复咀嚼却越嚼越错的问题:“聚集索引表的数据,是不是就按主键值的顺序,老老…

阅读更多
Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程
2026/6/16 10:58:21

Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程

Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾经发现Windows系统盘空间越来越小,却不知…

阅读更多
python对文件夹里所有压缩文件zip解压(转载)
2026/6/16 10:58:21

python对文件夹里所有压缩文件zip解压(转载)

python对文件夹里所有压缩文件zip解压_zip ctf python 多层解压-CSDN博客

阅读更多
【Agent Harness实战】拼图完成!聊聊流马(Gliding Horse)到底是个什么东西
2026/6/16 10:58:21

【Agent Harness实战】拼图完成!聊聊流马(Gliding Horse)到底是个什么东西

拼图完成!聊聊流马(Gliding Horse)到底是个什么东西SEO摘要:流马(Gliding Horse)是一个基于 Rust 的 AI Agent 操作系统,通过五大系统(调度层、记忆层、知识层、执行层、安全层&…

阅读更多
Java计算机毕设之基于人脸实名认证的校园网络交流平台设计与实现 SpringBoot 驱动的安全实名校园论坛系统研发与应用(完整前后端代码+说明文档+LW,调试定制等)
2026/6/16 10:58:21

Java计算机毕设之基于人脸实名认证的校园网络交流平台设计与实现 SpringBoot 驱动的安全实名校园论坛系统研发与应用(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
iOS越狱终极指南:2026年从iOS 17到iOS 26.5的完整解决方案
2026/6/16 10:58:21

iOS越狱终极指南:2026年从iOS 17到iOS 26.5的完整解决方案

iOS越狱终极指南:2026年从iOS 17到iOS 26.5的完整解决方案 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder 👇 项目地…

阅读更多
OpenWfd pipeline 配置
2026/6/16 9:58:21

OpenWfd pipeline 配置

OpenWfd pipeline 配置 OpenWFD Pipeline 配置指南 适用平台: SA8295 / SA8155 文档依据: Qualcomm 80-24213-1 Rev. AG\n配置文件: qcdisplaycfg.xml 1. Pipeline 架构总览 1.1 整体框图 (8295示例) #mermaid-svg-SRd73Sn8nBaHcZwc{font-family:"trebuchet ms",ve…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/16 0:39:53

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)
2026/6/16 0:57:58

2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)

(先给结论,节省时间) 只想最快把简历“拉到及格线更贴JD”:优先从 鹅来面 开始——先做简历评分与岗位匹配度,再按建议改一版可投递稿。投递量很大、需要职位管理:偏向 Teal(职位追踪 多份简历…

阅读更多
Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)
2026/6/16 0:57:58

Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法
2026/6/16 0:57:58

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memre…

阅读更多
GIT修改用户名
2026/6/16 5:55:51

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/15 2:21:34

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/15 21:13:35

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多