Nova Actでブログ記事の執筆者一覧を自動取得してみた

記事タイトルとURLをコピーする

ナマステ!アプリケーションサービス部の千葉です。

re:Invent 2025 の記事が続々と投稿されていますね。「どんな記事があるんだろう」「誰が書いているんだろう」と一覧を眺めていたら、ふと思いました。

「これ、自動で取得できないかな?」

というわけで、今回は Amazon が発表した Nova Act を使って、ブログ記事の執筆者とURLを自動で一覧取得してみました。

Nova Act とは

Nova Act は、Amazon が提供するブラウザ操作AIエージェントのSDKです。
自然言語で指示を出すと、Webブラウザ上で実際に操作を行ってくれます。

公式サイト: https://labs.amazon.science/blog/nova-act

特徴としては:

  • 自然言語でブラウザ操作を指示できる
  • Playwrightベースで動作
  • ドロップダウンや日付選択など、複雑なUI操作も高精度

プレビュー版として公開されていて、pip install nova-act で簡単にインストールできます。

環境構築

前提条件

  • Python 3.10以上
  • macOS / Ubuntu 22.04+ / Windows 10+
  • 米国リージョンからのアクセス(後述)

米国限定について

Nova Act は現在、プレビュー版として米国でのみ利用可能です。
日本から nova.amazon.com にアクセスすると、以下のメッセージが表示されます。

Thank you for your interest. At this time, Amazon Nova models cannot be accessed from this website in your location.

そのため、APIキーの取得には米国リージョンの環境が必要です。
今回は米国リージョンのEC2から取得しました。

インストール

pip install nova-act
playwright install chrome

既にChromeがインストールされている場合は、以下のようなメッセージが表示されます。

╔═════════════════════════════════════════════════════════════════╗
║ ATTENTION: "chrome" is already installed on the system!         ║
╚═════════════════════════════════════════════════════════════════╝

この場合は playwright install chrome をスキップしてOKです。
既存のChromeがそのまま使われます。

もし最新版のChromeに更新したい場合は --force オプションを使います。

playwright install --force chrome

APIキーの取得

nova.amazon.com にアクセスしてAPIキーを発行します。

  1. Amazonアカウントでサインイン
  2. 左側のナビゲーションペインで Labs セクションの Act を選択
  3. Generate ボタンをクリックしてAPIキーを生成

APIキーが表示されたら、環境変数に設定します。

export NOVA_ACT_API_KEY="your_api_key"

注意: プレビュー版のため、すぐにアクセスできない場合はウェイトリストに登録されます。
アクセスが許可されるとメールで通知が届きます。

実装してみた

今回の目標は、re:Invent 2025 のカテゴリページ から、各記事の執筆者とURLを取得すること です。

アプローチ

最初は nova.act() で「記事一覧を取得して」と指示してみたのですが、ガードレール(安全装置)に引っかかってエラーになってしまいました。

ActGuardrailsError(
    message = Validation failed: I cannot engage in such behavior
    reason = AGENT_GUARDRAILS_TRIGGERED
)

どうやら Nova Act は「データ抽出」よりも「ブラウザ操作」に特化しているようです。

そこで、nova.page(Playwright)を使って直接DOM操作する方法に切り替えました。

実装コード

from nova_act import NovaAct

BASE_URL = "https://blog.serverworks.co.jp"
TARGET_URL = f"{BASE_URL}/archive/category/AWS%20re%3AInvent%202025"

# Step 1: Nova Actのpage(Playwright)で記事URLを取得
print("=== Step 1: 記事URL一覧を取得 ===")
with NovaAct(starting_page=TARGET_URL) as nova:
    # Playwrightのpageオブジェクトを直接使用
    links = nova.page.query_selector_all("a.entry-title-link")
    urls = []
    for link in links:
        title = link.inner_text().strip()
        href = link.get_attribute("href")
        # 相対URLを絶対URLに変換
        if href.startswith("/"):
            url = BASE_URL + href
        elif not href.startswith("http"):
            url = BASE_URL + "/" + href
        else:
            url = href
        urls.append({"title": title, "url": url})
        print(f"- {title}")
        print(f"  {url}")

