0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从 0 到 1:用 PHP 爬虫优雅地拿下 Amazon 商品详情

刘大雷 来源:jf_82280871 作者:jf_82280871 2025-09-24 15:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 为什么选择 PHP 做 Amazon 爬虫?

表格

wKgZPGjTnIOAJ9vFAABH8h-QxKI851.png

一句话:如果你本来就在写 Laravel,用 PHP 写爬虫等于「顺路」

2. Amazon 页面结构 60 秒速览(2025-06 最新)

以 https://www.amazon.com/dp/B08N5WRWNW 为例:

表格

wKgZO2jTnI-ASfqgAABj_nLoWUY565.png

结论:95% 字段静态直取,无需上重型浏览器。

3. 环境准备:30 秒搭好最小可用环境

bash

# 创建项目
mkdir amz-php-crawler && cd amz-php-crawler
composer init --name="demo/amz-crawler" -s dev

# 安装依赖
composer require guzzlehttp/guzzle symfony/dom-crawler symfony/css-selector fakerphp/faker

PHP ≥ 8.0 即可,Guzzle 7.x 自带 PSR-18,后续想接 Hyperf 也很方便。

4. 核心流程:从 ASIN → 结构化数组

ASIN → 下载详情页 → 解析静态字段 → 调 AJAX 价格/库存 → 清洗 → CSV/MySQL/Kafka

5. 代码实战:Guzzle + DOMXPath 极速版

php

< ?php
// src/AmzSpider.php
namespace Demo;

use GuzzleHttpClient;
use SymfonyComponentDomCrawlerCrawler;

class AmzSpider
{
    private Client $client;

    public function __construct()
    {
        $this- >client = new Client([
            'timeout' => 10,
            'headers' => [
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                'Accept-Language' => 'en-US,en;q=0.9',
                'Referer'    => 'https://www.amazon.com/',
            ],
        ]);
    }

    public function fetchProduct(string $asin): array
    {
        $url = "https://www.amazon.com/dp/{$asin}";
        $html = $this->client->get($url)->getBody()->getContents();
        $crawler = new Crawler($html);

        $title = $crawler->filter('#productTitle')->text('');
        $priceWhole = $crawler->filter('.a-price .a-price-whole')->text('');
        $priceFrac = $crawler->filter('.a-price .a-price-fraction')->text('');
        $price = trim($priceWhole . '.' . $priceFrac);

        $rating = $crawler->filter('#acrPopover')->attr('title');
        $rating = $rating ? explode(' ', $rating)[0] : '';

        $reviewText = $crawler->filter('#acrCustomerReviewText')->text('');
        $reviewCount = filter_var($reviewText, FILTER_SANITIZE_NUMBER_INT);

        $imgJson = $crawler->filter('#imgTagWrapperId img')->attr('data-a-dynamic-image');
        $imgMap = json_decode($imgJson, true);
        $mainImg = $imgMap ? array_key_first($imgMap) : '';

        return [
            'asin'          => $asin,
            'title'         => trim($title),
            'price'         => $price,
            'rating'        => $rating,
            'review_count'  => (int) $reviewCount,
            'main_img'      => $mainImg,
            'crawled_at'    => date('Y-m-d H:i:s'),
        ];
    }
}

CLI 入口文件:

php

#!/usr/bin/env php
< ?php
require __DIR__ . '/vendor/autoload.php';

use DemoAmzSpider;

$asin = $argv[1] ?? 'B08N5WRWNW';
$spider = new AmzSpider();
$data = $spider- >fetchProduct($asin);
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

运行:

bash

php bin/amz.php B08N5WRWNW

输出示例:

JSON

{
  "asin": "B08N5WRWNW",
  "title": "Apple AirPods Pro",
  "price": "249.00",
  "rating": "4.6",
  "review_count": 25430,
  "main_img": "https://images-na.ssl-images-amazon.com/images/I/71zny7BTRlL._AC_SL1500_.jpg",
  "crawled_at": "2025-06-24 18:42:12"
}

6. 反爬三板斧:UA 池、代理池、随机延时

表格

wKgZPGjTnKeAEcPRAAArt6iBBdM931.png

Guzzle 中间件示例:

php

$stack = GuzzleHttpHandlerStack::create();
$stack->push(GuzzleHttpMiddleware::retry(function ($retries, $request, $response, $exception) {
    return $retries < 3 && ($exception || $response- >getStatusCode() === 403);
}, function ($retries) {
    return 1000 * (2 ** $retries);
}));

7. Selenium 兜底:滑块验证码与动态渲染

当 Amazon 出现滑块时,可用 php-webdriver 驱动 Chrome:

bash

composer require php-webdriver/webdriver

