ログイン後のウェブサイトをPythonでスクレイピングする方法 (2026)
Expert Network Defense Engineer
数年間にわたりスクレイパーを構築した結果、ログインウォールは最も難しい課題の一つです。このガイドでは、シンプルなフォームログインからCSRF保護、現代のWAFやアンチボットシステムによって保護されたサイトまで、実際のプロジェクトで機能する実用的な方法に焦点を当てています。関連する例はPythonで示されており、最難関の保護を処理するためにリモートブラウザ(Scrapeless Browser)を使用する方法を最後に紹介します。
このガイドは教育目的のみを対象としています。サイトの利用規約やプライバシールール(たとえばGDPR)を尊重してください。アクセスが許可されていないコンテンツをスクレイプすることはしないでください。
このガイドで扱う内容
- シンプルなユーザー名とパスワードを必要とするサイトのスクレイピング。
- CSRFトークンを必要とするページへのログイン。
- 基本的なWAF保護の背後にあるコンテンツへのアクセス。
- Puppeteerを介して制御されるリモートブラウザ(Scrapeless Browser)を使用して高度なアンチボット保護を処理。
ログインが必要なサイトをスクレイプできますか?
はい—技術的にはログインの背後にあるページを取得できます。ただし、法的および倫理的な制限が適用されます。ソーシャルプラットフォームや個人データを含むサイトは特に敏感です。対象サイトのロボットポリシー、利用規約、および適用法を常に確認してください。
技術的には、主なステップは以下の通りです:
- ログインフローを理解する。
- 必要なリクエスト(およびトークン)をプログラム的に再現する。
- 認証された状態を維持する(クッキー、セッション)。
- 必要な場合、クライアントサイドのチェックを処理する。
1) シンプルなユーザー名 + パスワードログイン(Requests + BeautifulSoup)
結論: ログインが基本的なHTTPフォームの場合、セッションを使用して資格情報をPOSTします。
ライブラリをインストールします:
bash
pip3 install requests beautifulsoup4
例のスクリプト:
python
import requests
from bs4 import BeautifulSoup
login_url = "https://www.example.com/login"
payload = {
"email": "admin@example.com",
"password": "password",
}
with requests.Session() as session:
r = session.post(login_url, data=payload)
print("ステータスコード:", r.status_code)
soup = BeautifulSoup(r.text, "html.parser")
print("ページタイトル:", soup.title.string)
注意点:
Session()を使用して、クッキー(セッションID)が subsequent requestsのために持続します。- レスポンスコードと本文を確認して、成功したログインを確認します。
- サイトがリダイレクトを使用している場合、
requestsはデフォルトでそれに従います。必要に応じてr.historyを調査してください。
2) CSRF保護されたログイン(トークンを取得してからPOST)
結論: 多くのサイトはCSRFトークンを必要とします。まずログインページをGETし、トークンを解析してからトークンを使ってPOSTします。
パターン:
- ログインページをGETする。
- フォームから隠しトークンを解析する。
- 同じセッションを使用して資格情報 + トークンをPOSTする。
例:
python
import requests
from bs4 import BeautifulSoup
login_url = "https://www.example.com/login/csrf"
with requests.Session() as session:
r = session.get(login_url)
soup = BeautifulSoup(r.text, "html.parser")
csrf_token = soup.find("input", {"name": "_token"})["value"]
payload = {
"_token": csrf_token,
"email": "admin@example.com",
"password": "password",
}
r2 = session.post(login_url, data=payload)
soup2 = BeautifulSoup(r2.text, "html.parser")
products = []
for item in soup2.find_all(class_="product-item"):
products.append({
"Name": item.find(class_="product-name").text.strip(),
"Price": item.find(class_="product-price").text.strip(),
})
print(products)
ヒント:
- 一部のフレームワークは異なるトークン名を使用するため、正しい入力名を見つけるためにフォームを調査します。
- 普通のブラウザのように見えるように、適切なヘッダー(User-Agent、Referer)を送信します。
3) 基本的なWAF / ボットチェック — リクエストが失敗した場合はヘッドレスブラウザを使用
ヘッダーやトークンが不十分な場合は、Seleniumやヘッドレスブラウザで実際のブラウザをシミュレートします。
Selenium + Chromeは、JavaScriptを実行し、フルブラウザ環境を提供するため、多くの基本的な保護を通過できます。Seleniumを使用する場合は、現実的な待機時間、マウス/キーボードアクション、および普通のブラウザヘッダーを追加してください。
ただし、一部のWAFはnavigator.webdriverやその他のヒューリスティックを使用して自動化を検出します。undetected-chromedriverのようなツールは助けになりますが、高度なチェックに対して保証されるわけではありません。正当かつ許可された用途にのみ使用してください。
4) 高度なアンチボット保護 — リモートの実際のブラウザセッションを使用(Scrapeless Browser)
Scrapeless APIキーを取得する
Scrapelessにログインし、APIキーを取得します。

