🥳Scrapeless Communityに参加して、強力なWebスクレイピングツールキットにアクセスするために無料トライアルを取得してください!
ブログに戻ります

PipedreamでGoogleトレンドトラッカーを作成する方法は?

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

05-Jun-2025

デジタルマーケティング、SEO、および新興トレンド分析の分野では、Googleトレンドの変化に常に最新の情報を保持することが不可欠です。しかし、手動でキーワードのトレンドデータを確認し、まとめるのは時間がかかり、エラーが発生しやすく、非効率的です。これを解決するために、キーワード収集やデータ処理から結果の配信まで、プロセス全体を効率化する自動化レポーティングシステムを構築しました。このシステムは、Pipedream、Scrapeless API、およびDiscord Webhookを統合しています。

この記事では、この自動化システムの構成要素と実装について詳しく説明します。

主な特徴

  • 自動キーワードトレンド分析:Scrapelessを使用して過去1か月のトレンドデータを取得します。

  • スマートスコアリングと処理:各キーワードの平均人気とトレンド変動を自動的に計算します。

  • ビジュアル分析レポート:視覚を伴った構造化レポートを生成し、それを直接Discordに送信します。


前提条件

  1. **Scrapelessに登録**し、APIキーを取得します。
  2. APIトークンを見つけ、後で使用するためにコピーします。
APIトークンを見つける

⚠️ 注意: APIトークンを安全に保管し、他の人と共有しないでください


  1. Pipedreamにログイン
  2. **「+ 新しいワークフロー」**をクリックして新しいワークフローを作成します。
+ 新しいワークフロー

Googleトレンド自動レポーティングシステムの作成方法(Pipedream + Scrapeless + Discord)

ワークフローストラクチャ

ステップ名 タイプ 機能
trigger スケジュール スケジュールに従ってワークフローをトリガーします(例:毎時)
http Node.jsコード スクラビングタスクをScrapelessに送信し、結果を取得します
code_step Node.jsコード スクレイピングデータを解析および処理します
discord_notify Node.jsコード 分析結果をWebhook経由でDiscordに送信します

ステップ1: スケジュールトリガー

トリガーの種類をスケジュールに設定し、このワークフローが毎週日曜日のUTC時間16:00に自動的に実行されるようにトリガー時間を設定します。

トリガーの種類を選択

ステップ2 - http (Scrapelessにキーワードトレンドをクローリングするリクエスト)

http (Scrapelessにキーワードトレンドをクローリングするリクエスト)
  1. Node.jsコードステップを追加します。以下はScrapeless API呼び出しロジックを統合したコード例です。
Copy
import { axios } from "@pipedream/platform"