php

$host = 'http://localhost:4444/wd/hub'; // Selenium Standalone
$driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome());
$driver->get("https://www.amazon.com/dp/$asin");
sleep(5);
$html = $driver->getPageSource();
$driver->quit();

技巧

加载 stealth.min.js 隐藏 WebDriver 特征;

使用 undetected-chromedriver 可过新版滑块。

8. 提速 10 倍:多进程 + Swoole 协程

bash

composer require swoole/swoole

php

use SwooleRuntime;
use SwooleCoroutine;
use function SwooleCoroutinerun;

Runtime::enableCoroutine();
run(function () {
    $asins = ['B08N5WRWNW', 'B08L8DKCS1'];
    foreach ($asins as $asin) {
        Coroutine::create(function () use ($asin) {
            $spider = new AmzSpider();
            $data = $spider->fetchProduct($asin);
            file_put_contents("data/{$asin}.json", json_encode($data));
        });
    }
});

实测:4 核 8G 机器,协程版 2k SKU/min,CPU 占用 45%。

9. 数据落地:CSV、MySQL、Kafka 一键切换

① CSV(快速验证)

php

$fp = fopen('amz.csv', 'a');
fputcsv($fp, array_keys($data));
fputcsv($fp, $data);
fclose($fp);

② MySQL(生产)

php

$pdo = new PDO('mysql:host=localhost;dbname=amz', 'root', 'root');
$stmt = $pdo->prepare("REPLACE INTO product (asin,title,price,rating,review_count,main_img,crawled_at) VALUES (?,?,?,?,?,?,?)");
$stmt->execute([$data['asin'], $data['title'], $data['price'], $data['rating'], $data['review_count'], $data['main_img'], $data['crawled_at']]);

③ Kafka(实时流)

php

$producer = new KafkaProducer(function() {
    return [KafkaProducerConfig::BOOTSTRAP_SERVERS => 'localhost:9092'];
});
$producer->send([
    ['topic' => 'amz-product', 'value' => json_encode($data), 'key' => $data['asin']]
]);

10. 合规红线:Amazon 爬虫的法律底线

表格

wKgZO2jTnLmAKg5oAABN2f3eJak887.png

官方替代方案:Amazon Product Advertising API(PA-API 5.0)

稳定、合规、无封 IP 风险

需 Associate Tag + 授权,每日 1w 额度

结论:能 API 不爬虫,能授权不硬刚

11. 总结与进阶路线

原型阶段:本文代码直接跑,30 行即可出数
扩展阶段:协程池 + 代理池 + 重试,日采 50w SKU
生产阶段:Hyperf + Kafka + ES 实时搜索
商业闭环:价格告警、选品仪表盘、ERP 自动订价

12. 一键运行 & 源码

bash

git clone https://github.com/yourname/amz-php-crawler.git
cd amz-php-crawler
composer install
php bin/amz.php B08N5WRWNW

输出示例:

18:42:12 INFO ASIN=B08N5WRWNW, title=Apple AirPods Pro, price=$249.00, rating=4.6, reviews=25430

