🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

Puppeteerフォーム送信:信頼性の高いフォーム自動化のための実践ガイド

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

30-Jun-2026

TL;DR:

  • 信頼できるフォーム送信は3つの動作:入力、送信、待機です。 入力欄に打ち込み、送信をトリガーし、ナビゲーションをawaitします。クリックとwaitForNavigationを競い合い、ページが変更される前に読まないようにします。
  • 入力をコントロールに一致させます。 テキストにはpage.type()、希望するラジオ/チェックボックスにはpage.click()、ドロップダウンにはpage.select()を使用します — 間違ったコントロールタイプを送信することが最も一般的な静かな失敗です。
  • 送信と待機はPromise.allでなければなりません。 先にクリックし、その後ナビゲーションを待ちます。ナビゲーションが完了するのは、リスニングを開始する前でもかまいません。両方を一緒に待機することで、ログインや複数ステップのフォームが決定的になります。
  • フォームはボット対策が最も厳しい場所です。 ログインやチェックアウトページは攻撃的にフィンガープリンティングを行います。住宅用エグレスを伴うアンチ検知クラウドブラウザ上で実行することが、フォームが送信を受け入れる理由です。
  • Scrapeless Scraping Browserの上にプレーンなPuppeteerです。 Puppeteer.connect()は標準のBrowserを返すので、すでに知っているtype/click/waitForNavigationは変更なく機能します — ランタイムはセッションとアンチ検知を処理します。
  • 無料で始められます。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。

はじめに:実際に通過するフォーム自動化

Puppeteerでフォームを埋めるのは簡単に見えますが、送信が静かに失敗すると問題が発生します。入力が行われ、ボタンがクリックされ、その後スクリプトがまだナビゲートしていないページを読み取ってしまいます — それどころか、サイトはボットが操作していると判断し、リクエストを静かに拒否することもあります。信頼できるフォーム送信は、タイピングよりも、ほとんどのスクリプトが間違える2つのことに依存しています:HTTPナビゲーションリクエストとの同期と、フォームが受け入れられるように十分本物のブラウザのように見えることです。

最初の問題はPuppeteerのパターンです。2つ目は環境の問題であり、ローカルスクリプトが実際のサイトに対して信頼できないものに変わる原因です。ログインページ、チェックアウトフロー、検索フォームは、まさにサイトが< a href="https://owasp.org/www-project-automated-threats-to-web-applications/" rel="nofollow">ボット検出に集中する部分です。

このガイドでは、Puppeteerに標準のエンドポイントで接続するアンチ検知クラウドブラウザScrapeless Scraping Browserでフォーム自動化を実行します。あなたは通常のpage.type()page.click()の呼び出しを書きます。ランタイムは住宅用エグレスとフィンガープリンティングを提供するので、送信が成功します。以下のすべてのスニペットは、ライブフォームに対して実行されました。


できること

  • サイトにログインして、下流のスクレイピングのために認証されたセッションを維持します。
  • サーバーサイドで結果を構築する検索およびフィルターフォームを送信します。
  • 複数のフィールドフォームを駆動します — テキスト、ラジオ、チェックボックス、ドロップダウン — 一つのフローで。
  • 各送信が次のページに進むチェックアウトスタイルのステップを自動化します。
  • サーバーがエコーバックした応答を読み取って、実際に送信された内容を確認します。

なぜScrapeless Scraping Browserなのか

Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能なアンチ検知クラウドブラウザです。特にフォーム送信に関しては、以下の特徴があります:

  • 標準のPuppeteer接続Puppeteer.connect()は通常のBrowserを返すので、あなたのtype/click/waitForNavigationコードは変更されません。
  • 195カ国以上の住宅プロキシ — フォームのアンチ詐欺層が信頼するIPから送信します。
  • アンチ検知フィンガープリンティング — セッションは本物のブラウザとして認識されるため、ログインやチェックアウトフォームが送信を受け入れます。
  • セッションの持続性 — ログイン後にクッキーを温かく保ち、次のリクエストがすでに認証されるようにします。
  • 独自開発のChromium — 入力、ラジオ、セレクト用の完全で標準的なDOMおよびイベントの動作。

