Trafilaturaウェブスクレイピング:LLM用のクリーンなテキスト抽出
Web Data Collection Specialist
TL;DR:
- Trafilaturaは、生のHTMLページをクリーンな主要コンテンツテキストに変換し、ナビゲーション、サイドバー、フッターを取り除いて、言語モデルがコンテンツを見れるようにします。
- 例のページでは、9,275文字のHTMLが1,324文字のクリーンなテキストになり、86%の削減がLLMのコンテキストウィンドウに直接入ります。
- Trafilaturaにはクリアブロックを行うフェッチレイヤーがないため、このガイドではScrapelessによる取得とTrafilaturaによる抽出を組み合わせています。
trafilatura.extractはプレーンテキストを生成し、output_format="markdown"または"json"の同じ呼び出しはMarkdownまたはタイトル、著者、日付を含むメタデータレコードを返します。- 分割はクリーンです:Scrapelessがページを取得し、Trafilaturaがその中から記事を抽出します。
- Scrapelessの無料プランを開始し、抽出ツールを自分のページに向けてください。
スクレイピングされたHTMLページは、ほとんどが望んでいるものではありません。ナビゲーション、クッキーバナー、関連する記事のレール、フッターはほとんどのバイトを占め、これらすべてを言語モデルに入力するとトークンを無駄にし、信号を希釈します。Trafilaturaは、その問題の後半を解決します:HTMLが与えられれば、それが主要コンテンツを見つけ出し、クリーンなテキストとして返します。最初の半分は解決しません。なぜなら、反発するページをフェッチできないからです。
このガイドは二つの半分を組み合わせています。Scrapeless Universal Scraping APIがページを取得し、Trafilaturaが記事を抽出します。以下のすべての数字は、実際の公開ページに対する実行からのものです。
Trafilaturaの機能
Trafilaturaは主要コンテンツ抽出ライブラリです:HTMLを読み取り、周囲のボイラープレートなしで記事テキストを返します。ページの構造を通じてコンテンツとナビゲーションを区別し、その抽出品質はそれを紹介するピアレビュー論文でベンチマークされています。取得またはLLMパイプラインを構築する人にとって、それは「HTMLがある」と「埋め込みに値するテキストがある」の間のステップです。
Trafilaturaはスクレイパーではありません。ブラウザもプロキシも、アクセスチャレンジを通過する方法もありません。組み込みのfetch_urlはプレーンなHTTPクライアントですので、保護されたページではブロックページを取得し、しっかりとブロックを抽出します。それが、取得がそれに特化したツールに属する理由です。
インストール
Trafilaturaは、単一のpipインストールです。
bash
pip install trafilatura
シェルでScrapelessキーを設定します。実行時には実際のキーを使用し、プレースホルダーはソースから除いておいてください。
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
基本的な抽出
Scrapelessでページを取得し、次にHTMLをtrafilatura.extractに渡します。それは主要なコンテンツをクリーンなテキストとして返します。
python
import json
import os
import urllib.request
import trafilatura
API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
def fetch_html(url: str) -> str:
payload = json.dumps(
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
).encode()
request = urllib.request.Request(
API_URL,
data=payload,
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=90) as response:
return json.loads(response.read())["data"]
html = fetch_html(TARGET)
text = trafilatura.extract(html)
print(f"生のhtml文字数: {len(html)}")
print(f"クリーンテキスト文字数: {len(text)}")
print(f"ボイラープレート削除: {100 * (1 - len(text) / len(html)):.0f}%")
出力は、クロームが取り除かれた後にページがどれだけ縮小するかを示しています。
text
生のhtml文字数: 9275
クリーンテキスト文字数: 1324
ボイラープレート削除: 86%
残る1,324文字は、タイトル、価格、在庫、製品説明であり、ナビゲーション、パンくずリスト、フッターは削除されています。その86%の削減は、もはやモデルに読み込ませるために支払う必要のないトークンです。
Markdownとメタデータ
プレーンテキストがデフォルトですが、取得パイプラインは通常、構造を望みます。同じextract呼び出しはoutput_formatを取りますので、Markdownは見出しやリストを保持し、モデルが読みやすくなります。
python
markdown = trafilatura.extract(html, output_format="markdown")
print(f"markdown文字数: {len(markdown)}")
出所を求めるために、メタデータ付きのJSONを要求します。レコードはタイトル、著者、ホスト名、日付、言語をテキストと共に運び、埋め込みの横に保存され、取得したチャンクがその出所を引用できます。
python
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"タイトル: {record['title']}")
完全な抽出ツール
フェッチ、テキスト、Markdown、メタデータをまとめて、1つのスクリプトがダウンストリームパイプラインに必要なすべてのURLを受け取ります。
python
import json
import os
import urllib.request
import trafilatura
API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
def fetch_html(url: str) -> str:
payload = json.dumps(
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
).encode()
request = urllib.request.Request(
API_URL,
data=payload,
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=90) as response:
return json.loads(response.read())["data"]
html = fetch_html(TARGET)
print(f"生のHTML文字数: {len(html)}")
text = trafilatura.extract(html)
print(f"クリーンテキスト文字数: {len(text)}")
print(f"ボイラープレート削除率: {100 * (1 - len(text) / len(html)):.0f}%")
markdown = trafilatura.extract(html, output_format="markdown")
print(f"Markdown文字数: {len(markdown)}")
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"タイトル: {record['title']}")
実行結果は、パイプラインが消費する各出力を報告します。
text
生のHTML文字数: 9275
クリーンテキスト文字数: 1324
ボイラープレート削除率: 86%
Markdown文字数: 1474
タイトル: A Light in the Attic
Trafilaturaが停止する場所
Trafilaturaは抽出を行いますが、ブロックを越えて取得することはしません。その境界が、このガイドが2つのツールを使用する理由です。Trafilatura自身のフェッチを保護されたページにポイントすると、チャレンジを受けるか空のシェルを受け取り、そこから有用なものを抽出できません。Scrapelessは取得を処理し、レンダリングされたHTMLを返し、Trafilaturaがその後を引き継ぎます。ターゲットがJavaScriptで記事をレンダリングする場合、リクエスト内の js_render を True に設定すると、Trafilaturaが受け取るHTMLにはすでにコンテンツが含まれます。マークアップがサーバーレンダーされたときは、ここでのように False にします。
サイト全体でこれを実行する前に、その robots.txt と利用規約を読みます。 ロボット排除プロトコル は、サイトが自動クライアントに避けてほしいパスを示しており、これを守ることで抽出パイプラインを持続可能に保ちます。広範な取り込みの観点では、RAGのためのクリーンなウェブテキストパイプラインの構築に関するガイド が、この抽出ステップの位置を示します。
自分のページで試してみたいですか? 無料のScrapelessアカウントを作成し、ターゲットURLを変更してください。
結論
クリーンなテキストは、言語モデルが実際に必要とするものであり、そこへ到達するには2つのステップが必要です:取得して、次に抽出します。Scrapelessはページを返し、Trafilaturaは9,275文字のHTMLを1,324文字のコンテンツに変換します。テキスト、Markdown、またはメタデータレコードの形式です。 Trafilaturaのドキュメント は、出力形式と調整オプションを完全にカバーしています。完全なスクリプトから始めて、自分のURLを入れ替え、その結果を埋め込みまたはLLMステップに供給してください。
Scrapelessの無料プランで始めることで、自分のページを取得し、定期的なジョブをサイズアップする際はScrapelessの料金を確認してください。
FAQ
Q: Trafilaturaはウェブページを自分でフェッチしますか?
それには内蔵の fetch_url が備わっていますが、それはブロック解除のない単純なHTTPクライアントであるため、アクセスチャレンジの背後にあるページでは失敗します。レンダリングされたHTMLを返す取得ツール(Scrapelessなど)と組み合わせて、Trafilaturaが得意なHTMLからメインコンテンツを抽出することをさせてください。
Q: TrafilaturaはBeautifulSoupとどう違いますか?
BeautifulSoupはパーサーです:どの要素を選択するかを指定します。Trafilaturaは抽出器です:ページのどの部分がメインコンテンツであるかを決定し、それを返します。選択子を書く必要がありません。特定のフィールドが必要な場合はBeautifulSoupを使用し、クリーンなテキストとして記事本文を取得したい場合はTrafilaturaを使用します。
Q: Trafilaturaはどの出力形式をサポートしていますか?
extract 関数は txt(デフォルト)、markdown、json または xml の output_format を受け取ります。MarkdownはLLM入力用に見出しやリストを保持し、with_metadata=True のJSONはテキストの横にタイトル、著者、日付、言語を追加します。
Q: Trafilaturaはタイトルと著者を保持できますか?
はい。output_format="json"とwith_metadata=Trueを指定してextractを呼び出すと、返されるレコードにはtitle、author、hostname、date、languageが含まれます。そのメタデータを埋め込みと一緒に保存することで、取得したチャンクがどこから来たのかを報告できます。
Q: なぜ全ページをLLMに送るのではなく、メインコンテンツを抽出するのですか?
ページのほとんどはナビゲーション、広告、フッターであり、例のページでは86%の文字数を占めています。すべてを送信するとトークンがかかり、信号が埋もれてしまうため、まずメインコンテンツを抽出することでコストを削減し、モデルが重要なテキストに集中するのを改善します。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



