如何使用 Python 抓取 eBay 数据

评论: 0

eBay 是一个知名的在线平台,它为注册用户提供各种产品的交易机会。在本指南中,我们将介绍如何使用 Python 从 eBay 列表中抓取数据。因此,我们将对从列表本身以及依次进入每个产品以获取更多详细信息所获得的详细信息感兴趣。

要求

要开始使用,请确保已安装以下 Python 库:

  • 请求:用于发出 HTTP 请求。
  • lxml:用于解析 HTML 内容。
  • Pandas用于将数据保存到 CSV 文件。

使用:


pip install requests lxml pandas

了解用于分页的 eBay URL 结构

在 eBay 上搜索产品时,可以修改每个页面的 URL 以浏览分页结果。例如

  • 第 1 页: https://www.ebay.com/sch/i.html?_nkw=laptop
  • 第 2 页:https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

_pgn 参数用于浏览多页列表,以便检索大量数据。让我们开始搜索过程。

步骤 1:向 eBay 发送请求

首先,我们将设置头信息来模拟真实的浏览器请求,这有助于避免被 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)

步骤 2:解析列表页面

在列表页面,我们将提取单个产品的 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

步骤 3:搜索产品数据

有了产品 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}")

第 4 步:将数据保存为 CSV 文件

收集数据后,我们可以使用 Pandas 将其保存为 CSV 文件。


import pandas as pd

# 将数据转换为 DataFrame
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 采用速率限制来防止请求过多。以下是几种避免被发现的方法:

  • 使用代理服务器:轮流使用不同的 IP 地址。
  • 调整请求间隔:执行请求之间的延迟。
  • 随机化用户代理:改变用户代理字符串以避免被检测到。

通过遵循这些最佳实践,您可以最大限度地降低被拦截的风险,并继续高效地搜索数据。

完整代码

以下是搜索 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 评论