スキップしてメイン コンテンツに移動

Webスクレイピング×LangChainで競合調査を自動化する:BeautifulSoupとPlaywrightの実戦投入

Webスクレイピング×LangChainで競合調査を自動化する:BeautifulSoupとPlaywrightの実戦投入

はじめに:「ググってまとめといて」業務を撲滅したい

企画部門やマーケティングチームから、「競合他社のこの製品のスペック、一覧表にしてくれない?」みたいな依頼、来ませんか?
私も先日、類似サービスの価格表をエクセルにまとめる作業を頼まれまして。最初は手作業でコピペしてたんですが、10件目くらいで「俺の時給を使ってやることか?」と虚無感に襲われました。

こういう単純作業こそ、AIとスクレイピングの出番です。今回はLangChainを使って、URLを渡すだけでWebサイトの内容を引っこ抜き、さらにAIに「要するにどういうこと?」と要約させる自動化フローを作ってみました。これさえあれば、競合調査なんてコーヒー飲みながら終わらせられます。

基礎知識:LangChainにおけるWebLoaderの仕組み

LangChainには document_loaders という便利なモジュール群があり、その中にWebサイト読み込み用のクラスが用意されています。これらは単にHTMLを取得するだけでなく、メインコンテンツの抽出(不要なヘッダーや広告の削除)まで考慮されているのが特徴です。

昔ながらの BeautifulSoup をガリガリ書くのも楽しいですが、LangChainのLoaderを使えば、取得したテキストをそのままLLMに突っ込んで解析できるので、開発スピードが段違いです。

実装・設定:静的サイト(BS4)と動的サイト(Playwright)の使い分け

Webサイトには2種類あります。単純なHTMLでできている「静的サイト」と、JavaScriptでグリグリ動く「動的サイト」です。相手によって武器を使い分けるのがプロの仕事です。

パターンA:静的サイトなら軽量な WebBaseLoader

ニュースサイトやブログなど、シンプルな構造ならこれで十分です。依存ライブラリも少なく、動作も爆速です。

from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://example.com/product/spec")
documents = loader.load()
print(documents[0].page_content)

パターンB:動的サイトなら Playwright

SPA(Single Page Application)や、スクロールしないと中身が出ないサイトには、ブラウザを自動操作する Playwright を使います。これをセットアップするのは少し手間ですが、取れないデータはほぼ無くなります。

from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import BeautifulSoupTransformer

# ヘッドレスブラウザでアクセス
loader = AsyncChromiumLoader(["https://example.com/spa-page"])
html = loader.load()

# 必要なタグだけ抽出(トークン節約のため重要!)
bs_transformer = BeautifulSoupTransformer()
docs_transformed = bs_transformer.transform_documents(html, tags_to_extract=["h2", "p", "table"])

応用テクニック:取得データの整形と要約

スクレイピングした直後のデータは「生の食材」です。そのままでは食べにくい(LLMのトークンを無駄に食う)。そこで、LLMに渡して「構造化データ」に変換させます。

例えば、「この文章から『製品名』『価格』『特徴』をJSONで抽出して」と指示すれば、あのごちゃごちゃしたHTMLが綺麗なデータベースに早変わりします。これをCSVに吐き出せば、依頼元のマーケティング担当も大喜びです。

トラブルシューティング:アクセス拒否とIPブロックの壁

スクレイピングをしていると、必ずぶつかるのが 403 ForbiddenAccess Denied です。最近のサイトはAI対策が進んでいますからね。

User-Agentの偽装 は基本中の基本ですが、それでもダメな時は「アクセス頻度を下げる(sleep を入れる)」のが一番の特効薬です。我々の目的はDDoS攻撃ではありません。「人間がゆっくり閲覧している」フリをさせてください。
あと、くれぐれも社内ネットワークから無茶なクロールをして、会社のIPごとブラックリストに入らないように。情シス部長に呼び出されるのは私だけで十分です(苦笑)。

まとめ:情報は「探す」時代から「集まってくる」時代へ

WebスクレイピングとLangChainを組み合わせれば、毎朝特定のニュースサイトを巡回して、「自社に関係あるトピック」だけをSlackに通知するボットなんかも簡単に作れます。

これからは、人間が情報を探しに行くのではなく、エージェントが情報を集めてきてくれる時代です。その仕組みを作るのが、我々エンジニアの新しい役割かもしれませんね。さて、浮いた時間で溜まってる経費精算でも片付けますか...

この記事はAI技術を活用して作成されましたが、内容は慎重に確認されています。

コメント