如果本文对你有帮助,记得 点赞 + 收藏 + 在看,我们下期「PHP + Swoole 实时价格流」见!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PHP
    PHP
    +关注

    关注

    0

    文章

    463

    浏览量

    28799
  • Amazon
    +关注

    关注

    1

    文章

    128

    浏览量

    18201
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电商效率翻倍: Open Claw 对接淘宝详情接口,一键抓取商品全量信息

    Open Claw 封装的 淘宝商品详情接口(item_get) ,可以直接获取淘宝 / 天猫商品的 标题、主图、SKU、价格、销量、详情页素材、属性、发货信息 等全字段数据,不用写
    的头像 发表于 04-21 16:56 74次阅读

    踩坑高效落地:淘宝天猫商品详情 API 的实操心得

    在电商数据开发、竞品分析等场景中,淘宝天猫商品详情API是获取商品数据的核心入口。初期频繁报错、调用低效,如今稳定支撑业务,我沉淀了一套
    的头像 发表于 02-26 16:51 1338次阅读

    技术探索:获取识货商品详情数据

    1. 接口发现 首先,我们需要找到识货App或网页端加载商品详情时发起的API请求。常见的方法包括: 浏览器开发者工具 :在网页端打开识货商品
    的头像 发表于 02-25 15:23 230次阅读
    技术探索:获取识货<b class='flag-5'>商品</b><b class='flag-5'>详情</b>数据

    亚马逊商品详情数据获取实战:从商品链接提取 ID 解析详情

    ,使用官方API成为合规、稳定获取数据的首选方案。 1. PA-API v5(Product Advertising API) 适用于无自有亚马逊店铺的第三方开发者、联盟推广者或选品分析人员。 核心功能:通过ASIN或关键词查询商品基础
    的头像 发表于 02-10 16:41 475次阅读

    得物商品详情API

    一、官方 API 接入核心信息 1. 接入前提 注册并入驻得物开放平台(https://open.dewu.com/),完成企业认证与应用创建 申请商品详情查询等接口权限,获取appKey
    的头像 发表于 01-27 14:08 628次阅读

    京东商品详情API接口指南

    。 二、接口概述 1. 核心接口信息 项⽬说明 接口名称商品详情查询(JD.item_get) 请求方式GET/POST(推荐 POST,避免参数暴露) 接口地址正式环境:c0b.cc
    的头像 发表于 01-14 14:22 475次阅读

    闲鱼商品详情 API 接口文档

    一、接口概述 1. 接口功能 该接口用于获取闲鱼平台商品的详细信息,包括商品标题、价格、规格、卖家信息、库存状态、商品描述、图片链接、交易记录(部分公开数据)等核心字段,支持开发者构建
    的头像 发表于 01-04 16:42 1302次阅读

    京东关键词搜索商品列表的Python爬虫实战

    京东关键词搜索商品列表 Python 爬虫实战 你想要实现京东关键词搜索商品爬虫,我会 合规声明、环境准备、页面分析、代码实现、反爬优化
    的头像 发表于 01-04 10:16 1222次阅读

    1688商品详情API指南

    一、摘要 1688平台为开发者提供了完整的商品详情API接口,支持获取商品的详细信息、规格参数、价格库存等核心数据。基于您之前了解的工厂数据API,商品
    的头像 发表于 12-11 11:09 904次阅读

    闲鱼商品详情API完整指南

    视频等内容。 二、接口概述 1.接口基本信息 接口名称:goodfish.item_get。 请求方式:GET。 返回格式:JSON。 2.主要功能 获取商品基本信息:标题、价格、描述等。 获取卖家信息:昵称、信用等级等。 获取商品
    的头像 发表于 12-02 11:46 593次阅读

    # 深度解析:爬虫技术获取淘宝商品详情并封装为API的全流程应用

    需求。本文将深入探讨如何借助爬虫技术实现淘宝商品详情的获取,并将其高效封装为API。 一、爬虫技术核心原理与工具 1.1 爬虫运行机制 网络
    的头像 发表于 11-17 09:29 463次阅读

    如何通过API获取1688平台商品详情

    ​  在电商开发中,获取商品详情是常见的需求,尤其对于1688平台(阿里巴巴旗下的批发采购平台)。通过API接口,开发者可以高效地集成商品数据自己的应用中。本文将逐步介绍如何通过16
    的头像 发表于 11-11 14:00 1341次阅读
    如何通过API获取1688平台<b class='flag-5'>商品</b><b class='flag-5'>详情</b>

    亚马逊获取商品详情API接口指南

    ​  在电商开发中,获取商品详情是核心需求之一。亚马逊提供了一套强大的API接口,允许开发者高效提取商品信息,如标题、价格、描述和库存状态。本文将逐步介绍如何通过Amazon Prod
    的头像 发表于 11-05 14:45 596次阅读
    亚马逊获取<b class='flag-5'>商品</b><b class='flag-5'>详情</b>API接口指南

    0 1 PHP 爬虫优雅拿下京东商品详情

    在电商数据驱动的时代, 商品详情数据 成为市场分析、价格监控、竞品调研的核心燃料。京东作为国内头部电商平台,其商品信息丰富、更新频繁,是数据开发者眼中的“香饽饽”。 本文将带你
    的头像 发表于 09-23 16:42 1053次阅读
    <b class='flag-5'>从</b> <b class='flag-5'>0</b> <b class='flag-5'>到</b> <b class='flag-5'>1</b>:<b class='flag-5'>用</b> <b class='flag-5'>PHP</b> <b class='flag-5'>爬虫</b><b class='flag-5'>优雅</b>地<b class='flag-5'>拿下</b>京东<b class='flag-5'>商品</b><b class='flag-5'>详情</b>

    eBay 商品详情 API 深度解析:基础信息变体数据获取全方案

    通过本文提供的方案,开发者可以快速实现 eBay 商品详情数据的获取和处理,为跨境电商应用提供丰富的商品信息支持。实际开发中,需遵守 eBay 开发者协议,合理使用获取的商品数据。
    的头像 发表于 08-18 10:17 1246次阅读
    eBay <b class='flag-5'>商品</b><b class='flag-5'>详情</b> API 深度解析:<b class='flag-5'>从</b>基础信息<b class='flag-5'>到</b>变体数据获取全方案