亚马逊数据抓取终极指南:2023 年的技巧、窍门和 9 个最佳实践

想象一下自己是一位充满冒险精神的探险家,纵身跃入亚马逊广袤而神秘的领域——不是热带雨林,而是这家在线零售巨头。每一次点击,你都会发现珍贵的宝藏,在数据的未知疆域中不断深入探索。

在这场激动人心的探险中,我们将为你提供一份循序渐进的指南,带你穿越亚马逊网页抓取这片茂密的数字丛林。做好准备,开启一段别样的旅程,借助专家技巧,以无与伦比的精度提取有价值的信息。

目录

那么,鼓起勇气,穿上你的虚拟探险靴,让我们一起开启这场数据驱动的冒险吧!

从亚马逊抓取哪些数据

亚马逊商品包含许多数据点,但抓取时需要重点关注的关键要素包括:

  1. 商品标题
  2. 价格
  3. 优惠金额(如适用)
  4. 商品摘要
  5. 相关特性列表(如有)
  6. 评论评分
  7. 商品图片

尽管这些是抓取亚马逊商品时需要考虑的主要方面,但请注意,你提取的信息可能会根据你的具体目标而有所不同。

一些基本要求

煲汤需要合适的食材。同样,我们的新网页抓取工具也需要特定的组件。

  • Python — Python 易于使用,且拥有丰富的库,因此是网页抓取的首选。如果尚未安装,请参阅本指南。
  • BeautifulSoup — 这是众多 Python 网页抓取库之一。它简单易用,因此很受欢迎。成功安装 Python 后,可以运行以下命令来安装 Beautiful Soup:pip install bs4
  • HTML 标签基础知识 — 请参阅本教程,了解 HTML 标签所需的知识。
  • 网页浏览器 — 由于我们需要从网站中过滤掉大量无关信息,因此需要使用特定的 id 和标签进行筛选。Google Chrome 或 Mozilla Firefox 等网页浏览器有助于识别这些标签。

为抓取做好准备

首先,请确保已安装 Python。如果你没有安装 Python 3.8 或更高版本,请访问 python.org 下载并安装最新版本。

接下来,创建一个目录,用于存放 Amazon 网页抓取代码文件。通常,最好为项目设置一个虚拟环境。

在 macOS 和 Linux 上,使用以下命令创建并激活虚拟环境:

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

Windows 用户使用的命令略有不同:

d:amazon>python -m venv .env d:amazon>.envscriptsactivate

现在该安装必需的 Python 软件包了。

你需要用于两项主要任务的软件包:获取 HTML,以及解析 HTML 以提取相关数据。

Requests 库是一个广泛使用的第三方 Python 库,可用于发送 HTTP 请求。它提供了简单易用的接口,用于向 Web 服务器发送 HTTP 请求并接收响应。它或许是最知名的网页抓取库。

不过,Requests 库有一个局限:它会将 HTML 响应作为字符串返回,因此在编写网页抓取代码时,很难搜索商品标价等特定元素。

这时就需要 Beautiful Soup。Beautiful Soup 是一个专为网页抓取设计的 Python 库,可从 HTML 和 XML 文件中提取数据。它支持通过搜索标签、属性或特定文本来获取网页中的信息。

要安装这两个库,请使用以下命令:

$ python3 -m pip install requests beautifulsoup4

Windows 用户只需将 ‘python3’ 替换为 ‘python’,命令的其他部分保持不变:

d:amazon>python -m pip install requests beautifulsoup4

请注意,我们安装的是 Beautiful Soup 库的第 4 版。

现在来测试 Requests 抓取库。创建一个名为 amazon.py 的新文件,并输入以下代码:

import requests url = ' https://www.amazon.com/Bose-QuietComfort-45-Bluetooth-Canceling-Headphones/dp/B098FKXT8L' response = requests.get(url) print(response.text)

保存文件,并在终端中运行它。

$ python3 amazon.py

在大多数情况下,你无法查看所需的 HTML。Amazon 会拦截请求,并返回以下响应:

如需讨论对 Amazon 数据的自动化访问,请联系 [email protected]。

如果你打印 response.status_code,就会看到收到的是 503 错误,而不是表示成功的 200 状态码。

Amazon 知道该请求并非来自浏览器,因此会拦截它。许多网站都普遍采用这种做法。Amazon 可能会拦截你的请求,并返回以 500 开头,有时甚至以 400 开头的错误代码。

一个简单的解决办法是随请求发送标头,模拟浏览器发送的标头。

有时只发送 user-agent 就足够了;其他时候,你可能还需要发送其他标头,例如 accept-language 标头。

要查找浏览器发送的 user-agent,请按 F12,打开 Network 选项卡,然后重新加载页面。选择第一个请求并查看 Request Headers。

复制此 user-agent,并创建一个标头字典,例如包含 user-agent 和 accept-language 标头的字典:

custom_headers = { ' user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'accept-language': 'en-GB,en;q=0.9', }

然后,你可以将此字典作为可选参数传入 get 方法:

response = requests.get(url, headers=custom_headers

抓取 Amazon 产品信息

在抓取 Amazon 产品的过程中,通常会接触两类页面:类别页面和产品详情页面。

例如,访问 https://www.amazon.com/b?node=12097479011,或在 Amazon 上搜索头戴式耳机。显示搜索结果的页面称为类别页面。

类别页面会显示产品标题、产品图片、产品评分、产品价格,最重要的是产品链接页面。若要获取更多信息,例如产品描述,则必须访问产品详情页面。

我们来分析一下产品详情页面的结构。

使用 Chrome 或其他现代浏览器打开一个产品 URL,例如 https://www.amazon.com/Bose-QuietComfort-45-Bluetooth-Canceling-Headphones/dp/B098FKXT8L。右键单击产品标题并选择“检查”。产品标题的 HTML 标记就会高亮显示。

你会发现,它是一个 span 标签,其 id 属性设置为“productTitle”。

同样,右键单击价格并选择“检查”,即可查看价格的 HTML 标记。

价格中的美元部分位于 class 为“a-price-whole”的 span 标签中,而美分部分则位于另一个 class 为“a-price-fraction”的 span 标签中。

你也可以用同样的方法找到评分、图片和描述。

收集到这些信息后,将以下几行添加到现有代码中:

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

Beautiful Soup 提供了使用 find 方法选择标签的独特方式。它也支持将 CSS 选择器作为替代方案。你可以使用任一方法实现相同的结果。在本教程中,我们将使用 CSS 选择器,这是一种通用的元素选择方法。几乎所有网页抓取工具都支持 CSS 选择器,可用于提取 Amazon 产品信息。

现在,你可以使用 Soup 对象查询特定信息了。

提取产品名称

产品名称或标题位于 id 为‘productTitle’的 span 元素中。使用唯一 id 选择元素很简单。

以下代码为例:

title_element = soup.select_one('#productTitle')

我们将 CSS 选择器传递给 select_one 方法,该方法会返回一个元素实例。

要从文本中提取信息,请使用 text 属性。

title = title_element.text

打印时,你可能会注意到有一些空白字符。要解决这个问题,请按如下方式添加 .strip() 函数调用:

title = title_element.text.strip()

提取产品评分

获取 Amazon 产品评分需要多做一些工作。

首先,为评分设置一个选择器:

#acrPopover

接下来,使用以下语句选择包含评分的元素:

rating_element = soup.select_one('#acrPopover')

请注意,实际评分值位于 title 属性中:

rating_text = rating_element.attrs.get('title') print(rating_text) # prints '4.6 out of 5 stars'

最后,使用 replace 方法获取数值评分:

rating = rating_text.replace('out of 5 stars', '')

提取产品价格

产品价格有两个位置——产品标题下方和“立即购买”框内。

可以使用这两个标签中的任意一个来抓取 Amazon 产品价格。

为价格创建一个 CSS 选择器:

#price_inside_buybox

像这样将此 CSS 选择器传递给 BeautifulSoup 的 select_one 方法:

price_element = soup.select_one('#price_inside_buybox')

现在,你可以打印价格:

print(price_element.text)

提取图片

要抓取默认图片,请使用 CSS 选择器 #landingImage。有了这些信息,你可以编写以下代码行,从 src 属性中获取图片 URL:

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

提取产品描述

提取 Amazon 产品数据的下一步是获取产品描述。

这个过程保持不变——创建一个 CSS 选择器并使用 select_one 方法。

描述对应的 CSS 选择器是:

#productDescription

这样我们就可以按如下方式提取该元素:

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

处理产品列表

我们已经了解了如何抓取产品信息,但要访问产品数据,你需要从产品列表或类别页面开始。

例如,https://www.amazon.com/b?node=12097479011 是头戴式耳机的类别页面。

检查此页面后,你会发现所有产品都包含在一个具有唯一属性 [data-asin] 的 div 中。在该 div 内,所有产品链接都位于 h2 标签中。

根据这些信息,CSS 选择器为:

[data-asin] h2 a

你可以读取此选择器的 href 属性并运行循环。不过,请记住,这些链接是相对链接。你需要使用 urljoin 方法来解析这些链接。

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(search_url, link.attrs.get("href")) product_info = get_product_info(full_url) page_data.append(product_info)

处理分页

指向下一页的链接位于包含文本“Next”的链接中。你可以使用 CSS 的 contains 运算符搜索此链接,如下所示:

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)

导出 Amazon 数据

抓取的数据会有意以字典形式返回。你可以创建一个包含所有抓取产品的列表。

def parse_listing(listing_url): ... page_data = [] for link in link_elements: ... product_info = get_product_info(full_url) page_data.append(product_info)

然后,你可以使用此 page_data 创建 Pandas DataFrame 对象:

df = pd.DataFrame(page_data) df.to_csv('headphones.csv', index = False)

如何抓取亚马逊上的多个页面

抓取亚马逊上的多个页面,可以通过提供更广泛的数据集供分析,从而提升网页抓取项目的成效。抓取多个页面时,你需要考虑分页,也就是将内容分布在多个页面上的过程。

抓取亚马逊上的多个页面时,请牢记以下6 个要点:

  1. 识别分页模式:首先,分析类别页或搜索结果页的 URL 结构,了解亚马逊如何对内容进行分页。这可能是一个查询参数(例如“?page=2”),也可能是嵌入 URL 中的唯一标识符。
  2. 提取“下一页”链接:找到包含下一页链接的元素(通常是锚点标签)。使用适当的 CSS 选择器或 Beautiful Soup 方法提取该元素的 href 属性,该属性对应的 URL 就是下一页的网址。
  3. 将相对 URL 转换为绝对 URL:由于提取到的 URL 可能是相对 URL,请使用 urllib.parse 库中的 urljoin 函数将它们转换为绝对 URL。
  4. 创建循环:编写一个循环,遍历各个页面并抓取每页所需的数据。当当前页面不存在“下一页”链接时,即可判断没有更多页面,循环也应随之结束。
  5. 在请求之间加入延迟:为避免给亚马逊服务器造成过大压力或触发反机器人措施,请使用 time 库中的 time.sleep() 函数,在请求之间加入延迟。调整延迟时长,以模拟人类的浏览行为。
  6. 处理 CAPTCHA 和封锁:如果在抓取多个页面时遇到 CAPTCHA 或 IP 封锁,可以考虑使用代理轮换 IP 地址,或使用能够自动应对这些问题的专用抓取工具和服务。

下面是一段详尽的 YouTube 视频教程,带你了解如何从亚马逊网站的多个页面提取数据。教程深入讲解网页抓取,重点介绍能够帮助你高效、有效地从亚马逊众多页面收集有价值信息的技巧。

教程中,讲解者演示了 Python、BeautifulSoup 和 requests 等必要工具与库的使用方法,同时介绍了避免被亚马逊的反机器人机制封锁或检测到的最佳实践。视频涵盖了分页处理、速率限制管理以及模拟人类浏览行为等重要主题。

除了视频中提供的逐步说明外,教程还分享了优化网页抓取体验的实用技巧和窍门,包括使用代理绕过 IP 限制、随机设置 User-Agent 和请求标头,以及实现适当的错误处理,以确保抓取过程顺畅、不间断。

抓取 Amazon:常见问题

说到从 Amazon 这个热门电子商务平台提取数据,有一些事项需要注意。让我们来看看有关抓取 Amazon 数据的常见问题。

1. 抓取 Amazon 合法吗?

抓取互联网上公开可用的数据是合法的,其中也包括抓取 Amazon。你可以合法地抓取产品详情、描述、评分和价格等信息。不过,在抓取产品评论时,应谨慎处理个人数据和版权保护问题。例如,评论者的姓名和头像可能属于个人数据,而评论文本可能受版权保护。抓取此类数据时务必谨慎,并寻求法律建议。

2. Amazon 允许抓取吗?

尽管抓取公开可用的数据是合法的,但 Amazon 有时会采取措施阻止抓取。这些措施包括限制请求频率、封禁 IP 地址,以及使用浏览器指纹识别来检测抓取机器人。Amazon 通常会通过返回 200 OK 成功状态响应码来阻止网页抓取,并要求你通过 CAPTCHA,或者显示 HTTP Error 503 Service Unavailable 消息,引导你联系销售部门购买付费 API。

有一些方法可以绕过这些措施,但遵循道德规范进行网页抓取,有助于从一开始就避免触发这些措施。道德网页抓取包括限制请求频率、使用恰当的用户代理,以及避免过度抓取,以免影响网站性能。通过遵循道德规范进行抓取,你可以降低被封禁或面临法律后果的风险,同时仍然能够从 Amazon 提取有用数据。

3. 抓取 Amazon 数据符合道德规范吗?

道德抓取意味着尊重目标网站。虽然你不太可能因为请求过多而导致 Amazon 网站过载,但仍应遵循道德抓取准则。道德抓取可以降低面临法律问题或遭遇反抓取措施的风险。

4. 抓取 Amazon 时如何避免被封禁?

为了避免抓取 Amazon 时被封禁,你应限制请求频率,避免在高峰时段抓取,使用智能代理轮换,并使用恰当的用户代理和标头来避免被检测到。此外,只提取所需数据,并使用第三方抓取工具或抓取库。

5. 抓取 Amazon 有哪些风险?

抓取 Amazon 数据可能带来潜在风险,例如面临法律诉讼或账户被暂停。Amazon 会使用反机器人措施来检测并阻止抓取,包括封禁 IP 地址、限制请求频率和浏览器指纹识别。不过,通过遵循道德规范进行抓取,你可以降低这些风险。

结论

当我们走出 Amazon 网页抓取这座引人入胜的迷宫时,不妨停下来回顾一下,在这段令人振奋的旅程中积累的宝贵知识与技能。在 ProxyCompass 这位可信向导的帮助下,你已成功穿越重重曲折,从这个零售巨头那里提取珍贵数据。继续前行,娴熟运用新掌握的专业技能时,请记住,数字丛林始终在不断演变。

保持好奇,不断磨砺你的网页抓取开山刀,继续征服瞬息万变的数据提取领域。勇敢的探索者,在我们下一次大胆探险之前,愿你的数据驱动之旅硕果累累、收获丰厚!