最も堅牢なアプローチとして、リモートで実際のブラウザを実行し(ローカルのヘッドレスインスタンスではない)、Puppeteerを介して制御します。Scrapeless Browserは、検出リスクを減らし、プロキシ/ JSレンダリングの複雑さを軽減する管理されたブラウザエンドポイントを提供します。
これが役立つ理由:
- ブラウザは実際のユーザーセッションを模倣する管理された環境で実行されます。
- JSは実際のユーザーブラウザと同じように実行されるため、クライアント側のチェックが通過します。
- セッションを記録し、必要に応じてプロキシルーティングを使用できます。
以下は、PuppeteerをScrapeless Browserに接続し、自動ログインを実行する方法の例です。このコードスニペットは、puppeteer-coreを使用してScrapelessのWebSocketエンドポイントに接続します。token、your_email@example.com、your_passwordを自身の値に置き換え、認証情報は絶対に公開しないでください。
重要: 公開コードに実際の認証情報やAPIトークンをコミットしないでください。秘密は安全に保管してください(環境変数や秘密管理ツールを使用)。
import puppeteer from "puppeteer-core"
// 💡「Playground Settingsを使用」を有効にすると、プレイグラウンドコードの接続パラメータが上書きされます。
const query = new URLSearchParams({
token: "your-scrapeless-api-key",
proxyCountry: "ANY",
sessionRecording: true,
sessionTTL: 900,
sessionName: "Automatic Login",
})
const connectionURL = `wss://browser.scrapeless.com/api/v2/browser?${query.toString()}`
const browser = await puppeteer.connect({
browserWSEndpoint: connectionURL,
defaultViewport: null,
})
const page = await browser.newPage()
await page.goto("https://github.com/login")
await page.locator("input[name='login']").fill("your_email@example.com")
await page.locator("input[name='password']").fill("your_password")
await page.keyboard.press("Enter")
サンプルに関する注意点:
- この例では、リモートブラウザに接続するために
puppeteer-coreを使用しています。ScrapelessはPuppeteerが使用できるWebSocketエンドポイント(browserWSEndpoint)を提供しています。 - セッション記録やプロキシオプションはクエリパラメータとして渡されます。Scrapelessのプランやニーズに応じて調整してください。
- 待機ロジックが重要です:ページが完全に読み込まれたことを確認するために、
waitUntil: "networkidle"や明示的なwaitForSelectorを使用してください。 - プレースホルダートークンを、安全な秘密と置き換えてください。
実用的なヒントとブロック回避チェックリスト
- サイトのAPIが存在する場合は、そちらを使用してください。より安全で安定しています。
- 短時間に大量の並列リクエストを避けて、スクレイパーのスロットルをかけてください。
- 正当かつ必要な場合にIPとセッションフィンガープリンツをローテーションしてください。信頼できるプロキシプロバイダーを使用しましょう。
- 現実的なヘッダーとクッキー処理を使用してください。
- robots.txtとサイトの利用規約を確認してください。サイトがスクレイピングを禁止している場合は、許可を求めるか、公式のデータフィードを使用することを検討してください。
- スクレイパーの実行手順をログに記録して、デバッグを容易にしてください(リクエスト、レスポンスコード、リダイレクト)。
まとめ
あなたは以下のことを学びました:
requestsを使用して、シンプルなユーザー名/パスワードを受け付けるページにログインしてスクレイピングすること。- CSRFトークンを抽出し、安全に認証するために使用すること。
- サイトが完全なJSレンダリングを必要とする場合に、ブラウザ自動化ツールを使用すること。
- Puppeteer経由でリモート管理ブラウザ(Scrapeless Browser)を使用して、高度なクライアントサイドの保護を回避しつつ、自分の環境をシンプルに保つこと。
保護が強力な場合、管理されたブラウザのアプローチが最も信頼できる方法であることが多いです。責任を持って使用し、認証情報やAPIトークンを安全に保管してください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