app.scrapeless.comで無料プランのAPIキーを取得してください。


前提条件

  • Node.js 18以降
  • ScrapelessアカウントおよびAPIキー — app.scrapeless.comでサインアップ
  • PuppeteerとCSSセレクタに関する基本的な理解

インストール

Scrapeless SDKがクラウドセッションを作成し、Puppeteerに接続します; puppeteer-coreはプロトコルクライアントです(ブラウザがリモートのため、バンドルされたChromiumは不要です):

bash Copy
npm install @scrapeless-ai/sdk puppeteer-core

環境からAPIキーを設定します:

bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"

設定:Puppeteerをクラウドブラウザに接続

javascript Copy
import { Puppeteer } from '@scrapeless-ai/sdk';

const browser = await Puppeteer.connect({
  apiKey: process.env.SCRAPELESS_API_KEY,
  sessionName: 'puppeteer-forms',
  proxyCountry: 'US',
  sessionTTL: 300,
});

const page = await browser.newPage();

page は、以降で使用する標準的なPuppeteerのページです。


基本的な実装: ログインフォーム

重要な詳細は Promise.all です。await page.click() を待機してから 次に await page.waitForNavigation() を実行すると、待機中にナビゲーションが既に完了している可能性があり、待機が無限に続くことになります。ナビゲーションリスナーとクリックを同時に開始しましょう:

javascript Copy
await page.goto('https://quotes.toscrape.com/login', { waitUntil: 'domcontentloaded' });

await page.type('#username', 'demo-user');
await page.type('#password', 'demo-pass');

await Promise.all([
  page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
  page.click('input[type="submit"]'),
]);

console.log(page.url(), '—', await page.title());
// https://quotes.toscrape.com/ — Quotes to Scrape

送信が解決された後、ログイン後のページにおり、セッションは認証クッキーを保持しています — この page に対する後のすべてのリクエストはすでにログイン済みです。

無料プランでAPIキーを取得する: app.scrapeless.com


複数フィールドのフォーム: テキスト、ラジオボタン、チェックボックス、ドロップダウン

実際のフォームはコントロールタイプを混合し、これらの HTMLフォームコントロール はそれぞれ独自のメソッドを持っています。ラジオボタンに入力しても何も起こりませんし、<select> をクリックしてもオプションは選択されません。コントロールを呼び出しにマップします:

コントロール Puppeteer呼び出し
テキスト / メール / 電話入力 page.type(selector, value)
ラジオボタン page.click(radioSelector)
チェックボックス page.click(checkboxSelector)
ドロップダウン (<select>) page.select(selector, value)
送信 page.click(submitSelector)waitForNavigation と競合)

以下は、httpbin.org/forms/post に対して検証された複数フィールドの送信の例で、送信されたフィールドをそのままエコーバックして、正確に何が送信されたかを確認できます:

javascript Copy
await page.goto('https://httpbin.org/forms/post', { waitUntil: 'domcontentloaded' });

await page.type('input[name="custname"]', 'アダ・ラブレス');
await page.type('input[name="custtel"]', '555-0100');
await page.click('input[value="medium"]');   // ピザサイズラジオ
await page.click('input[value="bacon"]');     // トッピングチェックボックス

await Promise.all([
  page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
  page.click('button'),                        // "注文を送信"
]);

const echoed = JSON.parse(await page.evaluate(() => document.body.innerText));
console.log(echoed.form);
// {
//   custname: 'アダ・ラブレス',
//   custtel: '555-0100',
//   size: 'medium',
//   topping: 'bacon',
//   ...
// }

エコーされた form オブジェクトは、あなたが送信したものに対するサーバーの見解です — フォームが実際に正しい値で送信されたことを確認するための唯一の最善の方法です。


高度なパターン

ナビゲーションではなく、結果要素を待機する。 多くのフォームはfetch/XHR経由で送信し、ナビゲートしないので、waitForNavigationpage.waitForSelector('.results')(または特定の成功ノード)に置き換え、実際の信号を待機しましょう。

入力の前にクリアする。 page.type() は追加します。事前にフィールドが入力されている場合は、最初にフォーカスしてクリアしましょう: await page.click(sel, { clickCount: 3 }); await page.keyboard.press('Backspace'); その後、入力します。

