在網頁抓取領域,從使用無限滾動的網頁中存取和提取資料對於開發人員來說可能是一個挑戰。許多網站使用這種技術來動態載入更多內容,很難一次抓取所有可用資料。一個好的解決方案涉及模擬使用者操作,例如點擊“加載更多”按鈕以顯示其他內容。
本教程將深入研究從無限滾動的頁面中抓取產品數據,利用Zenrows 開源網絡抓取工具,您將構建一個抓取機器人來訪問網頁內容,並且您將使用Zenrows 生成更多產品通過點擊“加載更多”按鈕,模擬無限滾動頁面。
要學習本教程,您需要具備以下條件:
註冊 Zenrows 帳戶並滿足先決條件後,下一步就是從網頁訪問內容;在本教程中,您將使用此頁面 https://www.scrapingcourse.com/button-click。
您還將使用 ZenRows SDK 來抓取動態頁面並處理各種渲染和反機器人措施。讓我們開始吧:
安裝所需的庫:
打開您首選 IDE 的終端機並運行程式碼以安裝 ZenRows Python SDK。
pip install zenrows python-dotenv
前往儀表板並複製螢幕右上角的 API 金鑰,如下圖所示。
接下來,建立頁面 app.py 和 .env,然後將以下程式碼新增至您的 app.py 檔案。並將您的 API 金鑰新增至 .env 檔案中的變數 API_KEY。
# Import ZenRows SDK from zenrows import ZenRowsClient from dotenv import load_dotenv import os # Load environment variables load_dotenv() # Initialize ZenRows client with your API key client = ZenRowsClient(os.getenv("API_KEY")) # URL of the page you want to scrape url = "https://www.scrapingcourse.com/button-click" # Set up initial parameters for JavaScript rendering and interaction base_params = { "js_render": "true", "json_response": "true", "premium_proxy": "true", "markdown_response": "true" }
上面的程式碼使用您的 API 金鑰啟動 Zenrow SDK。它為您要抓取的網頁設定 URL 變量,並為必要的參數建立 base_params 變數。您可以使用以下指令執行抓取工具:
python app.py
這將為您提供僅包含目前頁面上的產品的頁面的 HTML 表示。
.
您隨時可以更進一步。
為了增強您的抓取工具,您可以實現額外的參數來與網頁底部的「載入更多」按鈕互動並載入更多產品。
首先修改導入以包含必要的套件並添加用於過濾產品響應的 parse_products 函數:
pip install zenrows python-dotenv
接下來,建立一個 while 循環,不斷從多個頁面中抓取產品訊息,直到達到指定的限制 (max_products)。將本教學的限制設為 50:
# Import ZenRows SDK from zenrows import ZenRowsClient from dotenv import load_dotenv import os # Load environment variables load_dotenv() # Initialize ZenRows client with your API key client = ZenRowsClient(os.getenv("API_KEY")) # URL of the page you want to scrape url = "https://www.scrapingcourse.com/button-click" # Set up initial parameters for JavaScript rendering and interaction base_params = { "js_render": "true", "json_response": "true", "premium_proxy": "true", "markdown_response": "true" }
此循環將透過模擬點擊「載入更多」按鈕來繼續報廢產品,直到達到指定的限制。
解析產品資訊
最後,您可以解析上一個步驟中抓取的產品資訊。對於每個產品,提取產品名稱、圖像連結、價格和產品頁面 URL。您也可以計算所有產品的總價並列印結果,如下所示:
python app.py
如果您希望將回應解析為匯出的 CSV 文件,在接下來的幾個步驟中,您將獲取已抓取的產品資訊並了解如何將其匯出為 CSV 文件。
首先,您需要使用Python內建的CSV模組來保存產品資料。 在本例中,每個產品都有四個主要屬性:名稱、image_link、價格和product_url。
您可以將它們用作 CSV 的標題,循環瀏覽已抓取產品的列表,然後將每個產品作為一行寫入 CSV 檔案中。
import re import json import time def parse_products(response_json): try: data = json.loads(response_json) md_content = data.get('md', '') pattern = r'\[!\[([^\]]+)\]\(([^\)]+)\)\*\n([^\\n]+)\*\n\*\n$(\d+)\]\(([^\)]+)\)' matches = re.findall(pattern, md_content) products = [] for match in matches: product = { 'name': match[0], 'image_link': match[1], 'price': int(match[3]), 'product_url': match[4] } products.append(product) return products except json.JSONDecodeError: print("Error: Unable to parse JSON response") print("Response content:", response_json[:500]) return [] except Exception as e: print(f"Error parsing products: {str(e)}") return [] # Zenrow SDK code here
現在,抓取資料後,只需呼叫 save_to_csv(all_products) 函數即可將資料儲存在名為 products.csv 的 CSV 檔案中。
抓取過程完成後,執行指令會自動將資料儲存到 CSV 檔案。
# Zenrow SDK code goes here max_products = 50 all_products = [] page = 1 while len(all_products) < max_products: print(f"Scraping page {page}...") # Update parameters for each request params = base_params.copy() js_instructions = [{"click": "#load-more-btn"} for _ in range(page)] js_instructions.append({"wait": 5000}) params["js_instructions"] = json.dumps(js_instructions) try: # Send the GET request to ZenRows response = client.get(url, params=params) # Parse the response JSON new_products = parse_products(response.text) if not new_products: print("No more products found. Stopping.") break all_products.extend(new_products) print(f"Found {len(new_products)} products on this page.") print(f"Total products so far: {len(all_products)}") page += 1 # Add a delay to avoid overwhelming the server time.sleep(2) except Exception as e: print(f"Error occurred: {str(e)}") break
現在您已經擁有了結構化格式的所有產品,您可以更進一步確定 5 個價格最高的產品,並且您必須訪問每個產品頁面以提取額外的詳細信息,例如產品描述和 SKU代碼。
依價格將產品排序:使用Python的sorted()函數,可以將產品清單依價格降序排序,並擷取前5個產品。
您需要使用 requests.get() 函數存取每個頁面以取得每個頁面的產品資料。從回應中,您可以提取產品描述和 SKU 代碼。
您也可以更新上一步驟的 csv 檔案以包含其他詳細資訊。
這是實現這目標的程式碼:
# Updated Params and while loop code goes here # Calculate the total price of all products total_sum = sum(product['price'] for product in all_products) print("\nAll products:") for product in all_products: print(product) # Print the total sum of the product prices print(f"\nTotal number of products: {len(all_products)}") print(f"Total sum of product prices: ${total_sum}")
現在,抓取後,您現在可以辨識出價格最高的產品:
pip install zenrows python-dotenv
檢索附加資訊後,您可以修改 CSV 檔案或建立包含這些詳細資訊的新檔案。
完整的 app.py 檔案應如下所示。
# Import ZenRows SDK from zenrows import ZenRowsClient from dotenv import load_dotenv import os # Load environment variables load_dotenv() # Initialize ZenRows client with your API key client = ZenRowsClient(os.getenv("API_KEY")) # URL of the page you want to scrape url = "https://www.scrapingcourse.com/button-click" # Set up initial parameters for JavaScript rendering and interaction base_params = { "js_render": "true", "json_response": "true", "premium_proxy": "true", "markdown_response": "true" }
這是成功回應的樣子。
python app.py
查看 GitHub 上的完整程式碼庫。
在本教程中,您學習如何使用「載入更多」按鈕從無限滾動的網頁中抓取產品。透過遵循概述的步驟,您可以使用 ZenRows 提取有價值的產品資訊並增強您的抓取技術。
要了解有關如何使用 Zenrow 網頁抓取工具的更多信息,請查看我們部落格上的以下文章。
以上是如何使用 ZenRows Web Scraper 為無限滾動網站建立產品抓取器的詳細內容。更多資訊請關注PHP中文網其他相關文章!