一部のウェブサイトはSeleniumやPuppeteerなどを使って簡単にスクレイピングできますが、CAPTCHAやIP禁止などの高度なセキュリティ対策を実装しているウェブサイトは難しい場合があります。これらの課題を克服し、スクレイパーを使用して99%のウェブサイトを無料でスクレイピングできるようにするために、この記事ではこれを構築し、
ただし、データの収集は単なる 1 つのステップにすぎません。そのデータで何を行うかは、同等かそれ以上に重要です。多くの場合、大量の情報を手作業で丹念にふるいにかける必要があります。しかし、このプロセスを自動化できるとしたらどうでしょうか。言語モデル (LLM) を活用すると、データを収集するだけでなく、クエリを実行して意味のある洞察を引き出すことができるため、時間と労力を節約できます。
このガイドでは、Web スクレイピングと AI を組み合わせて、大規模なデータを無料で収集および分析するための強力なツールを構築する方法を学びます。さっそく始めましょう。
前提条件
始める前に、次のものがあることを確認してください。
- このプロジェクトには Python コードの作成と理解が含まれるため、基本的な Python の知識が必要です。
- システムにPython(3.7以降)をインストールします。ダウンロードはこちらから
python.org 。
インストールとセットアップ
このチュートリアルを続行するには、次の手順を実行します。
次の手順に従って環境を設定し、AI 搭載スクレーパーの構築を準備します。
1. 仮想環境を作成する
まず、プロジェクトの依存関係を管理するための仮想環境を設定します。これにより、必要なすべてのパッケージのための分離されたスペースが確保されます。
新しいプロジェクト ディレクトリを作成します。
ターミナル (または Windows の場合はコマンド プロンプト/PowerShell) を開き、プロジェクト用の新しいディレクトリを作成します。
mkdir ai-website-scraper cd ai-website-scraper
仮想環境を作成します。
仮想環境を作成するには、次のコマンドを実行します。
Windowsの場合:
python -m venv venv
macOS/Linuxの場合:
python3 -m venv venv
これにより、仮想環境を保存するvenv
フォルダーが作成されます。
2.仮想環境をアクティブにする
仮想環境をアクティブにして、その中で作業を開始します。
Windowsの場合:
.\venv\Scripts\activate
macOS/Linuxの場合:
source venv/bin/activate
ターミナルプロンプトが ( venv
) に変わり、仮想環境内にいることが確認されます。
3. 必要な依存関係をインストールする
次に、プロジェクトに必要なライブラリをインストールします。プロジェクト ディレクトリにrequirements.txt
ファイルを作成し、次の依存関係を追加します。
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
これらのパッケージは、スクレイピング、データ処理、UI の構築に不可欠です。
streamlit : インタラクティブなユーザー インターフェイスを作成するために使用されます。
Selenium : ウェブサイトのコンテンツをスクレイピングします。
beautifulsoup4 : HTML を解析してクリーンアップします。
langchainおよびlangchain-ollama : これは、Ollama LLM と統合してテキストを処理するためのものです。
lxmlおよびhtml5lib : 高度な HTML 解析用。
次のコマンドを実行して依存関係をインストールします。
(コマンドを実行する前に、ファイルが配置されているフォルダーにいることを確認してください。)
pip install -r requirements.txt
Streamlit で UI を構築する
1. Streamlit スクリプトを設定する
プロジェクト ディレクトリに ui.py という名前のファイルを作成します。このスクリプトはスクレーパーの UI を定義します。以下のコードを使用してアプリケーションを構築します。
import streamlit as st import pathlib from main import scrape_website # function to load css from the assets folder def load_css(file_path): with open(file_path) as f: st.html(f"<style>{f.read()}</style>") # Load the external CSS css_path = pathlib.Path("assets/style.css") if css_path.exists(): load_css(css_path) st.title("AI Scraper") st.markdown( "Enter a website URL to scrape, clean the text content, and display the result in smaller chunks." ) url = st.text_input(label= "", placeholder="Enter the URL of the website you want to scrape") if st.button("Scrape", key="scrape_button"): st.write("scraping the website...") result = scrape_website(url) st.write("Scraping complete.") st.write(result)
- st.title 関数とst.markdown関数は、アプリケーションのタイトルを設定し、ユーザーに指示を提供します。
- st.text_inputコンポーネントを使用すると、ユーザーはスクレイピングする Web サイトの URL を入力できます。
- 「スクレイプ」ボタンをクリックすると、スクレイピング ロジックがトリガーされ、 st.info を使用して進行状況メッセージが表示されます。
Streamlitコンポーネントの詳細については、
2. カスタムスタイルを追加する
アプリケーションのスタイルを設定するには、プロジェクト ディレクトリにアセット フォルダーを作成し、style.css ファイルを追加します。CSS を使用して Streamlit インターフェイスをカスタマイズします。
.stAppViewContainer { background-image: url("https://images.unsplash.com/photo-1732979887702-40baea1c1ff6?q=80&w=2832&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"); background-size: cover; color: black; } .stAppHeader { background-color: rgba(0, 0, 0, 0); } .st-ae { background-color: rgba(233, 235, 234, 0.895); } .st-emotion-cache-ysk9xe { color: black; } .st.info, .stAlert { background-color: black; } .st-key-scrape_button button { display: inline-block; padding: 10px 20px; font-size: 16px; color: #fff; background-color: #007bff; border: none; border-radius: 5px; cursor: pointer; animation: pulse 2s infinite; } .st-key-scrape_button button:hover { background-color: #0056b3; color: #fff; }
3. Streamlitアプリを実行する
プロジェクト ディレクトリで、次のコマンドを実行します。
streamlit run ui.py
これによりローカル サーバーが起動し、ターミナルに URL (通常はhttp://localhost:8501
が表示されます。この URL をブラウザーで開いて、Web アプリケーションを操作します。
Selenium でウェブサイトをスクレイピングする
次に、Selenium を使用して任意の Web ページの HTML コンテンツを抽出するコードを記述します。ただし、コードを機能させるには、Chrome WebDriver が必要です。
Selenium 用の ChromeDriver をインストールする
Selenium では、Web ページとやり取りするために WebDriver が必要です。設定方法は次のとおりです。
- ChromeDriverをダウンロード:
こちらを訪問ChromeDriver ウェブサイト Google Chrome ブラウザに一致するバージョンをダウンロードしてください。 - ChromeDriverをPATHに追加する
ChromeDriver をダウンロードしたら、ファイルを解凍し、アプリケーション ファイル名「 chromedriver 」をコピーしてプロジェクト フォルダーに貼り付けます。
これが完了したら、 main.py
という新しいファイルを作成し、以下のコードを実装します。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Function to scrape HTML from a website def scrape_website(website_url): # Path to WebDriver webdriver_path = "./chromedriver" # Replace with your WebDriver path service = Service(webdriver_path) driver = webdriver.Chrome(service=service) try: # Open the website driver.get(website_url) # Wait for the page to fully load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # Extract the HTML source html_content = driver.page_source return html_content finally: # Ensure the browser is closed after scraping driver.quit()
コードを保存して実行すると、スクレイピングしたページのすべての HTML が次のように streamlit アプリケーションに表示されます。
プロキシプロバイダーを使用してキャプチャと IP 禁止の Web サイトをバイパスする
これでウェブサイトの HTML を取得できるようになりましたが、CAPTCHA チャレンジや IP 禁止などの高度なスクレイピング防止メカニズムを備えたサイトでは、上記のコードは機能しない可能性があります。たとえば、Indeed や Amazon などのサイトを Selenium を使用してスクレイピングすると、CAPTCHA ページでアクセスがブロックされることがあります。これは、ボットがコンテンツにアクセスしようとしていることをウェブサイトが検出したために発生します。この動作が続くと、サイトは最終的に IP アドレスを禁止し、それ以上のアクセスを阻止する可能性があります。
これを修正するには、統合します
Bright Dataのスクレイピングブラウザを無料でセットアップする
サインアップ —
Bright Dataのホームページ 「無料トライアルを開始」をクリックします。すでにBright Dataのアカウントをお持ちの場合は、ログインするだけです。ログイン後、「プロキシ製品を取得」をクリックします。
「追加」ボタンをクリックし、「スクレイピングブラウザ」を選択します。
次に、「ゾーンの追加」ページに移動し、新しいスクレイピング ブラウザー プロキシ ゾーンの名前を選択する必要があります。その後、「追加」をクリックします。
この後、プロキシ ゾーンの資格情報が作成されます。任意の Web サイトで使用されているスクレイピング防止メカニズムを回避するには、スクリプトにこれらの詳細が必要になります。
スクレイピング ブラウザの詳細については、Bright Data の開発者向けドキュメントも参照してください。
main.py
ファイルで、コードを次のように変更します。このコードは以前のコードよりも簡潔で短いことがわかります。
from selenium.webdriver import Remote, ChromeOptions from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection from selenium.webdriver.common.by import By from bs4 import BeautifulSoup AUTH = '<username>:<passord>' SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515' # Function to scrape HTML from a website def scrape_website(website_url): print("Connecting to Scraping Browser...") sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome") with Remote(sbr_connection, options=ChromeOptions()) as driver: driver.get(website_url) print("Waiting captcha to solve...") solve_res = driver.execute( "executeCdpCommand", { "cmd": "Captcha.waitForSolve", "params": {"detectTimeout": 10000}, }, ) print("Captcha solve status:", solve_res["value"]["status"]) print("Navigated! Scraping page content...") html = driver.page_source return html
<username>と<password> をスクレイピング ブラウザーのユーザー名とパスワードに置き換えます。
Domコンテンツのクリーンアップ
ウェブサイトの HTML コンテンツをスクレイピングすると、多くの場合、抽出するコア情報に寄与しない JavaScript、CSS スタイル、不要なタグなどの不要な要素がコンテンツに含まれます。データをより構造化して、さらに処理しやすくするには、無関係な要素を削除し、テキストを整理して、DOM コンテンツをクリーンアップする必要があります。
このセクションでは、HTML コンテンツをクリーンアップし、意味のあるテキストを抽出して、下流の処理のために小さなチャンクに分割する方法について説明します。クリーンアップ プロセスは、自然言語処理やコンテンツ分析などのタスク用にデータを準備するために不可欠です。
DOM コンテンツをクリーンアップするためのコード ウォークスルー
以下は、DOM コンテンツのクリーンアップを処理するためにmain.pyに追加されるコードです。
from bs4 import BeautifulSoup # Extract the body content from the HTML def extract_body_content(html_content): soup = BeautifulSoup(html_content, "html.parser") body_content = soup.body if body_content: return str(body_content) return "" # Clean the body content by removing scripts, styles, and other unwanted elements def clean_body_content(body_content): soup = BeautifulSoup(body_content, "html.parser") # Remove <script> and <style> tags for script_or_style in soup(["script", "style"]): script_or_style.extract() # Extract cleaned text with each line separated by a newline cleaned_content = soup.get_text(separator="\n") cleaned_content = "\n".join( line.strip() for line in cleaned_content.splitlines() if line.strip() ) return cleaned_content # Split the cleaned content into smaller chunks for processing def split_dom_content(dom_content, max_length=5000): return [ dom_content[i : i + max_length] for i in range(0, len(dom_content), max_length) ]
コードが何をするか
- 本文コンテンツの抽出:
- extract_body_content関数は BeautifulSoup を使用して HTML を解析し、 <body>タグのコンテンツを抽出します。
- <body>タグが存在する場合、関数はそれを文字列として返します。存在しない場合は、空の文字列を返します。
- コンテンツのクリーニング:
- clean_body_content関数は、抽出されたコンテンツを処理して不要な要素を削除します。
- JavaScript と CSS を排除するために、 <script> タグと<style>タグが削除されます。
- この関数は、クリーンアップされたコンテンツからプレーンテキストを取得します。
- 空行と余分なスペースを削除してテキストをフォーマットします。
- clean_body_content関数は、抽出されたコンテンツを処理して不要な要素を削除します。
- コンテンツの分割:
- split_dom_content関数は、クリーンアップされたコンテンツを取得し、デフォルトの最大長が 5,000 文字の小さなチャンクに分割します。
- これは、特にトークンまたは入力サイズの制限があるモデルにデータを渡す場合に、大量のテキストを管理可能な部分に分けて処理するのに役立ちます。
変更を保存し、アプリケーションをテストします。Web サイトをスクレイピングすると、次のような出力が得られるはずです。
Dom コンテンツを Ollama に解析する
DOMコンテンツがクリーンアップされ準備されたら、次のステップは情報を解析して特定の詳細を抽出することです。
まだインストールしていない場合は、Ollamaを以下のサイトからダウンロードしてインストールしてください。
公式サイト Homebrew コマンドを使用して Mac にインストールできます。brew install ollama
次に、任意のモデルをインストールします
このリスト ; Phi3、Mistral、Gemma 2 などのモデルがあり、それぞれに独自のシステム要件があります。このコードでは、主に軽量であるという理由で phi3 を使用しています。ollama pull phi3
インストール後、LangChain を使用してスクリプトからそのモデルを呼び出し、送信されるデータから有意義な洞察を提供できます。
DOMコンテンツをphi3モデルに解析する機能を設定する方法は次のとおりです。
llm.py のコードウォークスルー
次のコードは、Ollama を使用して DOM チャンクを解析し、関連する詳細を抽出するロジックを実装します。
from langchain_ollama import OllamaLLM from langchain_core.prompts import ChatPromptTemplate # Template to instruct Ollama for parsing template = ( "You are tasked with extracting specific information from the following text content: {dom_content}. " "Please follow these instructions carefully: \n\n" "1. **Extract Information:** Only extract the information that directly matches the provided description: {parse_description}. " "2. **No Extra Content:** Do not include any additional text, comments, or explanations in your response. " "3. **Empty Response:** If no information matches the description, return an empty string ('')." "4. **Direct Data Only:** Your output should contain only the data that is explicitly requested, with no other text." ) # Initialize the Ollama model model = OllamaLLM(model="phi3") # Function to parse DOM chunks with Ollama def parse_with_ollama(dom_chunks, parse_description): prompt = ChatPromptTemplate.from_template(template) chain = prompt | model parsed_results = [] for i, chunk in enumerate(dom_chunks, start=1): if not chunk.strip(): # Skip empty chunks print(f"Skipping empty chunk at batch {i}") continue try: print(f"Processing chunk {i}: {chunk[:100]}...") # Print a preview print(f"Parse description: {parse_description}") response = chain.invoke( { "dom_content": chunk, "parse_description": parse_description, } ) print(f"Response for batch {i}: {response}") parsed_results.append(response) except Exception as e: print(f"Error parsing chunk {i}: {repr(e)}") parsed_results.append(f"Error: {repr(e)}") return "\n".join(parsed_results)
コードが行うこと。
- 指示テンプレート:
- Ollama に、どのような情報を抽出するかについて正確なガイダンスを提供します。
- 出力が明確かつ簡潔で、解析の説明に関連していることを確認します。
- チャンク処理:
- parse_with_ollama 関数は DOM チャンクを反復処理し、それぞれを LLM で処理します。
- パフォーマンスを最適化するために空のチャンクをスキップします。
- エラー処理:
- エラーを適切に処理し、ログに記録して、残りのチャンクの処理を続行します。
ui.pyファイルの更新
ユーザーが LLM に解析指示を入力して結果を表示できるようにするには、ui.py ファイルに次のコードを追加します。
from main import scrape_website, extract_body_content, clean_body_content, split_dom_content from llm import parse_with_ollama if "dom_content" in st.session_state: parse_description = st.text_area("Enter a description to extract specific insights from your scraped data:") if st.button("Parse Content", key="parse_button"): if parse_description.strip() and st.session_state.get("dom_content"): st.info("Parsing the content...") dom_chunks = split_dom_content(st.session_state.dom_content) parsed_result = parse_with_ollama(dom_chunks, parse_description) st.text_area("Parsed Results", parsed_result, height=300) else: st.error("Please provide valid DOM content and a description to parse.")
UIでの動作
- ユーザー入力:
- ユーザーは、抽出するデータの自然言語による説明をテキスト領域に入力します。
- 解析トリガー:
- 「コンテンツの解析」ボタンをクリックすると、クリーンアップされた DOM コンテンツが管理可能なチャンクに分割され、parse_with_ollama に渡されます。
- 結果の表示:
- 解析された結果はテキスト領域に表示され、ユーザーは抽出された情報を確認できます。
これが完了すると、スクレイパーはスクレイピングしたデータに基づいてプロンプトに応答できるようになります。
次は何ですか?
Web スクレイピングと AI を組み合わせることで、データに基づく洞察の刺激的な可能性が広がります。データの収集と保存だけでなく、AI を活用して、スクレイピングしたデータから洞察を得るプロセスを最適化できるようになりました。これは、マーケティング チームや営業チーム、データ分析、ビジネス オーナーなど、さまざまな人にとって役立ちます。
AI スクレイパーの完全なコードは、こちらでご覧いただけます。自由に試してみて、独自のニーズに合わせて調整してください。貢献も歓迎します。改善のアイデアがある場合は、プル リクエストを作成することを検討してください。
これをさらに進めることもできます。いくつかのアイデアをご紹介します。
- プロンプトの実験: 特定の洞察を抽出したり、固有のプロジェクト要件に対応したりするためにプロンプトをカスタマイズします。
- ユーザーインターフェース
- 他のLLMモデルの統合:他の言語モデルを探索する
オープンAI 、ジェミニ などを使用して、データ分析をさらに最適化します。