跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python算法

携程景区评论数据爬取:Python 实战解析

基于 Python requests 库模拟网络请求,定位携程景区评论接口。通过 F12 开发者工具分析参数,构建 headers 和 cookies 完成数据获取。结合 pandas 进行数据清洗与存储,支持分页抓取及多维度统计(评分、游客类型、地区分布)。代码包含完整的数据提取、分析及文件保存逻辑,适用于学习 Web 爬虫及数据分析流程。

蜜桃汽水发布于 2026/3/23更新于 2026/5/75 浏览
携程景区评论数据爬取:Python 实战解析

一、前言

本文演示如何使用 Python 抓取携程景区的评论数据。通过逆向分析接口参数,结合 requests 库模拟请求,最终实现数据的获取、清洗与存储。

二、网络请求分析

  1. 定位接口 打开携程景区详情页(例如哈尔滨冰雪大世界),按 F12 打开开发者工具。点击'下一页'或滚动页面,观察 Network 面板中的请求变化。通常动态更新的数据会通过 POST 请求调用后端接口,而静态页面则是 GET 请求。

通过搜索评论内容关键字,可以定位到核心接口 getCommentCollapseList。

文章配图

  1. 提取参数 在请求详情中查看 Request Headers 和 Payload。重点关注 Cookie 中的身份标识(如 GUID, UBT_VID)以及 JSON 参数中的分页信息(pageIndex, pageSize)。如果不确定如何构造请求,可以使用浏览器右键复制为 cURL (bash),然后通过 curlconverter.com 转换为 Python 代码作为参考。

文章配图

三、代码实现

1. 基础请求封装

首先构建一个函数来模拟发送请求。注意,Cookie 和 Token 具有时效性,实际运行时可能需要定期刷新。

import requests

def crawl_comment(page_index=1):
    """
    模拟携程景区评论接口请求
    :param page_index: 页码,从 1 开始
    """
    cookies = {
        'GUID': 'YOUR_GUID_HERE', 
        'MKT_CKID': 'YOUR_MKT_CKID_HERE',
        # ... 其他必要的 Cookie 字段 ...
        '_RF1': 'YOUR_IP_ADDRESS',
        'UBT_VID': 'YOUR_UBT_VID',
        # 请根据实际浏览器环境替换以下敏感信息
        'cticket': 'YOUR_CTICKET',
        'login_uid': 'YOUR_LOGIN_UID'
    }
    
    headers = {
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : ,
        : 
    }
    
    params = {
        : ,
        : 
    }
    
    json_data = {
        : {
            : ,
            : ,
            : ,
            : page_index,  
            : ,           
            : ,           
            : ,
            : ,
            : 
        },
        : {
            : ,
            : ,
            : ,
            : ,
            : ,
            : 
        }
    }
    
    url = 
    response = requests.post(url, params=params, cookies=cookies, headers=headers, json=json_data)
     response.json()
'accept'
'*/*'
'accept-language'
'zh-CN,zh;q=0.9,en;q=0.8'
'content-type'
'application/json'
'origin'
'https://you.ctrip.com'
'referer'
'https://you.ctrip.com/'
'user-agent'
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0'
'x-ctx-currency'
'CNY'
'x-ctx-locale'
'zh-CN'
'x-ctx-ubt-pageid'
'290510'
'x-ctx-ubt-pvid'
'13'
'x-ctx-ubt-sid'
'57'
'x-ctx-ubt-vid'
'YOUR_UBT_VID'
'_fxpcqlniredt'
'YOUR_GUID_HERE'
'x-traceID'
'YOUR_TRACE_ID'
'arg'
'channelType'
2
'collapseType'
0
'commentTagId'
0
'pageIndex'
# 修改此处控制页码
'pageSize'
10
# 单页数量,最大支持 300
'poiId'
80633
# 景区 ID
'sourceType'
1
'sortType'
3
'starType'
0
'head'
'cid'
'YOUR_CID'
'ctok'
''
'cver'
'1.0'
'lang'
'01'
'sid'
'8888'
'syscode'
'09'
'https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList'
return
2. 数据解析与存储

获取到 JSON 响应后,需要提取关键字段并保存。这里使用 pandas 进行结构化处理,并导出为 CSV 和 TXT 报告。

import json
import pandas as pd
from datetime import datetime

