前言

在现代 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 转换为数组格式。

    
  1. def main(arg 1: str) - > dict:
  2. cleaned_ input = arg 1. replace( ',', ',')
  3. urls = [url.strip() for url in cleaned_ input.split( ',')]
  4. urls = [url for url in urls if url]
  5. return { "result": urls}
AI写代码

 (4) 平台数据

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

(5) 数据预处理

  • LinkedIn 流程:
    • 工具:web_data_linkedin_posts(Bright Data 提供)
    • 输入:单个 LinkedIn URL
    • 输出:帖子数据(作者、粉丝数、点赞数、评论数、帖子文本等)
  • TikTok 流程:
    • 工具:web_data_tiktok_profiles(Bright Data 提供)
    • 输入:单个 TikTok 个人主页 URL
    • 输出:账号数据(昵称、粉丝数、互动率、热门帖子描述等)
    
          
    1. def main(linkedin_ data: list) - > dict:
    2. "" "
    3. 处理 LinkedIn MCP 返回的数据
    4. 参数:
    5. linkedin_data: MCP 返回的 LinkedIn 数据列表
    6. 返回:
    7. 提取的关键指标
    8. " ""
    9. if not linkedin_ data or len(linkedin_ data) = = 0:
    10. return {
    11. "author_name": "Unknown",
    12. "followers": 0,
    13. "total_likes": 0,
    14. "total_comments": 0,
    15. "all_posts_text": ""
    16. }
    17. # 获取第一个帖子的作者信息(假设所有帖子来自同一作者)
    18. first_post = linkedin_ data[ 0]
    19. author_name = first_post. get( "user_title", "Unknown").split( "•")[ 0].strip()
    20. followers = first_post. get( "user_followers", 0)
    21. # 计算总互动数据
    22. total_likes = sum(post. get( "num_likes", 0) for post in linkedin_ data)
    23. total_comments = sum(post. get( "num_comments", 0) for post in linkedin_ data)
    24. # 合并所有帖子文本
    25. all_posts_text = "\n---\n".join(
    26. post. get( "post_text", "") for post in linkedin_ data
    27. )
    28. return {
    29. "author_name": author_name,
    30. "followers": followers,
    31. "total_likes": total_likes,
    32. "total_comments": total_comments,
    33. "all_posts_text": all_posts_text
    34. }
    AI写代码
    • LinkedIn:
      • 提取作者名、粉丝数、总点赞/评论数,并合并所有帖子文本。
      • 代码如下:


    
  1. def main(scraper_ data: list) - > dict:
  2. "" "
  3. 处理 MCP 节点输出的 TikTok 账号数据
  4. 参数:
  5. scraper_data: MCP 节点返回的账号数据列表
  6. 返回:
  7. 包含预处理数据的字典
  8. " ""
  9. try:
  10. # 验证输入数据
  11. if not isinstance(scraper_ data, list) or len(scraper_ data) = = 0:
  12. return {
  13. "error": "输入数据格式不正确或为空",
  14. "input_type": str( type(scraper_ data))
  15. }
  16. # 获取第一个账号数据
  17. account_ data = scraper_ data[ 0]
  18. # 提取关键字段
  19. nickname = account_ data. get( "nickname", "")
  20. followers = account_ data. get( "followers", 0)
  21. engagement_rate = account_ data. get( "awg_engagement_rate", 0.0)
  22. # 合并所有帖子描述
  23. descriptions = []
  24. top_posts = account_ data. get( "top_posts_data", [])
  25. for post in top_posts:
  26. description = post. get( "description", "")
  27. if description:
  28. descriptions.append(description)
  29. all_descriptions = "\n---\n".join(descriptions)
  30. # 返回结果(键名必须与输出变量名匹配)
  31. return {
  32. "nickname": nickname,
  33. "followers": followers,
  34. "engagement_rate": engagement_rate,
  35. "all_descriptions": all_descriptions
  36. }
  37. except Exception as e:
  38. return {
  39. "error": str(e),
  40. "input_sample": str(scraper_ data)[: 200]
  41. }
