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分钟。

详细步骤:

  1. 注册 Bright Data 账号
  • 访问 Bright Data 官网
  • 使用邮箱注册,完成身份验证
  • 注册成功后添加促销码会获得 $20 免费试用额度
  1. 配置 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
  1. 在 Dify 中点击 创建空白应用
  2. 输入名称和图标
  3. 选择工作流
(1) 配置输入节点
  1. 添加 Start 节点
  • 默认已存在
  • 配置输入参数:
  • Parameter Name: social_urls
  • Type: String
  • Required: Yes
  • Description: TikTok 或 LinkedIn 账号URL,多个URL用逗号分隔
(2) 配置条件分支
  1. 添加条件节点
  • 拖拽 "问题分类器" 节点到画布
  • 连接 用户输入节点到 问题分类器节点
  • 配置分类:
  • 输入变量: 用户输入变量
  • 分类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获取所有资源。

使用方法:

  1. 下载 yml 文件。
  2. 在 Dify 中选择「导入工作流」。
  3. 将 亮数据MCP中的链接 替换为你自己的。
  4. 完成!现在你可以输入任何帖子链接,开始监控了。

如果你也厌倦了与爬虫的无休止斗争,现在就是改变的时候。如果你想快速验证这个工作流,可以先从 Bright Data MCP免费版本开始,并下载本文提供的模板,相比传统爬虫,这套方案可以:

  • 减少 90% 爬虫维护成本

  • 避免 IP 封禁和 CAPTCHA

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

相关推荐
gogoing1 小时前
await fetch() 的两阶段设计
前端·javascript
gogoing1 小时前
前端首屏加载优化
前端·javascript
gogoing1 小时前
重排与重绘
前端·javascript
岁月标记1 小时前
RLHF 基于人类反馈的强化学习简介
人工智能
Ian在掘金1 小时前
从零实现一个 PDF 智能问答系统
人工智能·langchain
打小就很皮...1 小时前
基于Python + LangChain + 通义千问的聊天机器人实战
前端·langchain·机器人·千问
飞Link1 小时前
智能体时代的“紧箍咒”:深度解析 Agent 治理架构与 AI 杀伤开关
人工智能·架构
飞Link1 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
REDcker2 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站