欢迎光临
我们一直在努力

Bright Data Web Scraping指南 2026: 使用 MCP + Dify 自动采集海外社交媒体数据

前言

在现代 web scraping 场景中,获取海外社交媒体的 web data 通常需要强大的 proxy service、IP rotation 和 anti-bot 技术支持。基于上次分享的 Bright Data MCP + Dify 电商数据采集工作流的成功经验,我对其进行了升级优化,打造了一个专门针对社交媒体平台的数据采集工作流,以下是完整的教程分享。

为什么多平台采集这么难?

作为营销与社媒分析人员,需要同时监控 海外社交媒体 上的红人动态和趋势数据。但每个平台都有自己的"护城河":

平台

主要反爬机制

DIY失败率

Tik

签名加密、设备指纹

极高

LinkedIn

登录墙、行为检测

极高

每加一个平台就意味着多一套维护成本,更别提还要处理数据格式混乱的问题。所以还是用 Bright Data MCP + Dify 的组合方案。

架构介绍:Bright Data MCP + Dify

Bright Data MCP + Dify 是一个用于构建 AI 驱动数据采集工作流的架构,它允许 AI agent 直接访问企业级 Web scraping 基础设施。

架构流程:

用户输入(TikLinkedIn URL) → Dify Workflow → Bright Data MCP Server → Tik & LinkedIn → 结构化 JSON 输出 → Slack 报表

这个组合之所以有效,是因为:

  • Dify 提供可视化 Workflow,不用写爬虫逻辑
  • Bright Data MCP 处理所有平台的解封、代理、指纹
  • 两者结合 = AI 驱动的数据采集流水线

前置准备

你需要准备:

  • Bright Data 账号(免费试用$20额度)
  • Dify 账号(云端或本地部署均可)
  • Bright Data MCP Server API Token
  • 基本的 Dify Workflow 操作经验

 实战教程:手把手操作

Step 1:配置 Bright Data MCP Server

这比我预期的要简单得多,只花了我大约10分钟。

