跳到内容

使用 Python 抓取亚马逊的终极指南 (2023)

从最大的电子商务平台之一亚马逊抓取数据可以提供有价值的见解。 无论您是要比较价格、分析客户评论还是跟踪产品可用性,网络抓取都是一个有用的工具。 本指南提供了用于抓取亚马逊的详细说明和 Python 代码示例。

网页抓取伦理

在我们深入研究之前,重要的是要注意抓取应该负责任地进行,以尽量减少对网站服务器的需求。 一种方法是关注亚马逊搜索页面,您可以在其中提取基本产品数据,例如名称、价格、图片 URL、评级和评论数量。 这种方法将显着减少您需要向亚马逊发出的请求数量,使您的爬虫运行起来更快、成本更低.

Python Web 抓取库

Python 提供了大量用于网络抓取的库,选择合适的库取决于您的特定需求和对 Python 的熟悉程度。 以下是一些最常用的库:

  1. 要求:一个流行的 Python 库,用于发出 HTTP 请求。 它抽象了在简单 API 后面发出请求的复杂性,允许您使用 GET、POST 等各种方法发送 HTTP/1.1 请求 。
  2. 美丽汤:用于解析HTML和XML文档,提取数据。 它从页面源代码创建一个解析树,可用于以分层和更易读的方式提取数据 。
  3. Scrapy:专为网络抓取而设计的开源 Python 框架。 它是一个多功能的框架,可以处理范围广泛的抓取任务,并且能够抓取大型数据集 。
  4. :通过程序控制网络浏览器的强大工具。 它对于网络抓取非常方便,因为它可以处理所有类型的网站内容,包括 JavaScript 生成的内容。 它还允许用户交互,如点击、滚动等 。
  5. :用于使用 XPath 和 CSS 选择器从 HTML 和 XML 中提取数据。 它建立在 lxml 库之上,使其灵活且易于使用 。

从亚马逊搜索页面抓取产品数据

抓取亚马逊的第一步是从搜索页面中提取数据。 Python Requests 和 Parsel 库可用于此任务。 这是一个示例脚本,它从所有可用的亚马逊搜索页面中为给定的关键字(例如,“iPad”)抓取产品数据:

import requests from parsel import Selector from urllib.parse import urljoin keyword_list = ['ipad'] product_overview_data = [] for keyword in keyword_list: url_list = [f'https://www.amazon.com/s?k={关键字} &page=1'] for url in url_list: try: response = requests.get(url) if response.status_code == 200: sel = Selector(text=response.text) # 提取产品页面 search_products = sel.css("div .s-result-item[data-component-type=s-search-result]") for product in search_products: relative_url = product.css("h2>a::attr(href)").get() asin = relative_url.split('/')[3] if len(relative_url.split('/')) >= 4 else None product_url = urljoin('https://www.amazon.com/', relative_url).split( "?")[0] product_overview_data.append( { "keyword": keyword, "asin": asin, "url": product_url, "ad": True if "/slredirect/" in product_url else False, "title": product.css("h2>a>span::text").get(), "price-data-a-size=xl .a-offscreen::text").get(), "real_price": 产品。 css(".a-price[data-a-size=b] .a-offscreen::text").get(), "rating": (product.css("span[aria-label~=stars]: :attr "rating_count": product.css("span[aria-label~=stars] + span::attr(aria-label)").get(), "thumbnail_url": product.xpath("//img[ has-class('s-image')]/@src").get(), } ) # 获取所有页面 if "&page=1" in url: available_pages = sel.xpath( '//a[has-class ("s-pagination-item")][not(has-class("s-pagination-separator"))]/text()' ).getall() for page in available_pages: search_url_paginated = f'https:// www.amazon.com/s?k={keyword}&page={page}' url_list.append(search_url_paginated) 除了 Exception as e: print("Error", e)

该脚本将收集一系列产品数据,每个数据都表示为具有以下键的字典:

  • keyword:使用的搜索关键字(例如,“iPad”)
  • asin: 产品的唯一亚马逊标准标识号
  • url: 产品的网址
  • ad: 一个布尔值,表示产品是否是广告
  • title: 产品名称
  • price: 产品价格
  • real_price: 任何折扣前的产品原价
  • rating: 产品评级
  • rating_count:产品获得的评分数
  • thumbnail_url: 产品缩略图的URL

