Difyのワークフローでスクレイピングしてみる

DifyでとあるWebページをスクレイピングして、ナレッジに登録してみます。

ワークフローは次の手順で登録されるようにします。

- Web Scraperで記事を取得
- 取得した記事（テキスト）をナレッジに登録しやすい形に変換
- APIでナレッジに登録

# ワークフローにブロックを設置

以下のように開始、Web Scraper、コード、HTTPリクエスト、終了の順にブロックを並べます。

![スクリーンショット 2024-07-08 23.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/6a2bc6db-6b72-5719-23bc-4c06663fb932.png)

# Web Scraperで記事を取得

Web Scraperブロック一つにつき、1ページ分の記事しか取得することはできないようです。
特定のURLを載せてしまうと、そのサイトに迷惑をかけてしまう可能性があるので、スクリーンショットでは黒塗りにしてありますが、URLを入力してください。

「WHETHER TO GENERATE SUMMARY」は、スクレイピングしたWebページの内容を要約するかどうかを決定するための機能です。この機能を有効にすると、Difyは現在のワークスペースのデフォルトモデルを使用して、長いテキストを要約してくれます。

![スクリーンショット 2024-07-08 23.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/165a3d09-2893-8e59-e509-63fd4cdd1fa8.png)

# 取得した記事（テキスト）をナレッジに登録しやすい形に変換

本記事ではJavaScriptで変換処理を実装します。デフォルトではPythonとなっていると思うので、JavaScriptに変更しましょう。もちろんPythonで同様な処理を書くこともできます。

第一引数にWeb Scraperで取得した記事がセットされるようにします。

```javascript
function main({arg1}) {
    return {
        "result": arg1.split("\n").join()
    }
}
```

出力変数はデフォルトのまま、`result`のみ指定します。

![スクリーンショット 2024-07-08 23.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/d7f552b0-393f-b108-00ba-c799eeb2600f.png)

# APIでナレッジに登録

ナレッジの格納先を先に作っておきます。

## 空のナレッジを作成する

ナレッジの画面で、空のナレッジを作成します。

![スクリーンショット 2024-07-08 23.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/c4a2ebe2-0924-7a10-ce6c-62a319ebb8b0.png)

## dataset_idを取得

空のナレッジを開き、URLに含まれるdataset_idをコピーしておきます。スクリーンショットの「f59a1〜」となっている部分がdataset_idです。

![スクリーンショット 2024-07-08 23.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/5f98d11c-45c1-74bb-7435-f3171c5e299f.png)

## APIキーを発行

Difyのワークフローの左側メニューから`APIアクセス`を選択します。

![スクリーンショット 2024-07-08 23.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/c02ccea7-2a7e-bdf3-453f-e3772557fa70.png)

右上のAPIキーボタンからAPIを発行します。

![スクリーンショット 2024-07-08 23.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/3367ca9a-6df5-db53-f491-210e50a329c4.png)

「APIシークレットキー」という名称でAPIキーのモーダルが表示されるので、「新しいシークレットキーを作成」ボタンを押してAPIキーを作成してください。

![スクリーンショット 2024-07-08 23.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/980321ef-3c74-bf99-a8b3-9d4bdcce2e0d.png)

ワークフローの画面に戻り、HTTPリクエストにて、「認証なし」と書いてあるボタンを押します。

![スクリーンショット 2024-07-08 23.53.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/50f36d36-8204-c763-e9e8-9f7fa9206110.png)

認証タイプをAPIキー、Bearerにして、先に作成したAPIキーをペーストし、保存します。

![スクリーンショット 2024-07-08 23.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/a94cb4e8-3162-9c3c-d1b0-f990311c1403.png)

APIで[ナレッジを登録するAPI](https://docs.dify.ai/v/japanese/guides/knowledge-base/maintain-dataset-via-api)は、`datasets/{dataset_id}/document/create_by_text`なので、スクショのようにAPIを記入します。
この後実行しますが、実行時にホスト名が`localhost`や`127.0.0.1`ではリクエストに失敗することがあります。その場合はPCのIPアドレスに変更してみてください。

ヘッダーは`Content-Type: application/json`にします。
ボディは`raw text`を選択し、`{"name": "text","text": "</>コード/{x}result","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}`としましょう。

![スクリーンショット 2024-07-08 23.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/f0e89a4f-a2e4-2f4b-6e8b-3674a33fd01c.png)

# 実行

公開ボタンから公開し、開始のブロックを選択して、実行ボタンを押して実行してみましょう。

![スクリーンショット 2024-07-09 0.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/96f56f6a-bf53-8945-7919-4b197eced9ec.png)

空のナレッジにtext.txtというファイルができていれば成功です。

![スクリーンショット 2024-07-09 0.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/9bc4393c-2fe4-e109-c5e9-d555d3cb44c2.png)

もし、ファイルができていなかった場合は、実行結果のトレース等を開くなどして、どこに問題があるのか調べてみましょう。

![スクリーンショット 2024-07-09 0.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/96f97c68-0319-bc11-313f-a86cade235e1.png)

# 終わりに

とても簡単にワークフローでWebページをスクレイピングする実装ができました。Webのスクレイピング以外にも多くの機能を提供してくれているので、是非いろんな機能を試してください。