返回博客
指南
Raluca PenciucLast updated on Mar 31, 20263 min read

如何抓取亚马逊产品数据:最佳实践与工具的全面指南

如何抓取亚马逊产品数据:最佳实践与工具的全面指南

作为全球电子商务巨头,亚马逊是一个蕴藏着海量关键数据的宝库,其中包括产品描述、客户评论、定价结构等复杂细节。在当今商业环境中,有效利用这些信息至关重要。无论您的目标是评估第三方卖家所售产品的表现、分析竞争对手,还是开展全面的市场调研,使用亚马逊爬虫Amazon Scraper)等专业网页抓取工具都是必不可少的。

然而,抓取亚马逊数据的过程具有独特性,伴随着一系列挑战和复杂性。本深度指南旨在全面概述构建一个功能完备的亚马逊网页抓取工具所需的每个阶段,助您有效利用这些关键数据。它将带您了解针对亚马逊复杂架构量身定制的具体注意事项和技术,帮助您驾驭这一强大平台的细微差别。

从理解网页抓取的法律与伦理层面,到提供创建定制化抓取工具的实用操作步骤,本指南将为您配备必要的知识和工具,助您将亚马逊海量的数据宝库转化为对业务有实际价值的洞察。

准备抓取亚马逊数据

抓取亚马逊数据是一项复杂的任务,需要一套工具和战略性的方法。以下是分步指南,帮助您为抓取亚马逊产品数据做好系统准备。

步骤 1:安装 Python

Python 是网络爬虫的核心编程语言。请确保已安装 Python 3.8 或更高版本。若未安装,请访问 python.org 下载并安装最新版本的 Python

步骤 2:创建项目文件夹

创建一个专用文件夹,用于存储亚马逊网页抓取的代码文件。合理整理文件将使您的工作流程更加顺畅。

步骤 3:设置虚拟环境

创建虚拟环境是 Python 开发中的最佳实践。它允许您管理项目特有的依赖项,确保与其他项目不会发生冲突。

对于 macOS 和 Linux 用户,请执行以下命令来创建并激活虚拟环境:

$ python3 -m venv .env
$ source .env/bin/activate

对于 Windows 用户,命令略有不同:

c:\amazon>python -m venv .env
c:\amazon>.env\scripts\activate

第 4 步:安装所需的 Python 包

网络爬虫的两个主要步骤是获取 HTML 并对其进行解析以提取相关数据。

  • Requests 库:一款常用的第三方 Python 库,用于发送 HTTP 请求。它提供了一个与 Web 服务器通信的简单接口,但返回的 HTML 格式为字符串,不易进行查询。
  • Beautiful Soup:该 Python 库可协助从 HTML 和 XML 文件中提取数据,支持搜索标签、属性或文本等特定元素。

使用以下命令安装这些库:

$ python3 -m pip install requests beautifulsoup4

Windows 用户注意:请将 python3 替换为 python。

第 5 步:基础抓取设置

创建一个名为 amazon.py 的文件,并插入代码以向特定的亚马逊商品页面发送请求。例如:

import requests
url = 'https://www.amazon.com/Robux-Roblox-Online-Game-Code/dp/B07RZ74VLR/'
response = requests.get(url)
print(response.text)

运行此代码可能会导致亚马逊拦截请求并返回 503 错误,因为它识别出该请求并非通过浏览器发起。

第 6 步:绕过封锁机制

亚马逊通常会阻止抓取尝试,并返回以 400 或 500 开头的错误代码。为解决此问题,您可以通过发送自定义标头(包括 user-agent,有时还包括 accept-language)来模拟浏览器行为。

要查找浏览器的 user-agent,请按 F12 键,打开“网络”选项卡,刷新页面,然后查看“请求头”部分。

以下是一个自定义标头的示例字典:

custom_headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/602.18 (KHTML, like Gecko) Chrome/54.0.3129.163 Safari/602.6 Edge/9.50428',
    'accept-language': 'en-US,en;q=0.9',
}

请通过 get 方法以如下方式发送此字典:

response = requests.get(url, headers=custom_headers)