キーで送信する。 一部のフォームにはクリック可能なボタンがありません。最後のフィールドにフォーカスして、Promise.all の中でEnterキーを押します: page.keyboard.press('Enter') をクリックの代わりに使用します。

ステップ間でログインを維持する。 フロー全体で同じ page を保持します。Scrapelessのセッション持続性は、ナビゲーション間でクッキーを保持するため、ログインの後に制限付きフォームが機能します。

詐欺の感受性が高いフォームの抜け道を固定する。 接続時に proxyCountry を設定して、チェックアウトやアカウントフォームが予想される地域から一貫した住宅IPを見られるようにします。


トラブルシューティング

症状 原因 修正
waitForNavigation が永遠にハングする ウェイト開始前にクリックが待機されている 一つの Promise.all で競合させる
送信は成功したが値が間違っている コントロールに対する間違ったメソッド テキスト → type、ラジオ/チェックボックス → click、選択 → select
送信後にスクリプトが古いページを読み込む フォームがXHRを使用している、ナビゲーションではない ナビゲーションの代わりに結果セレクターで待機する
フィールドが古い値を保持する type が既存のテキストに増分する 入力する前にフィールドをクリアする
フォームが拒否されたり挑戦される サイトがセッションをボットとしてフラグ付けする 住宅のエグレスとフィンガープリンティングを備えたクラウドブラウザで実行する

結論: フォームは信頼できるステップとして

フォーム送信が毎回成功するためには、各コントロールを適切なPuppeteerの呼び出しにマッピングし、送信と待機を単一のPromise.allで競わせ、実際の送信後の信号(ナビゲーションまたは結果ノード)を待つことが重要です。Scrapeless Scraping Browserを使用することで、ログインやチェックアウトフォームが要求を受け入れるようにする部分は省かれ、あなたのコードには関係のない部分がなくなります。Pythonでの完全なクラウドブラウザーのスクレイピングワークフローについては、Scrapling + Scrapelessガイドや、Scraping Browser製品ページドキュメントを確認してください。認証フローのためにセッションを温かく保ち、返されたレスポンスを読み取って送信内容を確認してください。


AI駆動のデータパイプラインを構築する準備はできましたか?

無料プランを獲得し、フォームとログインの自動化を構築している開発者とつながるためにコミュニティに参加してください:Discord · Telegram

無料のScraping Browserランタイムにサインアップし、上記のパターンを必要なログイン、検索、チェックアウトフローに適応させるために、app.scrapeless.comにサインアップしてください。価格を確認してスケールを確認してください。


よくある質問

Q: waitForNavigationがフリーズする競合を避けるにはどうすればいいですか?
ナビゲーション待機とクリックを同じPromise.allで開始します。クリックを先に待機するとナビゲーションが完了し始めたときに待機がフリーズするのを防ぎます。

Q: ドロップダウンオプションを選択するにはどうすればいいですか?
オプションのvalue属性を使用してpage.select(selector, value)を使用します。clickではありません。ラジオボタンやチェックボックスの場合は、特定のコントロールに対してpage.click()を使います。

Q: フォームがXHRで送信され、ナビゲートしません。何を待機すればいいですか?
成功した送信後にのみ表示されるノード(結果コンテナや成功メッセージなど)については、waitForNavigationpage.waitForSelector()に置き換えます。

Q: フォームを送信するのにプロキシは必要ですか?
公開フォームの場合は、多くの場合不要です。ログイン、チェックアウト、その他の詐欺に敏感なフォームについては、proxyCountryをピン留めして、送信がサイトが信頼する住宅IPから来るようにします。

Q: ログインフォームを送信した後、どうやってログイン状態を維持しますか?
同じpageを使用し続けます。Scrapelessのセッション持続性は、ナビゲーションを跨いで認証クッキーを保持するため、後のリクエストはすでに認証済みです。

Q: AIエージェントなしでこれを実行できますか?
はい。これはScrapelessセッション上の通常のPuppeteerであり、エージェントは関与していません。SDKは接続を生成するだけです。

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

最も人気のある記事

カタログ