LLaMA 3を使ったウェブスクレイピング: どのウェブサイトも構造化されたJSONに変換する方法(2025年ガイド)

Advanced Data Extraction Specialist
はじめに:AIを用いたウェブスクレイピングの進化
ウェブスクレイピングは、ウェブサイトからデータを自動的に抽出する手法であり、情報を収集し、市場を監視し、データセットを構築する企業や研究者にとって長い間基盤となってきました。しかし、ウェブスクレイピングの環境は常に進化しており、主にウェブサイトが導入するますます高度なボット対策によって変化しています。XPathやCSSのような静的セレクターに依存する従来のスクレイピング手法は、非常に脆弱です。ウェブサイトのレイアウトにわずかな変更が加わったり、ボット対策が更新されると、全体のスクレイピングインフラが無効になることがあり、これがメンテナンスの負担やデータの損失につながることがあります。
MetaのLLaMA 3のような大規模言語モデル(LLM)の登場は、このパラダイムにおける重要な転換を示しています。自然言語を理解し処理する驚異的な能力を持つLLaMA 3は、データ抽出に対するより堅牢でインテリジェントなアプローチを提供します。従来のスクレーパーは厳格なルールに従って動作するのに対し、LLaMA 3はウェブコンテンツの文脈的意味を解釈することができ、人間のように処理することができます。この能力により、ウェブサイトの構造の変化に適応し、レイアウトが変わっても関連情報を抽出することが可能となり、現代のウェブスクレイピングの課題にとって非常に貴重なツールとなっています。
この包括的な2025年のガイドでは、LLaMA 3を活用した高度なウェブスクレイピングを深く掘り下げ、生のHTMLをクリーンで構造化されたJSONに変換する方法を探ります。基本原則、実際の実装手順、そして最も手強いボット対策の課題を克服する方法、先端的なソリューションであるScrapeless Scraping Browserの統合によって実現する方法を詳しく説明します。このガイドを終える頃には、効率的で現代のウェブ防御に対して堅牢なAI駆動のウェブスクレイパーを構築する知識を持つことになるでしょう。
LLaMA 3がウェブスクレイピングにとってのゲームチェンジャーである理由
2024年4月にリリースされたLLaMA 3は、Metaの強力なオープンウェイトの大規模言語モデルで、8Bから405Bのパラメータまでさまざまなサイズで利用可能です。その後のバージョン(LLaMA 3.1、3.2、3.3)は、パフォーマンス、文脈理解、推論能力の大幅な改善をもたらしました。これらの進展により、LLaMA 3はウェブスクレイピングに非常に適している理由がいくつかあります。
1. 文脈理解とセマンティック抽出
従来のウェブスクレイパーは、ウェブページの正確な構造要素に依存しているため脆弱です。div
のクラス名が変更されたり、要素の位置が移動したりすると、スクレーパーは機能しなくなります。しかし、LLaMA 3はより高次の抽象レベルで動作します。書かれている内容の意味を理解することができ、根底にあるHTML構造に関係なく、例えば製品タイトル、価格、説明をセマンティックな手がかりに基づいて特定することができます。HTMLタグが異なるページ間やウェブサイトのデザイン変更後でも、これを実行できます。この文脈的理解は、スクレイパーの脆弱性を大幅に減少させ、常時メンテナンスの必要性を削減します。
2. ウェブサイトの変更への耐久性の向上
ウェブサイトはダイナミックな存在であり、デザイン、コンテンツ、および基盤となるコードの頻繁な更新が行われています。従来のスクレイパーにとって、各更新は破壊的な変更となることがあります。しかし、LLaMA 3が文脈的にコンテンツを解釈する能力は、これらの変更に対して遥かに耐久性があります。要素が再配置され、新しいセクションが追加されたり、わずかなスタイル調整が行われても、データを正確に抽出し続けることができます。この耐久性は、運用コストの削減と一貫したデータフローに直結します。
3. 動的コンテンツやJavaScriptでレンダリングされたページの処理
現代のウェブサイトは、コンテンツを動的にレンダリングするためにJavaScriptに大きく依存しています。これは、シンプルなHTTPリクエストベースのスクレイパーにとって重要な課題です。SeleniumのようなヘッドレスブラウザはJavaScriptを実行できますが、レンダリングされたDOMから特定のデータを抽出するためには正確なセレクターが必要です。LLaMA 3は、ヘッドレスブラウザと組み合わせることで、完全にレンダリングされたHTMLコンテンツを処理し、動的コンテンツレンダリングや複雑なJavaScriptインタラクションの複雑さを回避しながら目的の情報をインテリジェントに抽出できます。
4. Markdown変換による効率化
生のHTMLは非常に冗長であり、大量の無関係な情報(例:スクリプト、スタイリング、隠された要素)を含む可能性があります。このような大規模な入力をLLMで処理することは計算コストが高くなり、トークンの使用量が増え、コストや処理時間が増加する可能性があります。重要な最適化技術は、HTMLをよりクリーンで簡潔な形式(例えばMarkdown)に変換することです。Markdownは、必要なコンテンツと構造を保持しながらトークン数を大幅に減少させるため、LLMの処理をより効率的で迅速、かつコスト効果の高いものにします。この入力サイズの削減は、クリーンでノイズの少ない入力を提供することにより、LLMの精度も向上させます。
5. 環境内データ処理とセキュリティ
ローカルLLM(LLaMA 3をOllama経由で使用する)の重要な利点の一つは、データ処理が自分の環境内で行われることです。これは、機密情報を扱う際に特に重要であり、外部APIやクラウドサービスにデータを送信して処理することで発生する可能性のあるデータ露出のリスクを最小限に抑えます。スクレイプしたデータとLLMを自分のインフラ内に保つことで、より大きな制御が可能になり、データのセキュリティとプライバシーが向上します。
LLaMA 3によるスクレイピングの前提条件
LLaMA 3でのウェブスクレイピングを始める前に、以下のコンポーネントと基本知識を揃えておいてください。
- Python 3: このガイドの主要なプログラミング言語です。基本的なPythonの知識で十分ですが、ウェブスクレイピングの概念に慣れていると有益です。
- 互換性のあるオペレーティングシステム: Ollama経由でのLLaMA 3は、macOS(macOS 11 Big Sur以降)、Linux、Windows(Windows 10以降)をサポートしています。
- 十分なハードウェアリソース: リソースの要件は選択したLLaMA 3モデルのサイズに依存します。小さいモデル(例:
llama3.1:8b
)は軽量で、ほとんどの現代のラップトップで動作できます(約4.9GBのディスクスペースと6〜8GBのRAMが必要)。より大きなモデル(例:70Bや405B)は、はるかに多くのメモリと計算能力を要求し、より堅牢なマシンや専用サーバー向けです。
Ollamaを使用したLLaMA 3環境の設定
Ollamaは、大規模言語モデルをローカルでダウンロード、セットアップ、実行するプロセスを簡素化するための必須ツールです。LLMの展開に伴う多くの複雑さを抽象化し、データ抽出に集中できるようにします。
1. Ollamaのインストール
Ollamaを始めるには:
- 公式Ollamaウェブサイトを訪問します。
- 自分のオペレーティングシステムに合わせたアプリケーションをダウンロードしてインストールします。
- 重要なステップ: インストールプロセス中に、Ollamaがターミナルコマンドを実行するよう促す場合があります。このコマンドはまだ実行しないでください。 まず、自分のハードウェア能力と特定の使用ケースに合った適切なLLaMAモデルのバージョンを選定します。
2. LLaMAモデルの選択
適切なLLaMAモデルを選ぶことは、性能と効率のバランスを取るために重要です。Ollamaのモデルライブラリを参照して、自分のシステムの仕様やプロジェクトのニーズに最適なバージョンを特定してください。
大多数のユーザーにとって、llama3.1:8b
は最適なバランスを提供します。軽量で非常に能力が高く、約4.9GBのディスクスペースと6〜8GBのRAMを必要とし、ほとんどの現代のラップトップで実行できます。もしマシンがより強力な処理能力を持ち、強化された推論能力やより大きなコンテキストウィンドウが必要な場合は、70B
や405B
のようなより大きなモデルにスケールアップすることを検討してください。これらの大きなモデルは、はるかに大きなメモリと計算リソースを必要とすることに注意してください。
3. モデルの引き出しと実行
モデルを選択したら、ダウンロードして初期化できます。たとえば、llama3.1:8b
モデルをダウンロードして実行するには、ターミナルで以下のコマンドを実行します:
bash
ollama run llama3.1:8b
Ollamaがモデルをダウンロードします。ダウンロードが成功すると、シンプルなインタラクティブプロンプトが表示されます:
>>> メッセージを送信してください(/?でヘルプ)
モデルが正しくインストールされ、応答していることを確認するために、簡単なクエリを送信できます:
>>> あなたは誰ですか?
私はLLaMAです、*Meta AIによって開発されたAIアシスタントです...*
上記のような応答があれば、LLaMAモデルが正しくセットアップされていることを確認できます。インタラクティブプロンプトを終了するには、/bye
と入力します。
4. Ollamaサーバーの起動
ウェブスクレイピングスクリプトがLLaMA 3とインタラクションするためには、Ollamaサーバーがバックグラウンドで実行されている必要があります。新しいターミナルウィンドウを開き、次のコマンドを実行します:
bash
ollama serve
このコマンドはローカルOllamaインスタンスを開始し、通常はhttp://127.0.0.1:11434/
でアクセス可能です。このターミナルウィンドウを開いたままにしておくことが重要です。サーバーはスクレイピング操作のためにアクティブでなければなりません。ウェブブラウザでこのURLに移動し、サーバーの状態を確認できます。メッセージ「Ollama is running」が表示されるはずです。
LLM駆動のウェブスクレイパーの構築:マルチステージワークフロー
堅牢なウェブスクレイパーを構築すること、特に動的コンテンツと厳格な対ボット保護を持つ複雑なウェブサイトの場合は、洗練されたアプローチが求められます。私たちのLLaMA駆動のスクレイパーは、伝統的な方法の限界を克服し、データ抽出の効率を最大化するよう設計されたスマートなマルチステージワークフローを採用しています。このワークフローは、通常は高度な防御が展開されるeコマースサイトなどの困難なターゲットに特に効果的です。
AI駆動のマルチステージワークフローの内訳は以下の通りです:
- ブラウザ自動化: ヘッドレスブラウザ(例:Selenium)を利用して、ターゲットウェブページをロードし、すべての動的コンテンツをレンダリングし(JavaScript、AJAXコール)、人間らしいインタラクションをシミュレートします。
- HTML抽出: ページが完全にレンダリングされたら、必要な製品詳細や関連情報を持つ特定のHTMLコンテナを特定して抽出します。このステップでは、ページの最も関連性の高いセクションを孤立させることに焦点を当てています。
- Markdown変換: 抽出したHTMLをクリーンで簡潔なMarkdownフォーマットに変換します。この重要な最適化はトークン数を大幅に削減し、LLMにとって入力をより効率的にし、処理速度と精度を改善します。
- LLM処理: 精巧に構築された構造化されたプロンプトをLLaMA 3で使用して、Markdownコンテンツからクリーンで構造化されたJSONデータを抽出します。ここではLLMの文脈理解が重要です。
- 出力処理: 抽出したJSONデータを持続可能なフォーマット(例:JSONファイルやデータベース)に保存し、次回の利用、分析、または他のシステムへの統合のために使用します。
このモジュラーアプローチは、各ステージが特定のタスクに最適化されることを保証し、高度に効果的で弾力性のあるスクレイピングソリューションに寄与します。これらの例では主にPythonを使用していますが、そのシンプルさとデータサイエンスにおける広範な普及のために、JavaScriptなどの他のプログラミング言語でも同様の結果を得ることができます。
ステップ 1 – 必要なライブラリをインストール
必要なPythonライブラリをインストールすることから始めます。ターミナルまたはコマンドプロンプトを開き、次のコマンドを実行します。
bash
pip install requests selenium webdriver-manager markdownify
各ライブラリの役割を簡単に理解しましょう:
requests
: HTTPリクエストを行うための基本的なPythonライブラリ。LLM処理のためにローカルのOllamaインスタンスにAPI呼び出しを送信するために使用されます。selenium
: ウェブブラウザを自動化するための強力なツール。JavaScriptが豊富なウェブサイトと対話し、動的コンテンツをレンダリングし、ユーザーの挙動をシミュレートするために不可欠です。webdriver-manager
: 正確なChromeDriver(または他のブラウザドライバ)のバージョンを自動的にダウンロードおよび管理し、手動設定を排除することでSeleniumのセットアップを簡素化します。markdownify
: HTMLコンテンツをMarkdownに変換するためのユーティリティで、LLM入力の最適化において重要なステップです。
ステップ 2 – ヘッドレスブラウザの初期化
Seleniumを使用してヘッドレスブラウザを設定することが最初のプログラム的ステップです。ヘッドレスブラウザはグラフィカルユーザーインターフェースなしで動作し、自動化されたタスクに対して効率的です。次のPythonコードは、ヘッドレスモードでChromeブラウザを初期化します。
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox") # 一部の環境に必要
options.add_argument("--disable-dev-shm-usage") # 限られたリソースの問題を克服
options.add_argument("--disable-gpu") # Windows OSのみに適用
options.add_argument("--window-size=1920,1080") # 一貫したウィンドウサイズを設定
options.add_argument("--ignore-certificate-errors") # 証明書エラーを無視
options.add_argument("--disable-extensions") # 拡張機能を無効化
options.add_argument("--disable-infobars") # インフォバーを無効化
options.add_argument("--disable-browser-side-navigation") # ブラウザサイドナビゲーションを無効化
options.add_argument("--disable-features=VizDisplayCompositor") # VizDisplayCompositorを無効化
options.add_argument("--blink-settings=imagesEnabled=false") # より速い読み込みのために画像を無効化
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
これらのoptions.add_argument
行は、最適なスクレイピングパフォーマンスのためにヘッドレスブラウザを構成し、検出リスクを最小化するために重要です。リソースを消費したり、自動化を明らかにしたりする可能性のある不要なさまざまな機能を無効にします。
ステップ 3 – 製品HTMLの抽出
ヘッドレスブラウザが初期化されたら、次のステップはターゲットURLに移動し、関連するHTMLコンテンツを抽出することです。Amazonのような複雑なサイトでは、製品の詳細が動的にレンダリングされ、特定のHTML要素内に含まれることがよくあります。SeleniumのWebDriverWait
を使用してターゲット要素が完全に読み込まれるのを確認してから、その内容を抽出します。
python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 15)
product_container = wait.until(
EC.presence_of_element_located((By.ID, "ppd"))
)
# 製品コンテナの完全なHTMLを抽出
page_html = product_container.get_attribute("outerHTML")
このアプローチには二つの重要な利点があります:
- 動的コンテンツ処理: JavaScriptでレンダリングされたコンテンツ(価格、評価、在庫など)がページに表示されるのを明示的に待つため、最新の情報を完全にキャプチャできます。
- ターゲット抽出: 特定のコンテナ(例:Amazon商品ページ用の
<div id="ppd">
)に焦点を当てることで、HTMLの関連セクションのみを抽出し、ヘッダー、フッター、サイドバー、広告などの余分な要素を効果的に無視します。これにより、LLMによって処理されるデータ量が減り、効率性と正確性が向上します。
ステップ4 – HTMLをMarkdownに変換
前述のように、抽出したHTMLをMarkdownに変換することは重要な最適化ステップです。生のHTMLは、特に深くネストされた複雑なウェブページからのものは、冗長性と高いトークン数のためにLLMにとって非常に非効率です。Markdownははるかにクリーンでフラットなテキスト形式であり、必須の内容と構造を保持しながらトークン数を大幅に削減します。
影響を示すために、典型的なAmazon商品ページのHTMLは約270,000トークンを含むかもしれません。対照的に、同等のMarkdownバージョンは約11,000トークンという非常に簡潔なものになる可能性があります。この驚異的な96%の削減は、次のような多くの利益をもたらします:
- コスト効率: トークンが少ないほど、特に有料のLLMサービスを使用する場合やリソースが制約されたハードウェアでモデルを実行する場合、APIまたは計算コストが直接的に低くなります。
- 処理の迅速化: 入力サイズが小さいほど、LLMはデータをより迅速に処理でき、スクレイピング操作に対する応答時間が短くなります。
- 正確性の向上: よりクリーンでノイズの少ない入力は、LLMが関連情報に集中できるようにし、より正確で精密なデータ抽出につながります。モデルは無関係なHTMLタグや属性に気を取られる可能性が低くなります。
以下は、markdownify
ライブラリを使用してPythonでHTMLをMarkdownに変換する方法です:
python
from markdownify import markdownify as md
clean_text = md(page_html, heading_style="ATX")
heading_style="ATX"
引数は、Markdownの見出しがATXスタイル(例:# 見出し 1
)を使用して生成されることを保証し、これは一般的にLLMに理解されています。
ステップ5 – データ抽出プロンプトの作成
LLMに提供するプロンプトは、一貫性があり正確に構造化されたJSON出力を取得するために非常に重要です。よく設計されたプロンプトは、LLMがその役割、タスク、出力に必要な正確な形式を理解するのを助けます。以下のプロンプトは、LLaMA 3に専門のAmazon商品データ抽出者として機能し、のみ有効なJSONを事前定義されたスキーマで返すことを指示します:
python
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"あなたは専門のAmazon商品データ抽出者です。あなたの "
"タスクは、提供された内容から商品データを抽出することです。"
"\n\n次のフィールドと形式でONLY有効なJSONを返してください:\n\n"\
"{\n"
" 'title': "string" - 商品タイトル,\n"
" 'price': number - 現在の価格(数値のみ)、\n"
" 'original_price': number or null - 可能であれば元の "
"価格,\n"
" 'discount': number or null - 可能であれば割引率,\n"
" 'rating': number or null - 平均評価(0-5 "
"スケール)、\n"
" 'review_count': number or null - 総レビュー数,\n"
" 'description': "string" - 主な商品 "
"説明,\n"
" 'features': ["string"] - 箇条書きの特徴のリスト,\n"
" 'availability': "string" - 在庫状況,\n"
" 'asin': "string" - 10桁のAmazon ID"\n"
"}\n\n追加のテキストなしでONLY JSONを返してください。"
)
このプロンプトは非常に具体的で、曖昧さの余地がほとんどありません。以下を定義しています:
- 役割: "専門のAmazon商品データ抽出者。"
- タスク: "提供された内容から商品データを抽出する。"
- 出力形式: "ONLY有効なJSONを返す" と明記し、各フィールドの正確な構造とデータ型を提供しています(例:
title
は文字列、price
は数値、features
は文字列のリスト)。 - 制約: "追加のテキストなしでONLY JSONを返す。" これは、LLMが会話的なフィラーや説明を生成するのを防ぎ、直接パース可能なクリーンなJSON出力を確保するのに重要です。
ステップ6 – LLM APIの呼び出し
ローカルでOllamaサーバーが実行されている状態で、準備したMarkdownテキストと抽出プロンプトをHTTP APIを介してLLaMA 3インスタンスに送信できます。Pythonのrequests
ライブラリはこの目的に最適です。
python
import requests
import json
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "llama3.1:8b",
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{clean_text}",
"stream": False,
"format": "json",
"options": {
"temperature": 0.1,
"num_ctx": 12000,
},
"timeout":250,
}
)
raw_output = response.json()["response"].strip()
product_data = json.loads(raw_output)
API呼び出しのキーとなるパラメータを分解しましょう:
model
: 使用するLLaMAモデルのバージョンを指定します(例:llama3.1:8b
)。prompt
: これは結合されたプロンプトで、PRODUCT_DATA_EXTRACTION_PROMPT
とLLMが処理する必要のあるclean_text
(Markdownコンテンツ)を連結したものです。stream
: 処理後にフルレスポンスを受け取るためにFalse
に設定します。これはデータ抽出のバッチ処理に適しています。format
: 重要なことに、"json"
に設定します。これはOllamaにJSONオブジェクトとして出力をフォーマットするよう指示し、我々の望む構造化されたデータ出力に合わせます。options
:temperature
:0.1
に設定します。低い温度(0に近い)はLLMの出力をより決定論的で創造性が低くし、一貫性が重要な構造化データ抽出には理想的です。num_ctx
: トークンの最大コンテキスト長を定義します。元の記事では、ほとんどのAmazon商品ページには12,000トークンで十分だと提案されています。この値はMarkdownコンテンツの期待される長さに基づいて適切に設定することが重要です。この値を増やすと長い入力を処理できますが、RAM使用量が増加し、処理が遅くなります。商品ページが特に長い場合や、それを支える計算リソースがある場合のみコンテキスト制限を増やしてください。
timeout
: LLMの応答を待つ最大時間(秒)を設定します。
応答を受け取った後、response.json()["response"].strip()
がLLMの出力から生のJSON文字列を抽出し、json.loads(raw_output)
がこの文字列をPython辞書にパースし、抽出されたデータに簡単にアクセスできるようにします。
ステップ7 – 結果を保存する
データ抽出プロセスの最終ステップは、構造化された商品データを永続的なファイルに保存することです。JSONフォーマットは、人間が読みやすく、他のアプリケーションでも簡単にパースできるため、非常に適しています。
python
with open("product_data.json", "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=4, ensure_ascii=False)
このコードスニペットは、UTF-8エンコーディングでさまざまな文字を処理するために書き込みモード("w"
)でproduct_data.json
という名前のファイルを開きます。次に、json.dump()
がこのファイルにproduct_data
辞書を書き込みます。indent=4
引数は、JSON出力が4スペースのインデントで適切にフォーマットされ、より読みやすくなります。また、ensure_ascii=False
は、特殊記号や国際的な文字などの非ASCII文字がエスケープされずに直接書き込まれることを保証します。
ステップ8: スクリプトを実行する
LLaMAを用いたウェブスクレイパーを完全に実行するには、通常、ターゲットURLを定義し、スクレイピング関数を呼び出すメインの実行ブロックがあります。以下は簡略化された例です:
python
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO>"
# 商品データをスクレイピングして抽出する関数を呼び出す
scrape_amazon_product(url)
実際のシナリオでは、HTMLの取得からJSONへの保存までのステップを関数(例:scrape_amazon_product
)の中にカプセル化し、この関数を目的の製品URLで呼び出すことになります。
ステップ9 – 完全なコードの例
完全でエンドツーエンドの実装として、以下は議論されたすべてのステップを組み合わせた完全なPythonスクリプトです:
python
import json
import logging
import time
from typing import Final, Optional, Dict, Any
import requests
from markdownify import markdownify as html_to_md
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
# ロギングの設定
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler()]
)
def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
"""構成されたChrome WebDriverインスタンスを初期化して返します。"""
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox") # 一部の環境で必要
options.add_argument("--disable-dev-shm-usage") # 限られたリソースの問題を克服
options.add_argument("--disable-gpu") # Windows OS専用
options.add_argument("--window-size=1920,1080") # 一貫したウィンドウサイズを設定
options.add_argument("--ignore-certificate-errors") # 証明書エラーを無視
options.add_argument("--disable-extensions") # 拡張機能を無効にする
options.add_argument("--disable-infobars") # インフォバーを無効にする
options.add_argument("--disable-browser-side-navigation") # ブラウザのサイドナビゲーションを無効にする
options.add_argument("--disable-features=VizDisplayCompositor") # VizDisplayCompositorを無効にする
Here's the translation of your provided text into Japanese:
python
options.add_argument("--blink-settings=imagesEnabled=false") # 画像を無効にして読み込みを速くする
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)
def fetch_product_container_html(product_url: str) -> Optional[str]:
"""Amazon商品の詳細コンテナのHTMLコンテンツを取得する。"""
driver = initialize_web_driver()
try:
logging.info(f"商品ページにアクセス中: {product_url}")
driver.set_page_load_timeout(15)
driver.get(product_url)
# 商品コンテナが表示されるのを待つ
wait = WebDriverWait(driver, 5)
product_container = wait.until(
EC.presence_of_element_located((By.ID, "ppd"))
)
return product_container.get_attribute("outerHTML")
except Exception as e:
logging.error(f"商品詳細の取得中にエラーが発生しました: {str(e)}")
return None
finally:
driver.quit()
def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
"""LLM APIを使用してマークダウンテキストから構造化された商品データを抽出する。"""
try:
response = requests.post(
LLM_API_CONFIG["endpoint"],
json={
"model": LLM_API_CONFIG["model"],
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{markdown_content}",
"stream": LLM_API_CONFIG["stream"],
"format": LLM_API_CONFIG["format"],
"options": LLM_API_CONFIG["options"],
"timeout": LLM_API_CONFIG["timeout_seconds"],
}
)
response.raise_for_status() # 不正なレスポンス(4xxまたは5xx)のためにHTTPErrorを発生させる
raw_output = response.json()["response"].strip()
return json.loads(raw_output)
except requests.exceptions.RequestException as e:
logging.error(f"LLM APIリクエストが失敗しました: {e}")
return None
except json.JSONDecodeError as e:
logging.error(f"LLMのレスポンスからJSONのデコードに失敗しました: {e}")
return None
def scrape_amazon_product(url: str) -> None:
"""Amazon商品ページのスクレイピングとデータ抽出プロセスを調整する。"""
logging.info(f"スクレイピングプロセスを開始中: {url}")
# ステップ1: HTMLコンテンツを取得
html_content = fetch_product_container_html(url)
if not html_content:
logging.error("HTMLコンテンツの取得に失敗しました。終了します。")
return
# ステップ2: HTMLをマークダウンに変換
markdown_content = html_to_md(html_content, heading_style="ATX")
logging.info("HTMLをマークダウンに変換しました。")
# ステップ3: LLMを使用してデータを抽出
product_data = extract_product_data_via_llm(markdown_content)
if not product_data:
logging.error("LLMを使用して商品データの抽出に失敗しました。終了します。")
return
# ステップ4: 結果を保存
output_filename = "product_data.json"
try:
with open(output_filename, "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=4, ensure_ascii=False)
logging.info(f"商品データが成功裏に{output_filename}に保存されました。")
except IOError as e:
logging.error(f"商品データをファイルに保存できませんでした: {e}")
# 設定定数
LLM_API_CONFIG: Final[Dict[str, Any]] = {
"endpoint": "http://localhost:11434/api/generate",
"model": "llama3.1:8b",
"temperature": 0.1,
"num_ctx": 12000,
"stream": False,
"format": "json",
"timeout_seconds": 220,
}
DEFAULT_PRODUCT_DATA: Final[Dict[str, Any]] = {
"title": "",
"price": 0.0,
"original_price": None,
"discount": None,
"rating": None,
"review_count": None,
"description": "",
"features": [],
"availability": "",
"asin": "",
}
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"あなたは専門のAmazon商品データ抽出者です。"
"あなたのタスクは提供されたコンテンツから商品データを抽出することです。"
"\n\n次のフィールドと形式のみを持つ有効なJSONを返してください:\n\n"\
"{\n"
" 'title': 'string' - 商品名,\n"
" 'price': number - 現在の価格(数値のみ), \n"
" 'original_price': number or null - 元の価格があれば,\n"
" 'discount': number or null - 割引率があれば,\n"
" 'rating': number or null - 平均評価(0-5スケール),\n"
" 'review_count': number or null - 総レビュー数,\n"
" 'description': 'string' - 主な商品説明,\n"
" 'features': ['string'] - 箇条書きの特徴のリスト,\n"
" 'availability': 'string' - 在庫状況,\n"
" 'asin': 'string' - 10文字のAmazon ID\n"
"}\n\n追加のテキストなしでJSONのみを返してください。"
)
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO>"
scrape_amazon_product(url)
If you need further modifications or additional translations, feel free to ask!
ウェブスクレイピング、特に大規模なものは、洗練されたアンチボットシステムとの常なる戦いです。ウェブサイトは、データやインフラを保護するために、自動リクエストを検出しブロックするためのさまざまな手法を採用しています。これらの対策には以下が含まれます:
- IPブロッキング: 疑わしい行動を示すIPアドレスを特定し、ブラックリストに登録します(例:短期間に単一のIPから多数のリクエスト)。
- CAPTCHA: 人間にとっては簡単に解けるが、自動ボットには難しい課題(例:reCAPTCHA、hCaptcha)を提示します。
- ユーザーエージェント分析: 自動クライアントを示す可能性がある非ブラウザまたは古いユーザーエージェントを検出します。
- ブラウザフィンガープリンティング: ブラウザのユニークな特性(例:インストールされたプラグイン、画面解像度、フォント)を分析し、Seleniumのデフォルト設定のような自動ツールを特定しブロックします。
- レートリミティング: 特定の時間枠における単一のソースからのリクエスト数を制限します。
- ハニーポット: ページ上のすべてのリンクを盲目的に追うボットを捕らえるために設計された隠されたリンクや要素です。
- 行動分析: マウスの動き、スクロールパターン、およびタイピング速度を監視し、人間と自動的な相互作用を区別します。
LLaMA 3のアプローチは、コンテンツを文脈的に理解することで回復力を高めますが、これらの低レベルのアンチボット防御を本質的に回避するわけではありません。ここで、Scrapeless Scraping Browserのような専門的なツールが不可欠になります。一般的なヘッドレスブラウザとは異なり、Scrapeless Scraping Browserは人間のブラウジング行動を模倣し、さまざまなアンチボット保護を回避するように特別に設計されているため、堅牢なウェブスクレイピングにおいて優れた選択肢です。
なぜBright Dataの提供物よりもScrapeless Scraping Browserを選ぶべきか?
Bright Dataはスクレイピングブラウザを提供していますが、Scrapelessは特にAI駆動のスクレイピングワークフローに適した、より開発者中心で柔軟なソリューションを提供します。以下がScrapeless Scraping Browserが推奨される理由です:
- 高度なフィンガープリンタカスタマイズ: Scrapelessは、ユーザーエージェント、デバイス特性、その他のパラメータを含むブラウザフィンガープリンターの深いカスタマイズを提供します。これにより、実際のユーザーのブラウザプロファイルと実質的に区別がつかない、非常にリアルなブラウザプロファイルを作成でき、検出リスクを大幅に減少させます。
- グローバルに分散されたプロキシネットワーク: 広範な住宅およびモバイルIPのプールを通じてリクエストをルーティングできるグローバル分散型プロキシネットワークを備えています。これにより、IPベースのブロッキングやレートリミティングを効果的に回避し、検出されることなく大規模にスクレイピングを可能にします。
- AI駆動のステルスと回避: Scrapeless Scraping BrowserはAI開発者を念頭に置いて構築されています。ターゲットウェブサイトのアンチボット対策にリアルタイムで適応する動的なステルスモードサポートやその他のAI駆動の回避手法を組み込んでいます。この積極的なアプローチは、スクレイピング操作の成功率を高めます。
- AIワークフローとのシームレスな統合: ScrapelessはAIおよびLLMベースのワークフローとの容易な統合を目的として設計されています。そのAPIは直感的で十分に文書化されており、Pythonスクリプトやその他の自動化ツールへの組み込みが容易です。このシームレスな統合は、効率的でス évol的なAI駆動のスクレイピングソリューションを構築するために重要です。
- コスト効率と柔軟性: Scrapelessは、Bright Dataのような企業向けソリューションと比べて、より柔軟でしばしばコスト効果の高い価格モデルを提供しています。これは、個々の開発者、研究者、中小企業にとってアクセスしやすくありながら強力な選択肢となります。
LLaMA 3の文脈理解とScrapeless Scraping Browserの高度なアンチボット回避能力を組み合わせることで、知能的で回復力のある真に強力なウェブスクレイピングソリューションを構築できます。
次のステップと高度なソリューション
LLaMA 3駆動のウェブスクレイピングの基礎をマスターした後、スクレイパーの機能を拡張し、より高度な実装を探求することができます。以下は、考慮すべき改善と代替ソリューションです:
- スクリプトを再利用可能にする: スクリプトを強化して、ターゲットURLとデータ抽出プロンプトをコマンドライン引数として受け入れるようにします。これにより、異なるウェブサイトやデータ抽出タスクに対してスクレイパーがより柔軟かつ再利用可能になります。
- 資格情報を保護する: Scrapeless Scraping Browserのような商業サービスを使用している場合、APIキーや資格情報を安全に管理することが重要です。それらを
.env
ファイルに保存し、python-dotenv
のようなライブラリを使用してスクリプトに読み込むことで、ソースコードに機密情報をハードコーディングしないようにします。 - マルチページサポートの実装: ページネーションされたコンテンツ(例:eコマースの検索結果、ニュースアーカイブ)を持つウェブサイトのために、複数ページをクロールするロジックを実装します。これは通常、「次のページ」ボタンやURLパターンを特定し、必要なデータがすべて収集されるまでページを繰り返し処理することを含みます。
- 幅広いウェブサイトのスクレイピング: Scrapeless Scraping Browserの強力な検出防止機能を活用して、他の複雑なeコマースプラットフォーム、ソーシャルメディアサイト、データが豊富なウェブアプリケーションをスクレイピングします。
- Googleサービスからのデータ抽出: Google Flights、Google Search、Google TrendsなどのGoogleサービス用の専用スクレイパーを構築します。あるいは、検索エンジン結果については、主要な検索エンジンからすぐに使用できる構造化データを提供する専門のSERP APIの使用を検討します。このことで、独自のスクレイパーを構築および維持する手間を省くことができます。
管理されたソリューションを好む場合や、他のLLM駆動の方法を探求したい場合、次の選択肢も適しているかもしれません:
- Geminiを使ったスクレイピング: GoogleのGeminiモデルを探求し、同様のAI駆動のデータ抽出機能を利用します。
- Perplexityを使ったスクレイピング: Perplexity AIも、ウェブスクレイピングタスクに適応できる強力な言語モデルを提供しています。
- Crawl4AIとDeepSeekを使ったAIスクレイパーの構築: 知的データ抽出用に設計されたCrawl4AIやDeepSeekのような他の専門AIスクレイピングツールやモデルを調査します。
結論: ウェブスクレイピングの未来はインテリジェントである
このガイドは、LLaMA 3を使用してレジリエントでインテリジェントなウェブスクレイパーを構築するための包括的なロードマップを提供しました。大規模言語モデルの文脈推論能力と高度なスクレイピングツールや技術を組み合わせることで、従来の方法の限界を克服し、非常に複雑で防御されたウェブサイトからも最小限の努力で構造化データを抽出できます。
重要なポイントは、ウェブスクレイピングの未来は単なる自動化ではなく、インテリジェントな自動化にあるということです。LLaMA 3のコンテンツを意味的に理解する能力と、Scrapeless Scraping Browserのようなツールの洗練されたボット回避機能は、データ抽出のアプローチにおけるパラダイムシフトを表しています。この強力な組み合わせは、開発者や研究者がより効果的でありながら、常に進化するウェブ環境に対してより適応性があり、レジリエントなスクレイパーを構築することを可能にします。
AI駆動のウェブスクレイピングの旅に出るにあたり、倫理的考慮が最も重要であることを覚えておいてください。スクレイピングするウェブサイトの利用規約を常に尊重し、過剰なリクエストでサーバーを過負荷にしないようにし、データプライバシー規制に注意してください。責任あるインテリジェントなアプローチを採用することで、データ駆動の世界においてイノベーションを促進し、意思決定を支援し、価値を創造するためにウェブデータの膨大な可能性を活用することができます。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。