AI写代码
  •  (6) LLM 内容分析

    • TikTok:
      • 提取昵称、粉丝数、互动率,并合并所有帖子描述。
      • 代码如下:
      
              
      1. 你是一位专业的社交媒体分析师,专注于 LinkedIn 内容分析。请根据以下 LinkedIn 帖子内容,生成一个简洁、专业的摘要。
      2. 要求:
      3. 1. 识别账号的主要专业领域和内容主题
      4. 2. 总结核心观点和价值主张
      5. 3. 保持客观、专业的语气
      6. 4. 摘要长度控制在 2- 3 句话
      7. 请分析以下 LinkedIn 帖子内容并生成专业摘要:
      8. {{# 1776177480759. all_posts_text#}}
      AI写代码
      • LinkedIn:
        • Prompt:要求 LLM 生成专业摘要,识别账号领域、核心观点。
        • 输出:2-3 句话的专业分析。
        • 完整提示词如下:
        
                  
        1. 你是一位专业的社交媒体内容分析师。请仔细阅读以下来自 TikTok 账号的多条帖子描述,并用一句简洁的话(不超过50个字)总结出该账号的核心内容主题、主要推广的产品或服务。
        2. 帖子描述合集:
        3. {{#1776153576689.all_descriptions#}}
        4. 请直接输出摘要,不要包含任何其他文字、解释或前缀。
        AI写代码
        (7) 报告生成与 Slack 通知

 TikTok:

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

LinkedIn构建JSON代码


    
  1. import json
  2. from datetime import datetime
  3. def main(
  4. author_name: str,
  5. followers: int,
  6. total_likes: int,
  7. total_comments: int,
  8. all_posts_text: str,
  9. summary: str
  10. ) - > dict:
  11. "" "
  12. 构建符合 Slack 格式的 JSON 输出
  13. 参数:
  14. author_name: 作者姓名
  15. followers: 粉丝数
  16. total_likes: 总点赞数
  17. total_comments: 总评论数
  18. all_posts_text: 所有帖子文本
  19. summary: LLM 生成的内容摘要
  20. 返回:
  21. 包含 slack_message 和 original_json 的字典
  22. " ""
  23. # 计算平均互动数据
  24. post_ count = len( all_posts_text.split( '---')) if all_posts_text else 1
  25. avg_likes = total_likes / post_ count if post_ count > 0 else 0
  26. avg_comments = total_comments / post_ count if post_ count > 0 else 0
  27. # 构建 Slack 消息
  28. slack_message = {
  29. "text": f "💼 LinkedIn 账号分析报告 - {author_name}",
  30. "blocks": [
  31. {
  32. "type": "header",
  33. "text": {
  34. "type": "plain_text",
  35. "text": "LinkedIn 账号分析报告",
  36. "emoji": True
  37. }
  38. },
  39. {
  40. "type": "section",
  41. "fields": [
  42. {
  43. "type": "mrkdwn",
  44. "text": f "*👤 作者:*\n{author_name}"
  45. },
  46. {
  47. "type": "mrkdwn",
  48. "text": f "*👥 粉丝数:*\n{followers:,}"
  49. },
  50. {
  51. "type": "mrkdwn",
  52. "text": f "*👍 平均点赞:*\n{avg_likes:.1f}"
  53. },
  54. {
  55. "type": "mrkdwn",
  56. "text": f "*💬 平均评论:*\n{avg_comments:.1f}"
  57. }
  58. ]
  59. },
  60. {
  61. "type": "divider"
  62. },
  63. {
  64. "type": "section",
  65. "text": {
  66. "type": "mrkdwn",
  67. "text": f "*📝 内容分析摘要*\n{summary}"
  68. }
  69. },
  70. {
  71. "type": "context",
  72. "elements": [
  73. {
  74. "type": "mrkdwn",
  75. "text": f "🕒 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
  76. },
  77. {
  78. "type": "mrkdwn",
  79. "text": "🤖 由 MCP Scraper + LLM Analysis 生成"
  80. }
  81. ]
  82. }
  83. ]
  84. }
  85. # 构建原始数据
  86. original_ data = {
  87. "linkedin_account": {
  88. "author_name": author_name,
  89. "followers": followers,
  90. "total_posts_analyzed": post_ count,
  91. "total_likes": total_likes,
  92. "total_comments": total_comments,
  93. "average_engagement": {
  94. "likes_per_post": round(avg_likes, 2),
  95. "comments_per_post": round(avg_comments, 2)
  96. }
  97. },
  98. "content_analysis": {
  99. "summary": summary,
  100. "raw_posts": all_posts_text,
  101. "post_count": post_ count
  102. },
  103. "metadata": {
  104. "generated_at": datetime.now().isoformat(),
  105. "data_source": "MCP Scraper + LLM Analysis"
  106. }
  107. }
  108. return {
  109. "slack_message": slack_message,
  110. "original_json": json.dumps(original_ data, ensure_ascii = False, indent = 2)
  111. }
AI写代码

TikTok构建JSON代码


    
  1. import json
  2. from datetime import datetime
  3. def main(
  4. nickname: str,
  5. followers: int,
  6. engagement_rate: float,
  7. all_descriptions: str,
  8. summary: str
  9. ) - > dict:
  10. "" "
  11. 构建 Slack 消息并保留原始数据
  12. 返回:
  13. 包含 slack_message 和 original_json 两个字段
  14. " ""
  15. # 构建扁平的 Slack 消息(用于发送)
  16. slack_message = {
  17. "text": f "📊 TikTok 账号分析报告 - {nickname}",
  18. "blocks": [
  19. {
  20. "type": "header",
  21. "text": {
  22. "type": "plain_text",
  23. "text": "TikTok 账号分析报告",
  24. "emoji": True
  25. }
  26. },
  27. {
  28. "type": "section",
  29. "fields": [
  30. {
  31. "type": "mrkdwn",
  32. "text": f "*👤 昵称:*\n{nickname}"
  33. },
  34. {
  35. "type": "mrkdwn",
  36. "text": f "*👥 粉丝数:*\n{followers:,}"
  37. },
  38. {
  39. "type": "mrkdwn",
  40. "text": f "*📈 互动率:*\n{engagement_rate:.2f}%"
  41. },
  42. {
  43. "type": "mrkdwn",
  44. "text": "*📱 平台:*\nTikTok"
  45. }
  46. ]
  47. },
  48. {
  49. "type": "divider"
  50. },
  51. {
  52. "type": "section",
  53. "text": {
  54. "type": "mrkdwn",
  55. "text": f "*📝 内容摘要:*\n{summary}"
  56. }
  57. },
  58. {
  59. "type": "context",
  60. "elements": [
  61. {
  62. "type": "mrkdwn",
  63. "text": f "⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
  64. }
  65. ]
  66. }
  67. ]
  68. }
  69. # 构建原始数据(用于 original_json)
  70. original_ data = {
  71. "tiktok_account": {
  72. "nickname": nickname,
  73. "followers": followers,
  74. "engagement_rate": round(engagement_rate, 4),
  75. "platform": "TikTok"
  76. },
  77. "content_analysis": {
  78. "summary": summary,
  79. "raw_descriptions": all_descriptions,
  80. "description_count": len( all_descriptions.split( '---')) if all_descriptions else 0
  81. },
  82. "metadata": {
  83. "generated_at": datetime.now().isoformat(),
  84. "data_source": "MCP Scraper + LLM Analysis"
  85. }
  86. }
  87. # 返回两个字段
  88. return {
  89. "slack_message": slack_message,
  90. "original_json": json.dumps(original_ data, ensure_ascii = False, indent = 2)
  91. }
AI写代码

 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 驱动的数据采集系统

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3e17o7liy82sc
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