返回博客
指南
苏丘·丹2023年8月10日阅读时长:16分钟

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

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

准备抓取亚马逊数据

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

步骤 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)来模拟浏览器行为。

按下 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等工具。

抓取亚马逊产品数据

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

分类页面

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 元素内的唯一标识符 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:
   # 提取具体的评论详情...

提取评论详情

每篇评论都可以分解为具体的细节:

  • 作者: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):
    # 用于获取并解析页面的代码写在这里...
    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_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 解析下一页,并继续循环,直到不再有“下一页”链接为止。

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()

轻松提取亚马逊数据的方法:利用 Amazon Scraper API

从亚马逊抓取数据并非像表面看起来那么简单。随着网络安全日益复杂,从这个庞大的电子商务平台中提取有价值的信息面临着诸多挑战。从速率限制到复杂的机器人检测算法,亚马逊确保自己始终是数据抓取的一大难点。

亚马逊数据抓取面临的挑战

  • 速率限制:亚马逊实施速率限制措施,以控制来自单个 IP 地址的请求数量。超过这些限制可能会导致您的 IP 地址被封禁。
  • 机器人检测算法:我们采用了先进的算法来检查您的 HTTP 头部是否存在异常模式,以确认请求是否来自自动化机器人。
  • 不断变化的布局:面对多种页面布局和不断变化的HTML结构,要跟上界面日新月异的变化,需要保持警惕并具备适应能力。

应对挑战的策略

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

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

抓取亚马逊产品数据是一项复杂的任务,需要对最佳实践有深入的了解,并不断适应亚马逊不断变化的策略。通过掌握这些技术并密切关注瞬息万变的行业动态,您可以获取分析或项目所需的宝贵数据。请记住,这只是对亚马逊数据抓取所需内容的浅显概述,为实现您的具体目标,可能还需要进行进一步的研究并使用其他工具。

结论

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

为什么选择亚马逊爬虫API?

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

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

常见问题解答

提取亚马逊产品数据主要有两种不同的方法,每种方法都适用于不同的技能水平和需求。让我们来探讨这两种方法:

使用 Requests 和 Beautiful Soup 制作自己的网页抓取工具

如果你对编程感兴趣且具备必要的技能,利用 Requests 和 Beautiful Soup 等流行的 Python 库来创建一个自定义爬虫,将是一次令人着迷的尝试。以下是该过程的简要概述:

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

轮换用户代理:频繁更改用户代理可以进一步掩盖您的爬网活动,使其看起来更像是普通用户的交互行为。

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

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

借助 Amazon Scraper API 实现精简解决方案

对于那些寻求更易于使用且更省时的替代方案的人来说,Amazon Scraper API 提供了一套量身定制的解决方案:

  • 预置功能:该 API 专为亚马逊设计,提供可轻松抓取各类页面类型的功能。
  • 全面覆盖:该 API 能够定位全球众多地区的数据,功能多样且覆盖范围广泛。
  • 易用性:无需再为繁琐的手动编码而烦恼;该 API 会以便捷的 JSON 格式返回可直接使用的数据。

Amazon Scraper API 为 抓取亚马逊数据提供 了一个便捷的入口,特别是对于那些缺乏技术资源或没有时间开发和维护自定义抓取工具的个人或组织而言。

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

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

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

关于作者
Suciu Dan,WebScrapingAPI 联合创始人
Suciu Dan联合创始人

Suciu Dan 是 WebScrapingAPI 的联合创始人,他撰写了关于 Python 网络爬虫、Ruby 网络爬虫以及代理基础设施的实用指南,这些指南专为开发者而设计。

开始构建

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

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