export default defineComponent({
  async run({ steps, $ }) {
    const keywords = ["AI", "Machine Learning", "Data Science"];
    const allResults = {};
    
    for (const keyword of keywords) {
      console.log(`キーワードを処理中: ${keyword}`);
      
      const payload = {
        actor: "scraper.google.trends",
        input: {
          q: keyword,
          date: "today 1-m",
          data_type: "interest_over_time",
          hl: "en",
          tz: "420",
          geo: "",
          cat: "",
          property: "",
        },
        proxy: {
          country: "",
        }
      };

      try {
        const response = await axios($, {
          method: 'POST',
          url: 'https://api.scrapeless.com/api/v1/scraper/request',
          headers: {
            'Content-Type': 'application/json',
            'x-api-token': 'Scrapeless API KEY'
          },
          data: payload
        });
        
        console.log(`キーワード ${keyword} に対する応答:`, response);
        
        if (response.job_id) {
          console.log(`キーワード ${keyword} のタスクが作成されました,ID: ${response.job_id}`);
          
          let attempts = 0;
          const maxAttempts = 12;
          let jobResult = null;
          
          while (attempts < maxAttempts) {
            await new Promise(resolve => setTimeout(resolve, 10000));
            attempts++;
            
            try {
              const resultResponse = await axios($, {
                method: 'GET',
                url: `https://api.scrapeless.com/api/v1/scraper/result/${response.job_id}`,
                headers: {
                  'x-api-token': 'Scrapeless API KEY'
                }
              });
              
              console.log(`キーワード ${keyword} に対する試行 ${attempts}:`, resultResponse);
              
              if (resultResponse.status === 'completed') {
                jobResult = resultResponse.result;
```javascript
console.log(`ジョブが完了しました: ${keyword}:`, jobResult);
                break;
              } else if (resultResponse.status === 'failed') {
                console.error(`ジョブが失敗しました: ${keyword}:`, resultResponse);
                break;
              } else {
                console.log(`ジョブはまだ実行中です: ${keyword}、ステータス: ${resultResponse.status}`);
              }
            } catch (error) {
              console.error(`ジョブのステータス確認中にエラーが発生しました: ${keyword}:`, error);
            }
          }
          
          if (jobResult) {
            allResults[keyword] = jobResult;
          } else {
            allResults[keyword] = { 
              error: `ジョブがタイムアウトまたは ${attempts} 回の試行の後に失敗しました`,
              job_id: response.job_id 
            };
          }
          
        } else {
          allResults[keyword] = response;
        }
        
      } catch (error) {
        console.error(`エラーが発生しました: ${keyword}:`, error);
        allResults[keyword] = { 
          error: `リクエストが失敗しました: ${error.message}` 
        };
      }
    }
    
    console.log("最終結果:", JSON.stringify(allResults, null, 2));
    return allResults;
  },
})

キーワード,
平均: 0,
傾向: 0,
週次傾向: 0,
値: [],
最大: 0,
最小: 0,
データポイント: 0,
部分的: false,
エラー: "タイムラインデータが見つかりませんでした",
ステータス: 'エラー',
利用可能なキー: data ? Object.keys(data) : []
};
}
}

Copy
const サマリー = {
  タイムスタンプ,
  総キーワード数: Object.keys(processedData).length,
  成功したキーワード: Object.values(processedData).filter(d => d.status === 'success').length,
  期間: "今日 1-m",
  データ: processedData
};

console.log("最終処理データ:", JSON.stringify(サマリー, null, 2));
return サマリー;

},
})

Copy
---

Scrapelessから返されたデータに基づいて以下の指標を計算します:

* **平均値**
* **週次傾向の変化**(過去7日間 vs 前の7日間)
* **最大値 / 最小値**
* **ボラティリティ**

**注意:**

* 各キーワードは詳細な分析オブジェクトを生成し、可視化やさらなる通知が容易になります。

### ステップ 4 - discord_notify (分析報告をDiscordにプッシュ)

![ステップ 4 - discord_notify (分析報告をDiscordにプッシュ)](https://assets.scrapeless.com/prod/posts/build-google-trends-monitor-with-pipedream/f18726b4fe24fa4e2815d32624288b79.png)

1. 最後のNode.jsステップを追加します。以下はコードの例です。

import { axios } from "@pipedream/platform"

export default defineComponent({
async run({ steps, $ }) {
const processedData = steps.Code_step.$return_value;

Copy
const discordWebhookUrl = "https://discord.com/api/webhooks/1380448411299614821/MXzmQ14TOPK912lWhle_7qna2VQJBjWrdCkmHjdEloHKhYXw0fpBrp-0FS4MDpDB8tGh";

console.log("Discord用にデータを処理中:", JSON.stringify(processedData, null, 2));

const currentDate = new Date().toLocaleString('ja-JP');

const keywords = Object.values(processedData.data);
const 成功した = keywords.filter(k => k.status === 'success');

let ベストパフォーマー = null;
let ワーストパフォーマー = null;
let 最強の傾向 = null;

if (成功した.length > 0) {
  ベストパフォーマー = 成功した.reduce((max, curr) => curr.average > max.average ? curr : max);
  ワーストパフォーマー = 成功した.reduce((min, curr) => curr.average < min.average ? curr : min);
  最強の傾向 = 成功した.reduce((max, curr) => Math.abs(curr.weeklyTrend) > Math.abs(max.weeklyTrend) ? curr : max);
}

const discordMessage = {
  content: `📊 **Google トレンドレポート** - ${currentDate}`,
  embeds: [
    {
      title: "🔍 トレンド分析",
      color: 3447003,
      timestamp: new Date().toISOString(),
      fields: [
        {
          name: "📈 サマリー",
          value: `**期間:** 最後の1ヶ月\n**分析されたキーワード:** ${processedData.totalKeywords}\n**成功:** ${processedData.successfulKeywords}/${processedData.totalKeywords}`,
          inline: false
        }
      ]
    }
  ]
};

if (成功した.length > 0) {
  const keywordDetails = 成功した.map(data => {
    const trendIcon = data.weeklyTrend > 5 ? '🚀' : 
                     data.weeklyTrend > 0 ? '📈' : 
                     data.weeklyTrend < -5 ? '📉' : 
                     data.weeklyTrend < 0 ? '⬇️' : '➡️';

    const performanceIcon = data.average > 70 ? '🔥' : 
                           data.average > 40 ? '✅' : 
                           data.average > 20 ? '🟡' : '🔴';

    return {
      name: `${performanceIcon} ${data.keyword}`,
      value: `**スコア:** ${data.average}/100\n**トレンド:** ${trendIcon} ${data.weeklyTrend > 0 ? '+' : ''}${data.weeklyTrend}\n**範囲:** ${data.min}-${data.max}`,
      inline: true
    };
  });

  discordMessage.embeds[0].fields.push(...keywordDetails);
}

if (ベストパフォーマー && 成功した.length > 1) {
  discordMessage.embeds.push({
    title: "🏆 主要ハイライト",
    color: 15844367,
    fields: [
      {
        name: "🥇 トップパフォーマー",
        value: `**${ベストパフォーマー.keyword}** (${ベストパフォーマー.average}/100)`,
        inline: true
      },
      {
        name: "📊 最低スコア",
        value: `**${ワーストパフォーマー.keyword}** (${ワーストパフォーマー.average}/100)`,
        inline: true
      },
      {
        name: "⚡ 最強のトレンド",
        value: `**${最強の傾向.keyword}** (${最強の傾向.weeklyTrend > 0 ? '+' : ''}${最強の傾向.weeklyTrend})`,
        inline: true
      }
    ]
  });
}

const failed = keywords.filter(k => k.status === 'error');
if (failed.length > 0) {
  discordMessage.embeds.push({
    title: "❌ エラー",
    color: 15158332,
    fields: failed.map(data => ({
      name: data.keyword,
      value: data.error || "不明なエラー",
      inline: true
    }))
  });
ja Copy
console.log("送信するDiscordメッセージ:", JSON.stringify(discordMessage, null, 2));

try {
  const response = await axios($, {
    method: 'POST',
    url: discordWebhookUrl,
    headers: {
      'Content-Type': 'application/json'
    },
    data: discordMessage
  });
  
  console.log("Discordウェブフックからの応答:", response);
  
  return {
    webhook_sent: true,
    platform: "discord",
    message_sent: true,
    keywords_analyzed: processedData.totalKeywords,
    successful_keywords: processedData.successfulKeywords,
    timestamp: currentDate,
    discord_response: response
  };
  
} catch (error) {
  console.error("Discordウェブフックエラー:", error);
  
  const simpleMessage = {
    content: `📊 **Googleトレンドレポート - ${currentDate}**\n\n` +
            `📈 **結果 (${processedData.successfulKeywords}/${processedData.totalKeywords}):**\n` +
            successful.map(data => 
              `• **${data.keyword}**: ${data.average}/100 (${data.weeklyTrend > 0 ? '+' : ''}${data.weeklyTrend})`
            ).join('\n') +
            (failed.length > 0 ? `\n\n❌ **エラー:** ${failed.map(d => d.keyword).join(', ')}` : '')
  };
  
  try {
    const fallbackResponse = await axios($, {
      method: 'POST',
      url: discordWebhookUrl,
      headers: {
        'Content-Type': 'application/json'
      },
      data: simpleMessage
    });
    
    return {
      webhook_sent: true,
      platform: "discord",
      message_sent: true,
      fallback_used: true,
      discord_response: fallbackResponse
    };
    
  } catch (fallbackError) {
    console.error("Discordフォールバックエラー:", fallbackError);
    
    return {
      webhook_sent: false,
      platform: "discord",
      error: error.message,
      fallback_error: fallbackError.message,
      data_summary: {
        keywords: processedData.totalKeywords,
        successful: processedData.successfulKeywords,
        best_performer: bestPerformer?.keyword,
        best_score: bestPerformer?.average
      }
    };
  }
}

2. あなたのWebhookのアドレスをYOUR DISCORD WEBHOOK URLで置き換えてください
3. ワークフローを実行してリアルタイムの情報を取得するために「デプロイ」をクリックします。

### ステップ5 - リアルタイムのGoogleトレンド情報を受信する

Discordでキーワードを直接確認するためのデータを受信できます:

![ステップ5 - リアルタイムのGoogleトレンド情報を受信する](https://assets.scrapeless.com/prod/posts/build-google-trends-monitor-with-pipedream/7169818a2a9ab050b812d04b40d5c480.png)

**以下が完全なリンクダイアグラムです:**

![以下が完全なリンクダイアグラム](https://assets.scrapeless.com/prod/posts/build-google-trends-monitor-with-pipedream/f75d04384f0a80200a0509310fd14680.png)

> **✅ 現在稼働中:Scrapeless公式統合がPipedreamで利用可能**
>
> Scrapelessは現在、Pipedreamの統合ハブで公式に利用可能です!ほんの数クリックで、Pipedreamのワークフローから直接私たちの強力なGoogleトレンドAPIを呼び出すことができます—設定不要、サーバーも不要です。
>
> リアルタイムのダッシュボードを構築する場合や、マーケティングインテリジェンスを自動化する場合、カスタム分析を強化する場合でも、この統合はプロダクショングレードのトレンド監視への最速の道筋を提供します。
>
> 👉 即座に構築を開始:**pipedream.com/apps/scrapeless**
 ドラッグ&ドロップして、トレンド駆動の次のワークフローを今日展開しましょう。

迅速にアクション可能なインサイトが必要な開発者、アナリスト、成長チームに最適です。

## 要約
Pipedream、Scrapeless API、Discordの強力な組み合わせを通じて、手動の介入を必要としないGoogleトレンドレポートシステムを構築しました。これにより作業効率が大幅に向上し、マーケティングの意思決定がよりデータに基づいたものになります。

同様のデータ自動分析システムを構築する必要がある場合は、この技術の組み合わせを試してみてください!

---
Scrapelessは、適用される法律および規制を完全に遵守し、プラットフォームの利用規約に従ってのみ公共に利用可能なデータにアクセスします。このソリューションは、正当なビジネスインテリジェンスおよび研究の目的で設計されています。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