# Step 2: 各記事の執筆者を取得
print("\n=== Step 2: 執筆者を取得 ===")
results = []

for article in urls:
    url = article["url"]
    title = article["title"]

    print(f"\n処理中: {title[:50]}...")
    with NovaAct(starting_page=url) as nova:
        # Playwrightで直接執筆者名を取得
        author_elem = nova.page.query_selector("span.author.vcard span.fn")
        if author_elem:
            # data-user-name属性から取得を試みる
            author = author_elem.get_attribute("data-user-name")
            # 属性がなければテキストを取得
            if not author:
                author = author_elem.inner_text().strip()
        else:
            author = "不明"
        print(f"  執筆者: {author}")

        results.append({
            "title": title,
            "url": url,
            "author": author
        })

# 結果を表示
print("\n" + "=" * 50)
print("結果一覧")
print("=" * 50)
for r in results:
    print(f"\n{r['title']}")
    print(f"   URL: {r['url']}")
    print(f"   執筆者: {r['author']}")

ポイント解説

nova.page(Playwright)の活用

Nova Act の nova.page は Playwright の Page オブジェクトそのものです。
nova.page.query_selector_all()nova.page.query_selector() のようなPlaywrightの機能 を直接使えます。

# 複数要素を取得
links = nova.page.query_selector_all("a.entry-title-link")

# 単一要素を取得
author_elem = nova.page.query_selector("span.author.vcard span.fn")

要素からの値取得

取得した要素からは、テキストや属性を取得できます。

# テキストを取得
title = link.inner_text().strip()

# 属性を取得
href = link.get_attribute("href")
author = author_elem.get_attribute("data-user-name")

CSSセレクタでの要素指定

ページ構造を事前に確認し、適切なCSSセレクタを使うことで、確実に目的の要素を取得できます。
ブラウザの開発者ツールで要素を調べておくと良いでしょう。

注意点

プレビュー版

Nova Act は現在、プレビュー版です。
本番環境での利用は慎重に検討してください。

利用規約について

Nova Act の利用には nova.amazon.com Terms of Use が適用されます。
特に以下の点に 注意が必要です。

第三者サイトの利用規約を遵守する

"use Amazon Nova to violate the terms of third-party websites"

Nova Act を使って第三者のWebサイトにアクセスする場合、そのサイトの利用規約に違反してはいけません。
スクレイピング対象のサイトが自動アクセスを禁止していないか、事前に確認しましょう。

競合製品の開発への利用禁止

"use Amazon Nova to, directly or indirectly, develop or improve a similar or competing product or service"

Amazon/AWS と競合するサービスの開発に Nova Act を利用することは禁止されています。

レート制限

APIには利用制限があります。大量のリクエストを送る場合は、適切な待機時間を設けましょう。

スクレイピングのマナー

Webサイトの利用規約やrobots.txtを確認し、適切な範囲で利用しましょう。
自社ブログの分析など、許可された範囲での利用をおすすめします。

まとめ

残念ですが、今回のような「ページからデータを抽出する」用途においては、Playwrightをメインで利用する形になってしまいました。
(全然自然言語で操作してないの;;)

Nova Act は「データ抽出(スクレイピング)」よりも、「目的に沿ったブラウザ操作」を得意としているようです。例えば:

  • フォームへの入力と送信
  • ログイン処理
  • ボタンのクリックやナビゲーション
  • 日付選択やドロップダウンなど複雑なUI操作

「このボタンをクリックして」「この値を入力して」「次のページに進んで」といった操作の自動化こそが、Nova Act の真価を発揮する場面なのだと思います。

一方、今回のようにページからデータを取得したい場合は、nova.page(Playwright)を直接使う方が確実で高速です。
Nova Act の強みはPlaywrightとの統合なので、AIによる自然言語操作と、従来のプログラム的なDOM操作を場面に応じて使い分けられるのは便利ですね。

まだプレビュー版ですが、今後の発展が楽しみです。

千葉 哲也 (執筆記事の一覧)

アプリケーションサービス部

コーヒーゼリーが好きです。