Python으로 Walmart 데이터 스크래핑 가이드

댓글: 0

웹 스크래핑은 분석, 연구, 비즈니스 인텔리전스 등 다양한 목적을 위해 웹 사이트에서 데이터를 추출하는 강력한 방법입니다. 이 튜토리얼에서는 주요 전략과 기법을 중심으로 Python에서 Walmart 제품 정보를 스크래핑하는 데 도움이 됩니다. 월마트 스크래핑은 월마트 사이트의 여러 페이지에서 이름, 가격 또는 리뷰와 같은 제품의 세부 정보를 마이닝할 수 있는 예제를 제공합니다.

이 가이드에서는 HTTP 요청을 위한 요청 라이브러리와 HTML 콘텐츠 파싱을 위한 lxml 라이브러리를 사용합니다.

환경 설정

시작하기 전에 컴퓨터에 Python이 설치되어 있는지 확인하세요. pip를 사용하여 필요한 라이브러리를 설치할 수 있습니다:

pip install requests
pip install  lxml
pip install urllib3

다음으로 필요한 라이브러리를 가져와 보겠습니다:

  • requests: 웹 페이지 검색을 위한 HTTP 요청용;
  • lxml: HTML 콘텐츠 구문 분석용;
  • csv: 추출된 데이터를 CSV 파일에 쓰기 위한 용도;
  • random: 무작위 프록시 및 사용자-에이전트 문자열 선택용.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

제품 URL 정의

스크랩할 Walmart 제품 URL 목록입니다.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

사용자-에이전트 문자열 및 프록시

웹사이트를 스크래핑하려면 실제 브라우저의 요청을 모방하기 위해 올바른 헤더, 특히 사용자-에이전트 헤더를 사용하는 것이 매우 중요합니다. 또한 사이트 소유자가 로터리 프록시 서버를 사용하여 설정한 봇 방지 조치로 인해 제한되는 것을 피할 수 있습니다. 다음은 IP 주소를 기반으로 인증이 필요한 프록시 서버를 통합하는 방법에 대한 설명과 함께 사용자-에이전트 문자열의 예시입니다.

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

헤더 요청

브라우저 요청을 모방하고 탐지를 피하도록 헤더를 설정합니다.

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

데이터 저장소 초기화

제품 세부 정보를 저장할 빈 목록을 생성합니다.

product_details = []

URL 페이지의 열거 프로세스는 다음과 같이 작동합니다: 각 URL 페이지에 대해 무작위로 선택된 사용자 에이전트와 프록시를 사용하여 GET 요청이 전송됩니다. HTML 응답을 받으면 이를 파싱하여 제품 이름, 가격, 리뷰 등의 세부 정보를 추출합니다. 추출된 데이터는 사전으로 저장되며, 이후 이전에 생성된 목록에 추가됩니다.

for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # URL로 HTTP GET 요청을 보냅니다.
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # lxml을 사용하여 HTML 콘텐츠 구문 분석
   parser = html.fromstring(response.text)
   # 제품 제목 추출
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # 추출 제품 가격
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # 리뷰 세부 정보 추출
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # 추출된 세부 정보를 사전에 저장
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # 목록에 제품 세부 정보 추가
   product_details.append(product_detail)

제목:

1.png

가격:

2.png

세부 정보 검토:

3.png

데이터를 CSV로 저장

  1. 쓰기를 위해 새 CSV 파일을 엽니다.
  2. CSV 파일의 필드 이름(열)을 정의합니다.
  3. CSV 파일에 사전을 쓰기 위해 csv.DictWriter 개체를 만듭니다.
  4. 헤더 행을 CSV 파일에 씁니다.
  5. 제품_details 목록을 반복하여 각 제품 사전을 CSV 파일에 행으로 씁니다.
with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

코드 완성:

다음은 이해를 돕기 위해 주석이 포함된 전체 코드입니다:

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# 스크랩할 제품 URL 목록
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# 익명성을 위한 무작위 사용자-에이전트 문자열
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# IP 로테이션을 위한 프록시 목록
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# 브라우저 요청을 모방하는 헤더
headers = {
   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
   'accept-language': 'en-IN,en;q=0.9',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Linux"',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'none',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
}

# 빈 목록을 초기화하여 제품 세부 정보를 저장합니다.
product_details = []

# 각 제품 URL을 반복해서 살펴보기
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # URL로 HTTP GET 요청을 보냅니다.
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # lxml을 사용하여 HTML 콘텐츠 구문 분석
   parser = html.fromstring(response.text)
   # 제품 제목 추출
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # 추출 제품 가격
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # 리뷰 세부 정보 추출
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # 추출된 세부 정보를 사전에 저장
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # 목록에 제품 세부 정보 추가
   product_details.append(product_detail)

# 추출한 데이터를 CSV 파일에 쓰기
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

이 튜토리얼에서는 Python 라이브러리를 활용하여 Walmart에서 제품 데이터를 스크랩하고 후속 분석을 위해 CSV 형식으로 저장하는 방법을 보여드립니다. 제공된 스크립트는 기본적이며 스크래핑 프로세스의 효율성을 높이기 위해 개선할 수 있는 기초를 제공합니다. 사람의 브라우징 패턴을 모방하기 위해 요청 사이에 무작위 지연을 도입하고, 탐지를 피하기 위해 사용자 에이전트 및 프록시 로테이션을 구현하고, 잠재적인 스크래핑 중단 또는 실패를 관리하기 위해 강력한 오류 처리 시스템을 개발하는 등의 개선이 이루어질 수 있습니다.

댓글:

0 댓글