该脚本还识别搜索关键字的所有可用页面并将它们附加到 url_list 用于刮取【9†来源】。

从亚马逊产品页面抓取产品数据

获得亚马逊产品 URL 列表后,您可以从每个单独的亚马逊产品页面抓取所有产品数据。 下面是使用 Python Requests 和 Parsel 库执行此操作的示例脚本:

import re import requests from parsel import Selector from urllib.parse import urljoin product_urls = [ 'https://www.amazon.com/2021-Apple-10-2-inch-iPad-Wi-Fi/dp/B09G9FPHY6/ref= sr_1_1', ] product_data_list = [] for product_url in product_urls: try: response = requests.get(product_url) if response.status_code == 200: sel = Selector(text=response.text) image_data = json.loads(re.findall (r"colorImages':.*'initial':\s*(\[.+?\])},\n", response.text)[0]) variant_data = re.findall(r'dimensionValuesDisplayData"\s *:\s* ({.+?}),\n', response.text) feature_bullets = [bullet.strip() for bullet in sel.css("#feature-bullets li ::text").getall( )] price = sel.css('.a-price span[aria-hidden="true"] ::text').get("") 如果不是价格:price = sel.css('.a-price . a-offscreen ::text').get("") product_data_list.append({ "name": sel.css("#productTitle::text").get("").strip(), "price":价格,“星星”:sel.css(“i[data-hook=average-star-rating] ::text”).get("").strip(), "rating_count": sel.css("div[ data-hook=total-review-count] ::text").get("").strip(), "feature_bullets": feature_bullets, "images": image_data, "variant_data": variant_data, }) 除了异常为 e : 打印("错误",e)

此脚本收集一系列产品数据,每个产品都表示为具有以下键的字典:

  • name: 产品名称
  • price: 产品价格
  • stars: 产品的星级
  • rating_count:产品收到的评论总数
  • feature_bullets: 产品功能列表
  • images: 产品的高分辨率图像列表
  • variant_data:有关产品变体的数据(例如,可用的不同颜色或尺寸)

值得注意的是,此脚本旨在从具有特定布局的产品页面中提取数据。 如果亚马逊改变其产品页面的布局,脚本可能需要更新【11†来源】。

其他注意事项

虽然上述脚本为抓取 Amazon 提供了一个起点,但对于完整且强大的抓取解决方案,还需要考虑其他注意事项:

1.处理动态内容

一些亚马逊产品页面使用动态内容,需要加载 JavaScript。 如果您尝试使用上述方法抓取这些页面,您可能会发现您想要的某些数据丢失了。 在这些情况下,您需要使用可以呈现 JavaScript 的工具,例如 Selenium 或 Puppeteer。

2.尊重机器人.txt

亚马逊 robots.txt 文件告诉网络爬虫他们可以访问哪些页面。 虽然此文件不具有法律约束力,但忽略它可能会导致您的 IP 地址被禁止。 最好尊重 robots.txt 文件以避免任何潜在的问题。

3. 速率限制

亚马逊可能会限制您在特定时间段内可以提出的请求数量。 如果你太快发出太多请求,亚马逊可能会禁止你的 IP 地址,你可能需要 亚马逊代理. 为避免这种情况,您可以使用限制请求或 轮换IP地址.

4。 道德考虑

网络抓取会对网站的服务器提出大量要求,因此负责任地抓取非常重要。 如果您可以从更少的页面中获取所需的数据,那么这样做就更合乎道德。 例如,如果您只需要基本的产品数据(名称、价格、图片 URL、评级、评论数量等),您可以从搜索页面而不是产品页面抓取这些数据,从而减少您需要的请求数量增加 20 倍。


总之,虽然网络抓取是从亚马逊等网站提取数据的强大工具,但负责任地使用这些技术并遵守网站的服务条款和您对其服务器的要求非常重要。

标签:

加入谈话

您的电邮地址不会被公开。 必填带 *