動的 Web ページからデータをロードしようとすると、スクレイパーがスタックしていませんか?無限スクロールや煩わしい「さらに読み込む」ボタンにイライラしていませんか?
あなたは一人ではありません。現在、多くの Web サイトがユーザー エクスペリエンスを向上させるためにこれらのデザインを実装していますが、Web スクレーパーにとっては困難な場合があります。
このチュートリアルでは、もっと読み込む ボタンを使用してデモ ページをスクレイピングするための初心者向けのチュートリアルを説明します。ターゲット Web ページは次のようになります:
最後までに、次の方法を学びます:
飛び込んでみましょう!
実際に始める前に、次の前提条件を確認してください:
必要なライブラリ:
ターミナルで次のコマンドを使用して、これらのライブラリをインストールできます:
pip install requests beautifulsoup4 selenium
Selenium を使用する前に、ブラウザに一致する Web ドライバーをインストールする必要があります。このチュートリアルでは、Google Chrome と ChromeDriver を使用します。ただし、Firefox や Edge などの他のブラウザでも同様の手順に従うことができます。
Web ドライバーをインストールします
Google Chrome を開き、ヘルプ > に移動します。 Chrome のバージョンを確認するには、3 点メニューから Google Chrome について を選択してください。
ChromeDriver をダウンロード:
ChromeDriver のダウンロード ページにアクセスします。
Chrome のバージョンと一致するドライバーのバージョンをダウンロードします。
ChromeDriver をシステムのパスに追加します:
ダウンロードしたファイルを解凍し、/usr/local/bin (Mac/Linux) または C:WindowsSystem32 (Windows) などのディレクトリに配置します。
インストールの確認
プロジェクト ディレクトリ内の Python ファイル scraper.py を初期化し、次のコード スニペットを実行してすべてが正しく設定されていることをテストします。
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
ターミナルで次のコマンドを実行すると、上記のファイル コードを実行できます。
pip install requests beautifulsoup4 selenium
上記のコードがエラーなく実行されると、ブラウザ インターフェイスが起動し、以下に示すデモ ページの URL が開きます。
Selenium は HTML を抽出し、ページ タイトルを出力します。次のような出力が表示されます -
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
これにより、Selenium を使用できることが確認されます。すべての要件がインストールされ、使用できる状態になったら、デモ ページのコンテンツへのアクセスを開始できます。
最初のステップは、ページの初期コンテンツを取得することです。これにより、ページの HTML のベースライン スナップショットが得られます。これは、接続を確認し、スクレイピング プロセスの有効な開始点を確保するのに役立ちます。
Python の Requests ライブラリを使用して GET リクエストを送信することで、ページ URL の HTML コンテンツを取得します。コードは次のとおりです:
python scraper.py
上記のコードは、最初の 12 個の商品のデータを含む生の HTML を出力します。
この HTML のクイック プレビューにより、リクエストが成功し、有効なデータを操作していることが確認されます。
残りの製品にアクセスするには、利用可能な製品がなくなるまで、ページ上の [さらに読み込む] ボタンをプログラム的にクリックする必要があります。この操作には JavaScript が含まれるため、Selenium を使用してボタンのクリックをシミュレートします。
コードを記述する前に、ページを調べて以下を見つけてみましょう。
さらに多くの製品を読み込むことですべての製品を取得し、次のコードを実行することでより大きなデータセットを取得できます。
Load More Button Challenge to Learn Web Scraping - ScrapingCourse.com
このコードはブラウザを開き、ページに移動し、「さらに読み込む」ボタンと対話します。更新された HTML には、より多くの商品データが含まれており、抽出されます。
このコードを実行するたびに Selenium でブラウザを開いたくない場合は、ヘッドレス ブラウザ機能も提供されます。ヘッドレス ブラウザには、実際の Web ブラウザのすべての機能が備わっていますが、グラフィカル ユーザー インターフェイス (GUI) はありません。
Selenium で Chrome のヘッドレス モードを有効にするには、次のように ChromeOptions オブジェクトを定義し、それを WebDriver Chrome コンストラクターに渡します。
import requests # URL of the demo page with products url = "https://www.scrapingcourse.com/button-click" # Send a GET request to the URL response = requests.get(url) # Check if the request was successful if response.status_code == 200: html_content = response.text print(html_content) # Optional: Preview the HTML else: print(f"Failed to retrieve content: {response.status_code}")
上記のコードを実行すると、Selenium はヘッドレス Chrome インスタンスを起動するため、Chrome ウィンドウは表示されなくなります。これは、サーバー上でスクレイピング スクリプトを実行するときに GUI でリソースを無駄にしたくない運用環境に最適です。
これで、完全な HTML コンテンツが取得され、各製品に関する特定の詳細が抽出されます。
このステップでは、BeautifulSoup を使用して HTML を解析し、製品要素を識別します。次に、各製品の名前、価格、リンクなどの主要な詳細を抽出します。
pip install requests beautifulsoup4 selenium
出力には、次のように、名前、画像 URL、価格、製品ページのリンクを含む製品詳細の構造化されたリストが表示されます。
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
上記のコードは、生の HTML データを構造化された形式に編成して、作業を容易にし、さらなる処理のために出力データを準備します。
抽出したデータを CSV ファイルに整理できるようになりました。これにより、分析や共有が容易になります。 Python の CSV モジュールはこれに役立ちます。
python scraper.py
上記のコードは、必要なすべての製品詳細を含む新しい CSV ファイルを作成します。
概要の完全なコードは次のとおりです:
Load More Button Challenge to Learn Web Scraping - ScrapingCourse.com
上記のコードは、次のような products.csv を作成します。
import requests # URL of the demo page with products url = "https://www.scrapingcourse.com/button-click" # Send a GET request to the URL response = requests.get(url) # Check if the request was successful if response.status_code == 200: html_content = response.text print(html_content) # Optional: Preview the HTML else: print(f"Failed to retrieve content: {response.status_code}")
ここで、最も価格の高い製品の上位 5 つを特定し、それらの個別のページから追加データ (製品の説明や SKU コードなど) を抽出するとします。次のコードを使用してこれを行うことができます:
from selenium import webdriver from selenium.webdriver.common.by import By import time # Set up the WebDriver (make sure you have the appropriate driver installed, e.g., ChromeDriver) driver = webdriver.Chrome() # Open the page driver.get("https://www.scrapingcourse.com/button-click") # Loop to click the "Load More" button until there are no more products while True: try: # Find the "Load more" button by its ID and click it load_more_button = driver.find_element(By.ID, "load-more-btn") load_more_button.click() # Wait for the content to load (adjust time as necessary) time.sleep(2) except Exception as e: # If no "Load More" button is found (end of products), break out of the loop print("No more products to load.") break # Get the updated page content after all products are loaded html_content = driver.page_source # Close the browser window driver.quit()
概要の完全なコードは次のとおりです:
from selenium import webdriver from selenium.webdriver.common.by import By import time # instantiate a Chrome options object options = webdriver.ChromeOptions() # set the options to use Chrome in headless mode options.add_argument("--headless=new") # initialize an instance of the Chrome driver (browser) in headless mode driver = webdriver.Chrome(options=options) ...
このコードは、製品を価格の降順に並べ替えます。次に、価格の最も高い上位 5 つの製品について、スクリプトは製品ページを開き、BeautifulSoup を使用して製品の説明と SKU を抽出します。
上記のコードの出力は次のようになります:
from bs4 import BeautifulSoup # Parse the page content with BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') # Extract product details products = [] # Find all product items in the grid product_items = soup.find_all('div', class_='product-item') for product in product_items: # Extract the product name name = product.find('span', class_='product-name').get_text(strip=True) # Extract the product price price = product.find('span', class_='product-price').get_text(strip=True) # Extract the product link link = product.find('a')['href'] # Extract the image URL image_url = product.find('img')['src'] # Create a dictionary with the product details products.append({ 'name': name, 'price': price, 'link': link, 'image_url': image_url }) # Print the extracted product details for product in products[:2]: print(f"Name: {product['name']}") print(f"Price: {product['price']}") print(f"Link: {product['link']}") print(f"Image URL: {product['image_url']}") print('-' * 30)
上記のコードは products.csv を更新し、次のような情報が含まれるようになります:
Name: Chaz Kangeroo Hoodie Price: Link: https://scrapingcourse.com/ecommerce/product/chaz-kangeroo-hoodie Image URL: https://scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh01-gray_main.jpg ------------------------------ Name: Teton Pullover Hoodie Price: Link: https://scrapingcourse.com/ecommerce/product/teton-pullover-hoodie Image URL: https://scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh02-black_main.jpg ------------------------------ …
無限スクロールや「さらに読み込む」ボタンを使用してページをスクレイピングするのは難しいように思えるかもしれませんが、Requests、Selenium、BeautifulSoup などのツールを使用するとプロセスが簡素化されます。
このチュートリアルでは、デモ ページから製品データを取得して処理し、迅速かつ簡単にアクセスできるように構造化された形式で保存する方法を説明しました。
すべてのコード スニペットはここでご覧ください。
以上がもっと読み込む ボタンを使用して無限スクロール ページをスクレイピングする: ステップバイステップ ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。