def format_timestamp(timestamp_str):
    """格式化时间戳 /Date(1742347091000+0800)/ -> YYYY-MM-DD HH:MM:SS"""
    if not timestamp_str:
        return ''
    try:
        if timestamp_str.startswith('/Date('):
            millis = int(timestamp_str.replace('/Date(', '').replace(')/', '').split('+')[0])
            dt = datetime.fromtimestamp(millis / 1000)
            return dt.strftime('%Y-%m-%d %H:%M:%S')
    except:
        pass
    return timestamp_str

def extract_comments(json_data):
    """从 API 返回中提取评论列表"""
    comments = []
    if 'result' in json_data and 'items' in json_data['result']:
        for item in json_data['result']['items']:
            comment_info = {
                'comment_id': item.get('commentId'),
                'user_nick': item.get('userInfo', {}).get('userNick', ''),
                'score': item.get('score', 0),
                'content': item.get('content', ''),
                'publish_time': format_timestamp(item.get('publishTime', '')),
                'tourist_type': {0: '个人游', 1: '情侣夫妻', 2: '家庭亲子', 3: '朋友出游', 4: '商务出差', 5: '独自旅行'}.get(item.get('touristType', 0), '其他'),
                'ip_location': item.get('ipLocatedName', ''),
                'useful_count': item.get('usefulCount', 0),
                'reply_count': item.get('replyCount', 0),
                'image_count': len(item.get('images', []))
            }
            comments.append(comment_info)
    return comments

def save_data(comments, filename='comments'):
    """保存数据到 CSV 和 TXT"""
    df = pd.DataFrame(comments)
    df.to_csv(f'{filename}.csv', index=False, encoding='utf-8-sig')
    
    with open(f'{filename}.txt', 'w', encoding='utf-8') as f:
        f.write(f"共抓取 {len(comments)} 条评论\n")
        for i, c in enumerate(comments[:5], 1): # 仅预览前 5 条
            f.write(f"[{i}] {c['user_nick']} ({c['score']}分): {c['content'][:50]}...\n")
    print(f"数据已保存至 {filename}.csv")

# 主流程示例
if __name__ == '__main__':
    all_comments = []
    # 循环抓取多页,例如抓取前 3 页
    for page in range(1, 4):
        data = crawl_comment(page_index=page)
        comments = extract_comments(data)
        all_comments.extend(comments)
        print(f"第{page}页完成,获取 {len(comments)} 条")
    
    save_data(all_comments, 'harbin_reviews')

四、注意事项

  1. Cookie 有效性:示例中的 Cookie 和 Token 是临时的,运行失败时请重新从浏览器获取。
  2. 频率限制:建议增加随机延时,避免请求过快触发反爬机制。
  3. 分页逻辑:pageSize 参数可调整,但需注意单次请求量不宜过大,通常 10-30 条较为稳妥。

通过上述步骤,你可以快速搭建一个针对携程景区评论的爬虫脚本,并根据需求扩展更多分析维度。

目录

  1. 一、前言
  2. 二、网络请求分析
  3. 三、代码实现
  4. 1. 基础请求封装
  5. 2. 数据解析与存储
  6. 主流程示例
  7. 四、注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 工业物联网时序数据库选型:InfluxDB 与 Apache IoTDB 对比
  • 基于 Python+Django 的智慧农业管理系统设计与实现
  • 人工智能赋能招聘行业:从效率革新到平台经济重构
  • Kimi Code:Moonshot AI 推出的智能编程助手
  • AI 提示词写作指南:精准表达与场景应用
  • 太空算力星座与端侧 AI 智能体:AI 基础设施双重突破与重构
  • ELMo 模型详解:上下文感知词向量表示技术
  • Stable Diffusion 新手入门:AI 绘画基础与指令详解
  • 2026 国内 AI 编程套餐(Coding Plan)全量横评:选型指南与避坑手册
  • 飞牛NAS原生WebDAV挂载115网盘配置指南
  • EmulatorJS 浏览器模拟器部署与优化实战
  • Git 分支管理实战指南
  • Flutter shelf_web_socket 鸿蒙适配指南:端侧 WebSocket 服务构建
  • 多无人机协同吊载高速穿越 0.8 米窄缝通道
  • 扩散模型(Diffusion Model)原理与图像生成实战
  • C# 日期处理实战:计算周范围与周数
  • 如何快速部署 PrivateGPT?构建企业级私有化大模型
  • GitHub Copilot 实战:AI 辅助编程效率提升指南
  • 优秀数据分析师必备的 10 项关键技能
  • 本地搭建带知识库的 AI 助手:Ollama + Open WebUI 实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online