一部のウェブサイトはSeleniumやPuppeteerなどを使って簡単にスクレイピングできますが、CAPTCHAやIP禁止などの高度なセキュリティ対策を実装しているウェブサイトは難しい場合があります。これらの課題を克服し、スクレイパーを使用して99%のウェブサイトを無料でスクレイピングできるようにするために、この記事ではこれを構築し、
ただし、データの収集は単なる 1 つのステップにすぎません。そのデータで何を行うかは、同等かそれ以上に重要です。多くの場合、大量の情報を手作業で丹念にふるいにかける必要があります。しかし、このプロセスを自動化できるとしたらどうでしょうか。言語モデル (LLM) を活用すると、データを収集するだけでなく、クエリを実行して意味のある洞察を引き出すことができるため、時間と労力を節約できます。
このガイドでは、Web スクレイピングと AI を組み合わせて、大規模なデータを無料で収集および分析するための強力なツールを構築する方法を学びます。さっそく始めましょう。
始める前に、次のものがあることを確認してください。
このチュートリアルを続行するには、次の手順を実行します。
次の手順に従って環境を設定し、AI 搭載スクレーパーの構築を準備します。
まず、プロジェクトの依存関係を管理するための仮想環境を設定します。これにより、必要なすべてのパッケージのための分離されたスペースが確保されます。
新しいプロジェクト ディレクトリを作成します。
ターミナル (または Windows の場合はコマンド プロンプト/PowerShell) を開き、プロジェクト用の新しいディレクトリを作成します。
mkdir ai-website-scraper cd ai-website-scraper
仮想環境を作成します。
仮想環境を作成するには、次のコマンドを実行します。
Windowsの場合:
python -m venv venv
macOS/Linuxの場合:
python3 -m venv venv
これにより、仮想環境を保存するvenv
フォルダーが作成されます。
仮想環境をアクティブにして、その中で作業を開始します。
Windowsの場合:
.\venv\Scripts\activate
macOS/Linuxの場合:
source venv/bin/activate
ターミナルプロンプトが ( venv
) に変わり、仮想環境内にいることが確認されます。
次に、プロジェクトに必要なライブラリをインストールします。プロジェクト ディレクトリに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
プロジェクト ディレクトリに 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)
Streamlitコンポーネントの詳細については、
アプリケーションのスタイルを設定するには、プロジェクト ディレクトリにアセット フォルダーを作成し、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; }
プロジェクト ディレクトリで、次のコマンドを実行します。
streamlit run ui.py
これによりローカル サーバーが起動し、ターミナルに URL (通常はhttp://localhost:8501
が表示されます。この URL をブラウザーで開いて、Web アプリケーションを操作します。
次に、Selenium を使用して任意の Web ページの HTML コンテンツを抽出するコードを記述します。ただし、コードを機能させるには、Chrome WebDriver が必要です。
Selenium では、Web ページとやり取りするために WebDriver が必要です。設定方法は次のとおりです。
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 アプリケーションに表示されます。
これでウェブサイトの HTML を取得できるようになりましたが、CAPTCHA チャレンジや IP 禁止などの高度なスクレイピング防止メカニズムを備えたサイトでは、上記のコードは機能しない可能性があります。たとえば、Indeed や Amazon などのサイトを Selenium を使用してスクレイピングすると、CAPTCHA ページでアクセスがブロックされることがあります。これは、ボットがコンテンツにアクセスしようとしていることをウェブサイトが検出したために発生します。この動作が続くと、サイトは最終的に IP アドレスを禁止し、それ以上のアクセスを阻止する可能性があります。
これを修正するには、統合します
サインアップ —
ログイン後、「プロキシ製品を取得」をクリックします。
「追加」ボタンをクリックし、「スクレイピングブラウザ」を選択します。
次に、「ゾーンの追加」ページに移動し、新しいスクレイピング ブラウザー プロキシ ゾーンの名前を選択する必要があります。その後、「追加」をクリックします。
この後、プロキシ ゾーンの資格情報が作成されます。任意の 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> をスクレイピング ブラウザーのユーザー名とパスワードに置き換えます。
ウェブサイトの HTML コンテンツをスクレイピングすると、多くの場合、抽出するコア情報に寄与しない JavaScript、CSS スタイル、不要なタグなどの不要な要素がコンテンツに含まれます。データをより構造化して、さらに処理しやすくするには、無関係な要素を削除し、テキストを整理して、DOM コンテンツをクリーンアップする必要があります。
このセクションでは、HTML コンテンツをクリーンアップし、意味のあるテキストを抽出して、下流の処理のために小さなチャンクに分割する方法について説明します。クリーンアップ プロセスは、自然言語処理やコンテンツ分析などのタスク用にデータを準備するために不可欠です。
以下は、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) ]
コードが何をするか
変更を保存し、アプリケーションをテストします。Web サイトをスクレイピングすると、次のような出力が得られるはずです。
DOMコンテンツがクリーンアップされ準備されたら、次のステップは情報を解析して特定の詳細を抽出することです。
まだインストールしていない場合は、Ollamaを以下のサイトからダウンロードしてインストールしてください。
brew install ollama
次に、任意のモデルをインストールします
ollama pull phi3
インストール後、LangChain を使用してスクリプトからそのモデルを呼び出し、送信されるデータから有意義な洞察を提供できます。
DOMコンテンツをphi3モデルに解析する機能を設定する方法は次のとおりです。
次のコードは、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)
ユーザーが 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.")
これが完了すると、スクレイパーはスクレイピングしたデータに基づいてプロンプトに応答できるようになります。
Web スクレイピングと AI を組み合わせることで、データに基づく洞察の刺激的な可能性が広がります。データの収集と保存だけでなく、AI を活用して、スクレイピングしたデータから洞察を得るプロセスを最適化できるようになりました。これは、マーケティング チームや営業チーム、データ分析、ビジネス オーナーなど、さまざまな人にとって役立ちます。
AI スクレイパーの完全なコードは、こちらでご覧いただけます。自由に試してみて、独自のニーズに合わせて調整してください。貢献も歓迎します。改善のアイデアがある場合は、プル リクエストを作成することを検討してください。
これをさらに進めることもできます。いくつかのアイデアをご紹介します。