这通常能获取包含产品详细信息的所需 HTML。发送尽可能多的头部信息可最大限度减少对 JavaScript 渲染的需求。如果必须进行渲染,可以使用 PlaywrightSelenium 等工具。

抓取亚马逊产品数据

在从亚马逊提取产品信息时,通常会遇到两种包含关键数据的页面:分类页面和产品详情页面。这两者在抓取所需信息方面都起着至关重要的作用,因此掌握如何浏览这两种页面至关重要。

分类页面

以 URL https://www.amazon.com/s?i=specialty-aps&bbn=16225007011&rh=n%3A16225007011%2Cn%3A193870011 为例

在分类页面上,你会看到以下基本信息:

  • 产品标题:产品的名称。
  • 产品图片:商品的视觉展示。
  • 产品评分:用户的评分和反馈。
  • 商品价格:当前售价。
  • 产品链接:通往单个产品页面的链接。

若需查看更详细的信息,例如产品描述或规格,您需要进入单个产品的详情页面。

深入了解产品详情页

点击产品链接(例如 https://www.amazon.com/Robux-Roblox-Online-Game-Code/dp/B07RZ74VLR/),您将进入一个详细信息的宝库。要查看这些信息的结构,您可以使用 Chrome 等现代浏览器。

检查 HTML 元素

右键点击产品标题,选择“检查”。您会发现产品标题的 HTML 标记已被高亮显示。具体来说,它包含在 span 标签内,其 id 属性定义为“productTitle”。

同样的方法也可用于查找其他关键元素的标记:

  • 价格:右键点击价格,选择“检查”。价格中的整数部分位于类名为“a-price-whole”的 span 标签内,而分位数则存储在另一个类名为“a-price-fraction”的 span 标签中。
  • 评分、图片和描述:利用相同的检查功能定位这些关键组件,它们各自被包裹在特定的标签和类中。

从亚马逊抓取产品数据的过程可以分解为具体步骤,每个步骤针对产品信息的特定方面。通过使用 requests 和 BeautifulSoup 等 Python 库,我们可以访问、定位并抓取所需的详细信息。 以下是操作的详细指南:

1. 发起请求

首先向商品页面的 URL 发送一个带有自定义头部的 GET 请求:

response = requests.get(url, headers=custom_headers)
soup = BeautifulSoup(response.text, 'lxml')

我们使用 BeautifulSoup 解析 HTML 内容,这有助于通过 CSS 选择器查询特定信息。 2. 定位并抓取产品名称

通过 span 元素内的唯一 id productTitle 识别产品标题:

title_element = soup.select_one('#productTitle')
title = title_element.text.strip()

3. 定位并抓取产品评分

要抓取产品评分,需访问 #acrPopover 选择器的 title 属性:

rating_element = soup.select_one('#acrPopover')
rating_text = rating_element.attrs.get('title')
rating = rating_text.replace('out of 5 stars', '')

4. 定位并抓取产品价格

使用 #price_inside_buybox 选择器提取产品价格:

price_element = soup.select_one('#price_inside_buybox')
print(price_element.text)

5. 定位并抓取产品图片

使用 #landingImage 选择器获取默认图片 URL:

image_element = soup.select_one('#landingImage')
image = image_element.attrs.get('src')

6. 定位并抓取商品描述

使用 #productDescription 选择器获取商品描述:

description_element = soup.select_one('#productDescription')
print(description_element.text)

7. 定位并抓取商品评论

评论的抓取更为复杂,因为一个产品可能有多个评论。单条评论可能包含作者、评分、标题、内容、日期和验证状态等多种信息。

收集评论

使用 div.review 选择器识别并收集所有评论:

review_elements = soup.select("div.review")
scraped_reviews = []

for review in review_elements:
   # Extracting specific review details...

提取评论详情

每条评论均可拆解为具体细节:

  • 作者:span.a-profile-name
  • 评分:i.review-rating
  • 标题:a.review-title > span:not([class])
  • 内容:span.review-text
  • 日期:span.review-date
  • 已验证状态:span.a-size-mini

可以通过各自的 CSS 选择器选择这些元素,然后使用与前几个步骤类似的方法进行提取。

整合评论数据

创建一个包含已提取评论详情的对象,并将其追加到评论数组中:

r = {
       "author": r_author,
       "rating": r_rating,
       "title": r_title,
       "content": r_content,
       "date": r_date,
       "verified": r_verified
}

scraped_reviews.append(r)

抓取亚马逊产品数据是一项多方面的任务,需要采用精确的方法来定位网页结构中的特定元素。通过利用现代网页抓取工具的功能,可以成功提取详细的产品信息。

处理商品列表

要抓取详细的产品信息,通常需从产品列表或分类页面开始,这些页面通常以网格或列表形式展示产品。

识别商品链接

在分类页面上,您可能会注意到每个商品都被包含在一个带有特定属性 [data-asin] 的 div 标签中。指向单个商品的链接通常位于该 div 内的 h2 标签中。

这些链接对应的 CSS 选择器为:

[data-asin] h2 a

解析并访问链接

您可以使用 BeautifulSoup 选取这些链接并提取其 href 属性。请注意,这些链接可能是相对路径,因此建议使用 urljoin 方法将其转换为绝对 URL。

from urllib.parse import urljoin

def parse_listing(listing_url):
    # Your code to fetch and parse the page goes here...
    link_elements = soup_search.select("[data-asin] h2 a")
    page_data = []
    for link in link_elements:
        full_url = urljoin(listing_url, link.attrs.get("href"))
        product_info = get_product_info(full_url)
        page_data.append(product_info)

处理分页

许多商品列表页面都采用了分页设计。您可以通过查找包含“Next”字样的链接来跳转到下一页。

next_page_el = soup.select_one('a:contains("Next")')
if next_page_el:
    next_page_url = next_page_el.attrs.get('href')
    next_page_url = urljoin(listing_url, next_page_url)

随后可使用该 URL 解析下一页,并持续循环直至不再有“Next”链接。

8. 将抓取的产品数据导出为 JSON 文件

抓取的产品数据被收集为列表中的字典。这种格式便于转换为 Pandas DataFrame,从而简化数据处理和导出。

以下是将抓取的数据转换为 DataFrame 并保存为 JSON 文件的方法:

import pandas as pd

df = pd.DataFrame(page_data)
df.to_json('baby.json', orient='records')

这将生成一个包含所有抓取商品信息的 JSON 文件。

本指南详细介绍了抓取商品列表的分步操作,包括分页导航和将结果导出为 JSON 文件。请务必根据您要抓取的网站的具体结构和要求调整这些方法。

完整代码

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import pandas as pd

custom_headers = {
    "accept-language": "en-US,en;q=0.9",
    "user-agent": "{user-agent}",
}

def get_response(url):
    """Make a GET request and return the response if successful."""
    with requests.Session() as session:
        session.headers.update(custom_headers)
        response = session.get(url)
        if response.status_code != 200:
            print(f"Error in getting webpage {url}")
            return None
        return response

def get_product_info(url):
    """Scrape product details from the given URL."""
    response = get_response(url)
    if response is None:
        return None

    # ... rest of the code ...

    return {
        "title": title,
        "price": price,
        "rating": rating,
        "image": image,
        "description": description,
        "url": url,
        "reviews": scraped_reviews,
    }

def parse_listing(listing_url):
    """Parse multiple product listings from the given URL."""
    page_data = []
    while listing_url:
        response = get_response(listing_url)
        if response is None:
            break

        soup_search = BeautifulSoup(response.text, "lxml")
        link_elements = soup_search.select("[data-asin] h2 a")

        for link in link_elements:
            full_url = urljoin(listing_url, link.attrs.get("href"))
            print(f"Scraping product from {full_url[:100]}", flush=True)
            product_info = get_product_info(full_url)
            if product_info:
                page_data.append(product_info)

        next_page_el = soup_search.select_one('a:contains("Next")')
        listing_url = urljoin(listing_url, next_page_el.attrs.get('href')) if next_page_el else None
        print(f'Scraping next page: {listing_url}', flush=True) if listing_url else None

    return page_data

def main():
    search_url = "{category url}"
    data = parse_listing(search_url)
    df = pd.DataFrame(data)
    df.to_json("amz.json", orient='records')

if __name__ == '__main__':
    main()

最佳实践与技巧

从亚马逊抓取数据并非如表面看起来那般简单。随着网络安全措施日益复杂,从这个庞大的电商平台中提取有价值的信息面临着诸多挑战。从速率限制到复杂的机器人检测算法,亚马逊始终确保其作为数据抓取目标的难度。

亚马逊数据抓取的挑战

  • 速率限制:亚马逊实施速率限制措施,以控制单个 IP 地址的请求数量。超过这些限制可能会导致您的 IP 被封禁。
  • 机器人检测算法:亚马逊部署了精密的算法,用于检查HTTP头部是否存在异常模式,从而判断请求是否来自自动化机器人。
  • 不断变化的页面布局:面对多种页面布局和不断变动的HTML结构,跟上界面持续变化的步伐需要高度的警惕性和适应能力。

应对挑战的策略

要克服这些障碍,必须采取战略性方法。以下是在抓取亚马逊数据时应遵循的一些关键最佳实践:

  • 使用真实的用户代理:让您的用户代理看起来真实可信,对于规避检测至关重要。以下是最常见的、能够模拟真实浏览器活动的用户代理
  • 保持指纹参数一致:包括亚马逊在内的许多平台都会利用传输控制协议(TCP)和IP指纹识别来识别爬虫。确保指纹参数保持一致,对于不被察觉至关重要。
  • 审慎调整爬取模式:设计成功的爬取模式需要模拟真实用户浏览网页的行为。这包括加入点击、滚动和鼠标移动等模拟人类行为的动作。设计出能反映人类交互模式的爬取模式,可以降低被检测到的概率。
  • 考虑代理管理:虽然原文未提及这一点,但使用代理可以增加一层匿名保护。通过将请求分散到不同的IP地址,您可以进一步规避检测。
  • 及时掌握亚马逊的政策与技术动态:亚马逊会频繁更新其安全措施和用户界面。定期重新审视并调整您的抓取方法以适应这些变化,将确保您的技术始终有效。

抓取亚马逊产品数据是一项复杂的任务,需要深入理解最佳实践,并不断适应亚马逊不断演变的策略。通过采用这些技术并时刻关注不断变化的环境,您可以获取分析或项目所需的宝贵数据。请记住,这只是抓取亚马逊数据所需内容的浅层概述,为实现您的具体目标,可能还需要进行额外的研究并使用其他工具。

轻松提取亚马逊数据的途径:利用亚马逊爬虫API

虽然上述手动抓取方法确实能提供有价值的洞察,但它们需要持续的监控、调整以及技术专长。对于寻求更简化且用户友好方法的人来说,Amazon Scraper API 提供了一种高效且专用的解决方案。

为何选择 Amazon Scraper API?

Amazon Scraper API 是一款专为应对亚马逊数据抓取复杂性而设计的专用工具。借助这款专业 API,您可以实现以下功能:

  • 多功能抓取选项:您可以抓取并解析各种类型的亚马逊页面。无论您是想从搜索、商品、优惠列表、问答、评论、畅销榜还是卖家页面中提取数据,该 API 都能满足您的需求。
  • 全球覆盖:可定位并获取遍布全球195个地区的本地化产品数据。如此广泛的覆盖范围,让您能够对不同市场和用户群体进行深入分析并获取洞察。
  • 高效数据获取:API 以简洁的 JSON 格式返回精准解析的结果。无需额外库或复杂配置,您获取的数据即可直接使用。
  • 满足高级需求的增强功能:体验专为提升效率而设计的特色功能,例如批量抓取能力和自动化任务。这些功能可简化抓取流程,让您在极少人工干预的情况下收集海量数据。
  • 合规性与易用性:与手动抓取不同,使用 Amazon Scraper API 等专用 API 通常能更好地确保符合法律法规及亚马逊的服务条款,使其成为更安全的数据提取方案。

结论

提取亚马逊产品数据可通过两种截然不同的方法实现,每种方法都针对不同的技能水平和需求。让我们来探讨这两种途径:

使用 Requests 和 Beautiful Soup 构建自定义爬虫

如果您热衷编程且具备相应技能,使用 Requests 和 Beautiful Soup 等流行的 Python 库创建自定义爬虫将是一次有趣的尝试。以下是该过程的简要概述:

发送自定义头部:通过定制 HTTP 头部,您可以模拟真实的浏览器请求并规避检测。

轮换 User-Agent:频繁更改 User-Agent 可以进一步掩盖您的抓取活动,使其看起来更像普通用户的交互行为。

代理轮换:利用代理池可将请求分散到多个 IP 地址,有助于绕过封禁或速率限制。

虽然这种方法提供了灵活性和控制权,但需要投入大量精力、时间以及持续监控。亚马逊不断变化的页面布局和严格的反机器人措施使得这条路充满挑战,需要不断地更新和微调。

Amazon Scraper API 提供的简化方案

对于寻求更友好且省时替代方案的用户,Amazon Scraper API 提供了一套量身定制的解决方案:

  • 预置功能:该 API 专为亚马逊设计,提供轻松抓取各类页面类型的功能。
  • 全面覆盖:该 API 能够针对全球众多地区的数据进行抓取,功能多样且覆盖广泛。
  • 操作简便:告别繁琐的手动编码,API 直接以便捷的 JSON 格式返回可直接使用的数据。

Amazon Scraper API 为亚马逊数据抓取提供了一个便捷的切入点,尤其适合缺乏技术资源或无暇开发和维护自定义抓取工具的个人或组织。

无论您选择使用 Requests 和 Beautiful Soup 编写自己的代码,还是选用专业的 Amazon Scraper API,您的决定都应与您的技能、资源、目标以及对法律和道德准则的遵守相一致。

  • 对于热衷挑战且精通技术的用户而言,编写自定义爬虫能提供更大的控制权和定制空间。
  • 对于那些优先考虑效率、易用性和合规性的用户,Amazon Scraper API 提供了一个现成的解决方案,能够简化整个流程。

两条路径都能带来有价值的洞察,但您的选择将对整个过程产生重大影响。了解每种方法的优势与局限,将有助于您做出最符合自身需求的明智决策。

常见问题

亚马逊允许数据抓取吗?

从亚马逊抓取公开信息通常不被视为违法,但必须遵守亚马逊的服务条款(ToS)。然而,这是一个复杂的法律领域。在开始之前,请咨询该领域的法律专业人士,以确保您的具体抓取活动是合法的。

数据抓取会被检测到吗?

是的,抓取行为确实可能被检测到。包括亚马逊在内的许多网站都使用反机器人软件,该软件会分析IP地址、浏览器参数和用户代理等多种因素。若检测到可疑活动,网站可能会弹出验证码(CAPTCHA)挑战;若持续被检测,您的IP地址可能会被封禁。

亚马逊会封禁 IP 地址吗?

是的,如果亚马逊将某个IP地址识别为可疑或违反其反机器人措施,可能会禁止或暂时封锁该IP地址。这是其安全协议中保护平台完整性的重要组成部分。

在抓取亚马逊数据时如何绕过验证码?

绕过验证码是数据抓取过程中的主要障碍之一,最好能完全避免。以下是减少遇到验证码的方法:

  • 使用可靠的代理服务器,并持续轮换 IP 地址。
  • 在请求之间加入随机延迟,以模拟人类行为。
  • 确保您的指纹参数保持一致。

值得注意的是,处理验证码可能涉及道德考量,建议遵循最佳实践。

如何爬取亚马逊?

亚马逊的复杂架构可通过专业的抓取工具进行导航。虽然您可以使用Scrapy等免费的网页抓取工具,但这些工具的配置和维护可能需要投入大量精力。

若想获得更轻松高效的解决方案,不妨考虑使用 Amazon Scraper API 这样的专用服务。此类工具专为应对亚马逊网站的复杂性而设计,能极大简化爬取流程。

关于作者
Raluca Penciuc, 全栈开发工程师 @ WebScrapingAPI
Raluca Penciuc全栈开发工程师

Raluca Penciuc 是 WebScrapingAPI 的全栈开发工程师,主要负责开发爬虫、优化规避机制,并探索可靠的方法以降低在目标网站上的被检测概率。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。