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 Forbidden や Access Denied
です。最近のサイトはAI対策が進んでいますからね。
User-Agentの偽装 は基本中の基本ですが、それでもダメな時は「アクセス頻度を下げる(sleep
を入れる)」のが一番の特効薬です。我々の目的はDDoS攻撃ではありません。「人間がゆっくり閲覧している」フリをさせてください。
あと、くれぐれも社内ネットワークから無茶なクロールをして、会社のIPごとブラックリストに入らないように。情シス部長に呼び出されるのは私だけで十分です(苦笑)。
まとめ:情報は「探す」時代から「集まってくる」時代へ
WebスクレイピングとLangChainを組み合わせれば、毎朝特定のニュースサイトを巡回して、「自社に関係あるトピック」だけをSlackに通知するボットなんかも簡単に作れます。
これからは、人間が情報を探しに行くのではなく、エージェントが情報を集めてきてくれる時代です。その仕組みを作るのが、我々エンジニアの新しい役割かもしれませんね。さて、浮いた時間で溜まってる経費精算でも片付けますか...
コメント
コメントを投稿