eBay는 등록된 사용자들에게 다양한 상품에 대한 거래 기회를 제공하는 잘 알려진 온라인 플랫폼입니다. 이 가이드에서는 Python을 사용하여 eBay 리스팅에서 데이터를 스크랩하는 방법을 설명합니다. 따라서 목록 자체에서 얻을 수 있는 세부 정보뿐만 아니라 각 제품을 차례로 이동하여 더 자세한 정보를 얻을 수 있는 세부 정보에 관심을 가질 것입니다.
시작하려면 다음 Python 라이브러리가 설치되어 있는지 확인하세요:
다음을 사용하여 이러한 라이브러리를 설치합니다:
pip install requests lxml pandas
eBay에서 제품을 검색할 때 각 페이지 URL을 수정하여 페이지 매김된 결과를 탐색할 수 있습니다. 예를 들어
_pgn 매개변수는 여러 페이지의 목록을 탐색하는 데 사용되므로 광범위한 데이터를 검색할 수 있습니다. 스크래핑 프로세스를 시작해 보겠습니다.
먼저 실제 브라우저 요청을 모방하도록 헤더를 설정하여 eBay의 봇 방지 조치에 의한 탐지 및 잠재적 차단을 피할 수 있도록 합니다. 그런 다음 리스팅 페이지에 요청을 보내 각 제품에 대한 링크를 수집합니다.
import requests
from lxml.html import fromstring
# 헤더를 정의하여 실제 브라우저를 시뮬레이션합니다.
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',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'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',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
# 검색 쿼리에 대한 요청 매개변수
params = {
'_nkw': 'laptop',
}
# eBay 리스팅 페이지로 요청 보내기
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)
리스팅 페이지에서 개별 제품의 URL을 추출합니다. 이를 통해 각 제품 페이지를 방문하여 제품 제목, 가격 등과 같은 구체적인 세부 정보를 수집할 수 있습니다.
# 리스팅 페이지를 구문 분석하여 제품 링크 추출
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')
# 발견된 링크의 샘플을 출력합니다.
print("Product Links:", links[:5]) # Display the first five product links
제품 URL이 준비되면 각 제품 페이지를 방문하여 다음 세부 정보를 추출합니다:
다음으로 각 링크를 반복하고 XPath 표현식을 사용하여 제품 페이지에서 필요한 정보를 찾습니다.
product_data = []
for url in links:
# 제품 페이지로 요청 보내기
product_page_response = requests.get(url, headers=headers)
product_parser = fromstring(product_page_response.text)
# XPath를 사용하여 데이터 추출
try:
product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
# 사전에서 데이터 저장
product_info = {
'Title': product_title,
'Price': price,
'Shipping Cost': shipping_cost,
'Condition': product_condition,
'Available Quantity': available_quantity,
'Sold Quantity': sold_quantity,
'Payment Options': payment_options,
'Return Policy': return_policy,
}
product_data.append(product_info)
except IndexError as e:
print(f"An error occurred: {e}")
데이터를 수집한 후 Pandas를 사용하여 CSV 파일로 저장할 수 있습니다.
import pandas as pd
# 데이터를 데이터프레임으로 변환
df = pd.DataFrame(product_data)
# CSV로 저장
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")
eBay는 과도한 요청을 방지하기 위해 비율 제한을 사용합니다. 다음은 감지를 피하는 몇 가지 방법입니다:
이러한 모범 사례를 따르면 차단될 위험을 최소화하고 효율적으로 데이터를 스크랩할 수 있습니다.
다음은 eBay 데이터를 스크랩하여 CSV 파일로 저장하는 전체 코드입니다:
import requests
import random
from lxml.html import fromstring
import pandas as pd
useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']
# 요청에 대한 헤더 정의
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',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'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',
'user-agent': random.choice(useragents),
}
# 검색 쿼리 매개변수
params = {'_nkw': 'laptop'}
proxies = {
'http': 'IP:PORT',
'https': 'IP:PORT'
}
# 목록 페이지 가져오기
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')
# 제품 데이터 추출
product_data = []
for url in links:
product_page_response = requests.get(url, headers=headers, proxies=proxies)
product_parser = fromstring(product_page_response.text)
try:
product_info = {
'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
}
product_data.append(product_info)
except IndexError:
continue
# CSV로 저장
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")
Python으로 eBay를 스크래핑하면 제품, 가격, 트렌드에 대한 데이터를 효율적으로 수집할 수 있습니다. 이 가이드에서는 목록 스크래핑, 페이지 매김 처리, 헤더 설정, 탐지를 피하기 위한 프록시 사용에 대해 설명했습니다. 책임 있는 요청 간격과 프록시 로테이션을 사용하여 eBay의 서비스 약관을 준수하는 것을 잊지 마세요. 이제 이러한 도구를 사용하면 eBay 데이터를 쉽게 수집하고 분석하여 시장 인사이트를 얻을 수 있습니다. 행복한 스크래핑이 되시길 바랍니다!
댓글: 0