【2026最新携程酒店爬虫分享】用Python批量爬取酒店评论,含回复内容一键保存Excel!

您好,我是@iFeng的小屋,一枚4年程序猿。

一、爬取目标

很多做市场调研或出行规划的朋友,都想深入了解某家酒店的真实口碑。但携程评论页翻来翻去很麻烦,而且酒店的回复内容往往藏在折叠层里,手工复制太累。

所以,我写了这个携程酒店评论爬虫,它能:

  • 根据酒店ID,一键抓取指定页数的评论

  • 获取每条评论的正文、评分、时间、用户名、点赞数、房型、出行类型

  • 自动提取酒店的回复内容,包括回复时间

  • 使用多线程(可调并发数)加速,同时控制请求频率

  • 所有数据直接保存为Excel,规整好用

目前是源码格式,还没有封装成软件,如果想要软件的我后续开发一个软件版本的。

二、展示爬取结果

话不多说,先看成果。爬取结果包含以下字段:

字段:酒店id,正文,评分,评论时间,入住时间,用户名,评论点赞量,评论等级,房间类型名称,旅游类型,回复者,回复内容,回复时间。

字段齐全,可作为后续研究分析使用。

三、原理讲解

  1. 打开携程酒店详情页,按F12进入开发者工具,翻看评论页,找到评论数据的接口。发现是restapi/soa2/33278/getHotelCommentList,POST请求。

  2. 接口请求体是JSON格式,包含 hotelId(酒店ID)、pageIndex(页码)、pageSize(每页条数)、orderBy(排序方式)等参数。

  3. requests 模拟这个POST请求,带上必要的Headers,就能拿到JSON数据。

  4. 解析JSON中的 commentList,提取每条评论的字段。特别注意 feedbackList 里藏着酒店的回复内容。

  5. 最后用 pandas 把数据存成Excel。

四、爬虫代码讲解

导入库:

python 复制代码
import requests
import json
import time
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
3.1 核心思路与配置

需要两个关键参数:酒店ID要爬的页数 。酒店ID可以从URL中获取,比如 https://hotels.ctrip.com/hotels/878902.html878902 就是酒店ID。

为了方便使用,我直接把酒店ID和页数写在脚本末尾,你也可以改成input输入。

python运行

3.2 关键步骤:构造请求与解析数据

这是爬虫的核心,POST请求的构造必须准确:

python 复制代码
def fetchComments(hotelId, pageIndex):
    url = "https://m.ctrip.com/restapi/soa2/33278/getHotelCommentList"
    headers = {
        'Content-type': 'application/json',
        'Origin': 'https://hotels.ctrip.com',
        'Referer': 'https://hotels.ctrip.com',
        'user-agent': 'Mozilla/5.0...'
    }
    ...
    r = requests.post(url, json=formData, headers=headers)
    data = r.json()
    comment_list = data.get("data", {}).get("commentList", [])
    # ... 解析每条评论
3.3 关键步骤:多线程抓取

虽然单线程也能跑,但多线程能让速度翻倍(但要控制并发数,别把网站搞崩了):

python 复制代码
def fetchHotelComments(hotelId, numPages=10):
    all_comments = []
    def fetch_page(pageIndex):
        return fetchComments(hotelId, pageIndex)

    with ThreadPoolExecutor(max_workers=3) as executor:  # 最多3个线程
        results = executor.map(fetch_page, range(1, numPages + 1))
        for page_comments in results:
            all_comments.extend(page_comments)
            time.sleep(1)  # 每页间隔1秒,太猛容易被封
    return all_comments

四、如何运行?

  1. 安装依赖pip install requests pandas openpyxl

  2. 修改参数 :在 if __name__ == "__main__": 下面,把 hotel_id 换成你想爬的酒店ID,把 total_pages 改成你要的页数(每页10条)。

  3. 运行脚本:直接执行,等待结果。

  4. 查看结果 :当前目录下会生成 comments_酒店ID.xlsx 文件。

五、说明

  1. 酒店ID获取 :在携程酒店详情页的URL里,比如 https://hotels.ctrip.com/hotels/878902.html,数字部分就是酒店ID。

  2. 翻页逻辑:代码目前只爬指定页数,如果你需要爬全部评论,可以先通过第一页的响应获取总条数,再计算总页数,然后循环。为简化示例,这里只演示指定页数。

  3. 请求频率 :代码中已经加入了 time.sleep,请勿修改太快,以免被网站封IP。

  4. 完整源码 :上述代码为核心模块,完整可运行的源码包含更详细的异常处理和注释,已打包整理。

需要本文完整可运行Python源码的小伙伴,我都放在了与此号同名的公主号里,大家自行获取。

持续分享Python干货中!更多爬虫源码干货,请前往主页查看~

相关推荐
独自破碎E2 小时前
手撕真题-计算二叉树中两个节点之间的距离
java·开发语言
为美好的生活献上中指2 小时前
*Java 沉淀重走长征路*之——《Java Web 应用开发完全指南:从零到企业实战(两万字深度解析)》
java·开发语言·前端·html·javaweb·js
赵丙双2 小时前
python-docx 报错 KeyError: “There is no item named ‘NULL‘ in the archive“
python·word·docx·python-docx
不光头强2 小时前
抽象类和接口的区别
java·开发语言·python
ShoreKiten2 小时前
Flask/ssti --by vulhub
后端·python·flask
llxxyy卢2 小时前
polar-web题目
开发语言·前端·javascript
悦心无谓2 小时前
C++负载均衡式在线OJ测试报告
开发语言·c++·selenium·测试工具·负载均衡·编程语言·后端开发
꯭ 瞎꯭扯꯭蛋꯭2 小时前
3万字80道Java基础经典面试题总结
java·开发语言
m0_547722922 小时前
乒乓球比赛管理系统
python·mysql