동적 웹 페이지에서 데이터를 로드하려고 할 때 스크래퍼가 멈췄습니까? 무한 스크롤이나 성가신 "더 보기" 버튼 때문에 좌절하셨나요?
당신은 혼자가 아닙니다. 오늘날 많은 웹사이트에서는 사용자 경험을 개선하기 위해 이러한 디자인을 구현하지만 웹 스크레이퍼에게는 어려울 수 있습니다.
이 튜토리얼은 더 보기 버튼을 사용하여 데모 페이지를 스크랩하는 초보자 친화적인 연습을 안내합니다. 대상 웹페이지의 모습은 다음과 같습니다.
마지막에는 다음 방법을 배우게 됩니다.
들어가자!
들어가기 전에 다음 전제 조건을 확인하세요.
필수 라이브러리:
터미널에서 다음 명령을 사용하여 이러한 라이브러리를 설치할 수 있습니다.
pip install requests beautifulsoup4 selenium
Selenium을 사용하기 전에 브라우저에 맞는 웹 드라이버를 설치해야 합니다. 이 튜토리얼에서는 Google Chrome과 ChromeDriver를 사용합니다. 그러나 Firefox나 Edge와 같은 다른 브라우저에서도 비슷한 단계를 따를 수 있습니다.
웹 드라이버 설치
Google Chrome을 열고 도움말 > Chrome 정보점 3개 메뉴에서 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의 요청 라이브러리를 사용하여 GET 요청을 보내 페이지 URL의 HTML 콘텐츠를 검색합니다. 코드는 다음과 같습니다.
python scraper.py
위 코드는 처음 12개 제품에 대한 데이터가 포함된 원시 HTML을 출력합니다.
HTML의 빠른 미리보기를 통해 요청이 성공했는지, 유효한 데이터로 작업하고 있는지 확인할 수 있습니다.
나머지 제품에 액세스하려면 더 이상 사용할 수 있는 제품이 없을 때까지 페이지에서 '더 보기' 버튼을 프로그래밍 방식으로 클릭해야 합니다. 이 상호 작용에는 JavaScript가 포함되므로 Selenium을 사용하여 버튼 클릭을 시뮬레이션합니다.
코드를 작성하기 전에 페이지를 검사하여 다음을 찾으세요.
더 많은 제품을 로드하면 모든 제품을 얻을 수 있으며, 다음 코드를 실행하면 더 큰 데이터세트를 얻을 수 있습니다.
Load More Button Challenge to Learn Web Scraping - ScrapingCourse.com
이 코드는 브라우저를 열고 페이지로 이동하며 '더 보기' 버튼과 상호작용합니다. 이제 더 많은 제품 데이터가 포함된 업데이트된 HTML이 추출됩니다.
이 코드를 실행할 때마다 Selenium이 브라우저를 열지 않도록 하려면 헤드리스 브라우저 기능도 제공됩니다. 헤드리스 브라우저는 실제 웹 브라우저의 모든 기능을 갖추고 있지만 그래픽 사용자 인터페이스(GUI)는 없습니다.
다음과 같이 ChromeOptions 개체를 정의하고 이를 WebDriver Chrome 생성자에 전달하여 Selenium에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!