详细步骤:

  • 注册 Bright Data 账号
    • 访问 Bright Data 官网
    • 使用邮箱注册,完成身份验证
    • 注册成功后添加促销码会获得 $20 免费试用额度

  • 配置 MCP Server
  • 登录 Bright Data 控制台,进入 MCP 配置页面。

    选择社交媒体,点继续配置

    复制链接,我打码的部分是token,如果这里没有自动填充,可以去个人账户设置那里复制填充进来。

    Step 2:在 Dify 中添加 Bright Data MCP 工具

     进入 Dify 的「工具」页面,选择「添加外部 MCP 工具」,然后粘贴你在上一步获得的链接。

    粘贴URL,名称和服务器标识直接用我这个就行,自己取一个也行。然后点击添加

     Step 3:创建多平台采集 Workflow

    基于我完整的媒体数据采集.yml工作流,这里演示 TikTok + LinkedIn 社媒数据采集场景:

    输入节点:账号URL(支持批量,以逗号分隔)

    MCP工具节点:

    • web_data_tiktok_profiles:调用 TikTok 数据采集
    • web_data_linkedin_posts:调用 LinkedIn 数据采集

    LLM节点:

    • TikTok:提取互动率、粉丝数、内容摘要(娱乐化语气)
    • LinkedIn:提取专业领域、核心观点、价值主张(专业化语气)

    输出节点:推送至 Slack

    工作流还包含智能分类器,能自动识别输入的是 TikTok 还是 LinkedIn URL,并路由到相应的处理分支。

    详细步骤:

    创建新 Workflow
  • 在 Dify 中点击 创建空白应用
  • 输入名称和图标
  • 选择工作流
  • (1) 配置输入节点
  • 添加 Start 节点
    • 默认已存在
    • 配置输入参数:
    • Parameter Name: social_urls
    • Type: String
    • Required: Yes
    • Description: TikTok 或 LinkedIn 账号URL,多个URL用逗号分隔

    (2) 配置条件分支
  • 添加条件节点
    • 拖拽 "问题分类器" 节点到画布
    • 连接 用户输入节点到 问题分类器节点
    • 配置分类:
    • 输入变量: 用户输入变量
    • 分类1: TikTok 处理分支
    • 分类2 LinkedIn 处理分支

    (3) URL 预处理
    • 节点类型:Code(代码执行)
    • 功能:将用户输入的逗号分隔 URL 转换为数组格式。

    def main(arg1: str) -> dict:
    cleaned_input = arg1.replace(',', ',')
    urls = [url.strip() for url in cleaned_input.split(',')]
    urls = [url for url in urls if url]
    return {"result": urls}

     (4) 平台数据

    注意,虽然都是亮数据MCP但是选择的工具是不一样的

    (5) 数据预处理

    • LinkedIn 流程:
      • 工具:web_data_linkedin_posts(Bright Data 提供)
      • 输入:单个 LinkedIn URL
      • 输出:帖子数据(作者、粉丝数、点赞数、评论数、帖子文本等)
    • TikTok 流程:
      • 工具:web_data_tiktok_profiles(Bright Data 提供)
      • 输入:单个 TikTok 个人主页 URL
      • 输出:账号数据(昵称、粉丝数、互动率、热门帖子描述等)

      def main(linkedin_data: list) -> dict:
      """
      处理 LinkedIn MCP 返回的数据

      参数:
      linkedin_data: MCP 返回的 LinkedIn 数据列表

      返回:
      提取的关键指标
      """
      if not linkedin_data or len(linkedin_data) == 0:
      return {
      "author_name": "Unknown",
      "followers": 0,
      "total_likes": 0,
      "total_comments": 0,
      "all_posts_text": ""
      }

      # 获取第一个帖子的作者信息(假设所有帖子来自同一作者)
      first_post = linkedin_data[0]
      author_name = first_post.get("user_title", "Unknown").split("•")[0].strip()
      followers = first_post.get("user_followers", 0)

      # 计算总互动数据
      total_likes = sum(post.get("num_likes", 0) for post in linkedin_data)
      total_comments = sum(post.get("num_comments", 0) for post in linkedin_data)

      # 合并所有帖子文本
      all_posts_text = "\\n—\\n".join(
      post.get("post_text", "") for post in linkedin_data
      )

      return {
      "author_name": author_name,
      "followers": followers,
      "total_likes": total_likes,
      "total_comments": total_comments,
      "all_posts_text": all_posts_text
      }

      • LinkedIn:
        • 提取作者名、粉丝数、总点赞/评论数,并合并所有帖子文本。
        • 代码如下:

    def main(scraper_data: list) -> dict:
    """
    处理 MCP 节点输出的 TikTok 账号数据

    参数:
    scraper_data: MCP 节点返回的账号数据列表

    返回:
    包含预处理数据的字典
    """
    try:
    # 验证输入数据
    if not isinstance(scraper_data, list) or len(scraper_data) == 0:
    return {
    "error": "输入数据格式不正确或为空",
    "input_type": str(type(scraper_data))
    }

    # 获取第一个账号数据
    account_data = scraper_data[0]

    # 提取关键字段
    nickname = account_data.get("nickname", "")
    followers = account_data.get("followers", 0)
    engagement_rate = account_data.get("awg_engagement_rate", 0.0)

    # 合并所有帖子描述
    descriptions = []
    top_posts = account_data.get("top_posts_data", [])

    for post in top_posts:
    description = post.get("description", "")
    if description:
    descriptions.append(description)

    all_descriptions = "\\n—\\n".join(descriptions)

    # 返回结果(键名必须与输出变量名匹配)
    return {
    "nickname": nickname,
    "followers": followers,
    "engagement_rate": engagement_rate,
    "all_descriptions": all_descriptions
    }

    except Exception as e:
    return {
    "error": str(e),
    "input_sample": str(scraper_data)[:200]
    }

    •  (6) LLM 内容分析

      • TikTok:
        • 提取昵称、粉丝数、互动率,并合并所有帖子描述。
        • 代码如下:

        你是一位专业的社交媒体分析师,专注于 LinkedIn 内容分析。请根据以下 LinkedIn 帖子内容,生成一个简洁、专业的摘要。

        要求:
        1. 识别账号的主要专业领域和内容主题
        2. 总结核心观点和价值主张
        3. 保持客观、专业的语气
        4. 摘要长度控制在 2-3 句话

        请分析以下 LinkedIn 帖子内容并生成专业摘要:

        {{#1776177480759.all_posts_text#}}

        • LinkedIn:
          • Prompt:要求 LLM 生成专业摘要,识别账号领域、核心观点。
          • 输出:2-3 句话的专业分析。
          • 完整提示词如下:

          你是一位专业的社交媒体内容分析师。请仔细阅读以下来自 TikTok 账号的多条帖子描述,并用一句简洁的话(不超过50个字)总结出该账号的核心内容主题、主要推广的产品或服务。

          帖子描述合集:
          {{#1776153576689.all_descriptions#}}

          请直接输出摘要,不要包含任何其他文字、解释或前缀。

          (7) 报告生成与 Slack 通知

     TikTok:

    • Prompt:要求 LLM 用一句话(≤50 字)总结账号核心内容或推广产品。
    • 输出:简洁的内容主题摘要。
    • 完整提示词如下:

    LinkedIn构建JSON代码

    import json
    from datetime import datetime

    def main(
    author_name: str,
    followers: int,
    total_likes: int,
    total_comments: int,
    all_posts_text: str,
    summary: str
    ) -> dict:
    """
    构建符合 Slack 格式的 JSON 输出

    参数:
    author_name: 作者姓名
    followers: 粉丝数
    total_likes: 总点赞数
    total_comments: 总评论数
    all_posts_text: 所有帖子文本
    summary: LLM 生成的内容摘要

    返回:
    包含 slack_message 和 original_json 的字典
    """

    # 计算平均互动数据
    post_count = len(all_posts_text.split('—')) if all_posts_text else 1
    avg_likes = total_likes / post_count if post_count > 0 else 0
    avg_comments = total_comments / post_count if post_count > 0 else 0

    # 构建 Slack 消息
    slack_message = {
    "text": f"💼 LinkedIn 账号分析报告 – {author_name}",
    "blocks": [
    {
    "type": "header",
    "text": {
    "type": "plain_text",
    "text": "LinkedIn 账号分析报告",
    "emoji": True
    }
    },
    {
    "type": "section",
    "fields": [
    {
    "type": "mrkdwn",
    "text": f"*👤 作者:*\\n{author_name}"
    },
    {
    "type": "mrkdwn",
    "text": f"*👥 粉丝数:*\\n{followers:,}"
    },
    {
    "type": "mrkdwn",
    "text": f"*👍 平均点赞:*\\n{avg_likes:.1f}"
    },
    {
    "type": "mrkdwn",
    "text": f"*💬 平均评论:*\\n{avg_comments:.1f}"
    }
    ]
    },
    {
    "type": "divider"
    },
    {
    "type": "section",
    "text": {
    "type": "mrkdwn",
    "text": f"*📝 内容分析摘要*\\n{summary}"
    }
    },
    {
    "type": "context",
    "elements": [
    {
    "type": "mrkdwn",
    "text": f"🕒 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    },
    {
    "type": "mrkdwn",
    "text": "🤖 由 MCP Scraper + LLM Analysis 生成"
    }
    ]
    }
    ]
    }

    # 构建原始数据
    original_data = {
    "linkedin_account": {
    "author_name": author_name,
    "followers": followers,
    "total_posts_analyzed": post_count,
    "total_likes": total_likes,
    "total_comments": total_comments,
    "average_engagement": {
    "likes_per_post": round(avg_likes, 2),
    "comments_per_post": round(avg_comments, 2)
    }
    },
    "content_analysis": {
    "summary": summary,
    "raw_posts": all_posts_text,
    "post_count": post_count
    },
    "metadata": {
    "generated_at": datetime.now().isoformat(),
    "data_source": "MCP Scraper + LLM Analysis"
    }
    }

    return {
    "slack_message": slack_message,
    "original_json": json.dumps(original_data, ensure_ascii=False, indent=2)
    }

    TikTok构建JSON代码

    import json
    from datetime import datetime

    def main(
    nickname: str,
    followers: int,
    engagement_rate: float,
    all_descriptions: str,
    summary: str
    ) -> dict:
    """
    构建 Slack 消息并保留原始数据

    返回:
    包含 slack_message 和 original_json 两个字段
    """

    # 构建扁平的 Slack 消息(用于发送)
    slack_message = {
    "text": f"📊 TikTok 账号分析报告 – {nickname}",
    "blocks": [
    {
    "type": "header",
    "text": {
    "type": "plain_text",
    "text": "TikTok 账号分析报告",
    "emoji": True
    }
    },
    {
    "type": "section",
    "fields": [
    {
    "type": "mrkdwn",
    "text": f"*👤 昵称:*\\n{nickname}"
    },
    {
    "type": "mrkdwn",
    "text": f"*👥 粉丝数:*\\n{followers:,}"
    },
    {
    "type": "mrkdwn",
    "text": f"*📈 互动率:*\\n{engagement_rate:.2f}%"
    },
    {
    "type": "mrkdwn",
    "text": "*📱 平台:*\\nTikTok"
    }
    ]
    },
    {
    "type": "divider"
    },
    {
    "type": "section",
    "text": {
    "type": "mrkdwn",
    "text": f"*📝 内容摘要:*\\n{summary}"
    }
    },
    {
    "type": "context",
    "elements": [
    {
    "type": "mrkdwn",
    "text": f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    }
    ]
    }
    ]
    }

    # 构建原始数据(用于 original_json)
    original_data = {
    "tiktok_account": {
    "nickname": nickname,
    "followers": followers,
    "engagement_rate": round(engagement_rate, 4),
    "platform": "TikTok"
    },
    "content_analysis": {
    "summary": summary,
    "raw_descriptions": all_descriptions,
    "description_count": len(all_descriptions.split('—')) if all_descriptions else 0
    },
    "metadata": {
    "generated_at": datetime.now().isoformat(),
    "data_source": "MCP Scraper + LLM Analysis"
    }
    }

    # 返回两个字段
    return {
    "slack_message": slack_message,
    "original_json": json.dumps(original_data, ensure_ascii=False, indent=2)
    }

     LinkedIn/TikTok 共用逻辑:

    • 代码节点:构建 Slack 消息(含关键指标 + 内容摘要)和原始 JSON 数据。
    • HTTP 请求:通过 Webhook 将消息发送至 Slack 频道。

    运行结果展示

    输入内容分别如下:

    TikTok:https://www.tiktok.com/@berryveryloveyou,https://www.tiktok.com/@y5uhij3

    LinkedIn: https://www.linkedin.com/posts/catherine-mcdonald-b6157210a_but-what-do-you-mean-by-build-better-systems-activity-7447538724416086016-DiED,https://www.linkedin.com/posts/omarhalabieh_most-people-start-with-the-plan-thats-activity-7447600379242049537-Loh7

    注意:只用输入链接部分就行了。

     这是工作流发送消息,请求是成功发送

    发送的内容是这个JSON

    下面是Slack收到的分析报告

    这是Slack收到的分析报告

     成本分析

    方案

    前期投入

    月均维护

    10万条数据成本

    自建爬虫

    2至 4周工程时间

    超过20小时每月

    工程成本难以量化

    Bright Data MCP + Dify

    不到1天配置

    低于2小时每月

    按成功采集付费

    Bright Data 的"只为成功采集付费"定价模式,大大降低了隐性成本——工程师时间、维护成本、封锁导致的数据损失。

     总结

    为了让大家能立即上手,我准备了完整的工作流,导入就能用。你可以访问我的网盘https://pan.baidu.com/s/1OsEZP6uEQTeIIGr_zi15zw?pwd=b2jy获取所有资源。

    使用方法:

  • 下载 yml 文件。
  • 在 Dify 中选择「导入工作流」。
  • 将 亮数据MCP中的链接 替换为你自己的。
  • 完成!现在你可以输入任何帖子链接,开始监控了。
  • 如果你也厌倦了与爬虫的无休止斗争,现在就是改变的时候。如果你想快速验证这个工作流,可以先从 Bright Data MCP 免费版本开始,并下载本文提供的模板,相比传统爬虫,这套方案可以:

    – 减少 90% 爬虫维护成本

    – 避免 IP 封禁和 CAPTCHA

    – 快速构建 AI 驱动的数据采集系统

    赞(0)
    未经允许不得转载:171主机测评 » Bright Data Web Scraping指南 2026: 使用 MCP + Dify 自动采集海外社交媒体数据
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址