一、故事开场:采购小姐姐的周五 17:30
义乌某电商公司,采购每周要汇报「1688 女式 T 恤均价」:
- 人工滑屏 200 条 → 眼花了
- Excel 手填 → 错了
- 周五熬夜 → 秃了
- 后端同事甩给她一个 60 行 PHP 脚本:
- 输入关键词 → 自动抓 500 条
- 一键导出 CSV → Excel 透视图直接出
- 周五 17:30 下班 → 老板夸「高效」
- 今天把完整思路开源,虚拟主机也能跑,复制即可用。
二、先选赛道:为什么选「公开接口」而不是「登录爬虫」
方案 | 封号风险 | 维护成本 | 数据完整度 | 选用 |
---|---|---|---|---|
模拟登录+滑块 | 高 | 极高 | 100% | ❌ |
无头浏览器 | 中 | 高 | 95% | ❌ |
1688 官方 OpenAPI | 0 | 低 | 99% | ✅ 首推 |
公开游客 HTML | 极低 | 中 | 80% | ⚠️ 备选 结论: |
- 能申请 官方 API → 走签名通道(合规、稳定、可商用)
- 练手/无密钥 → 走 游客 HTML 解析(零门槛、字段够用)
- 本文 一文双吃:先给「签名 API」极速版,再给「HTML 解析」备用版,任你挑。
三、极速版①:官方 API 签名通道(推荐)
① 申请入口
https://open.1688.com → 注册「个人开发者」→ 创建「自用型」应用
能力市场搜索 offer.search 或 offer.detail → 秒过
拿到:AppKey、AppSecret、日配额 5k~2w 次(免费)
② 签名规则(TOP 标准)sign = strtoupper(md5(secret + 字典序(参数) + secret))
③ 60 行源码(零依赖,原生 curl)
保存为 alibaba_api.php
php
#!/usr/bin/env php
<?php
/* 1688 官方 API 签名版 - 零依赖 */
$appKey = '你的AppKey';
$appSecret= '你的AppSecret';
$keyword = $argv[1] ?? readline('关键词:');
$page = (int)($argv[2] ?? 1);
$fields = 'offerId,title,price,picUrl,detailUrl'; // 按需增删
$api = 'https://eco.1688.com/router/rest';
$params = [
'method' => 'cn.alibaba.open:offer.search',
'app_key' => $appKey,
'timestamp' => date('Y-m-d H:i:s'),
'format' => 'json',
'v' => '2.0',
'sign_method' => 'md5',
'keywords' => $keyword,
'pageNo' => $page,
'pageSize' => 20,
'fields' => $fields,
];
$params['sign'] = sign($appSecret, $params);
$resp = http_get($api . '?' . http_build_query($params));
$data = json_decode($resp, true);
if (isset($data['error_response'])) {
die('API Error:' . $data['error_response']['msg']);
}
$offers = $data['offer_search_response']['result']['offers'] ?? [];
$csv = "offerId,title,price,picUrl,detailUrl\n";
foreach ($offers as $o) {
$csv .= implode(',', [
$o['offerId'],
'"' . str_replace('"', '""', $o['title']) . '"',
$o['price'],
$o['picUrl'],
$o['detailUrl']
]) . "\n";
}
$file = "1688_{$keyword}_" . date('Ymd') . ".csv";
file_put_contents($file, $csv);
echo "已导出 " . count($offers) . " 条 → $file\n";
/* ---------- 工具函数 ---------- */
function sign($secret, $params) {
ksort($params);
$str = $secret;
foreach ($params as $k => $v) if ($k != 'sign' && $v !== '') $str .= $k . $v;
$str .= $secret;
return strtoupper(md5($str));
}
function http_get($url) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
CURLOPT_FOLLOWLOCATION => true,
]);
$resp = curl_exec($ch);
curl_close($ch);
return $resp ?: throw new Exception('CURL Error');
}
运行:
$ php alibaba_api.php "女式T恤" 2
已导出 40 条 → 1688_女式T恤_20250929.csv
字段齐全:offerId、标题、价格、主图 URL、详情链接,足够做行情面板。
四、备用版②:游客 HTML 解析(无密钥练手)
① 分析列表页
URL 示例:https://s.1688.com/selloffer/offer_search.htm?keywords=女式T恤&page=1
- 商品块:.sm-offer-item
- 标题:.offer-title
- 价格:.price
- 销量:.sales
② 使用 Guzzle + DOMXPath(60 行)
安装:
bash
composer require guzzlehttp/guzzle
代码 alibaba_html.php:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
function searchProducts($keyword, $page = 1) {
$client = new Client();
$url = "https://s.1688.com/selloffer/offer_search.htm?keywords=" . urlencode($keyword) . "&page={$page}";
$html = $client->get($url, [
'headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36']
])->getBody()->getContents();
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$items = $xpath->query("//div[contains(@class,'sm-offer-item')]");
$data = [];
foreach ($items as $node) {
$title = trim($xpath->evaluate("string(.//a[@class='offer-title'])", $node));
$price = trim($xpath->evaluate("string(.//span[contains(@class,'price')])", $node));
$sales = trim($xpath->evaluate("string(.//span[contains(@class,'sales')])", $node));
if ($title) $data[] = [$title, $price, $sales];
}
return $data;
}
$keyword = $argv[1] ?? readline('关键词:');
$csv = fopen("1688_html_{$keyword}_" . date('Ymd') . ".csv", 'w');
fputcsv($csv, ['title', 'price', 'sales']);
for ($p = 1; $p <= 3; $p++) {
$list = searchProducts($keyword, $p);
foreach ($list as $row) fputcsv($csv, $row);
echo "Page $p 完成\n";
}
fclose($csv);
echo "已导出 CSV\n";
运行:
$ php alibaba_html.php "女式T恤"
Page 1 完成
Page 2 完成
Page 3 完成
已导出 CSV
注意:HTML 结构随时可能微调,出现字段为空请 var_dump($node->nodeValue) 快速定位新 class。
五、提速 & 稳速:并发 + 重试 + 礼貌
技巧 | 实现 | 效果 |
---|---|---|
并发 | Guzzle Pool 或 curl_multi_* | 60条≈5秒 |
重试 | while(--$retry) | 网络抖动成功率99% |
限速 | usleep(300000) | 单IP安全 |
代理 | CURLOPT_PROXY | 分布式再+代理 |
六、三行代码看行情(Excel 透视)
- 均价 =AVERAGE(B:B)
- 最低地区透视图 → 低价收货
- 销量/价格散点图 → 找「高销低价」爆款
七、常见问题(FAQ)
- 403/滑块怎么办?→ 降速 + 换 IP + 加 Accept-Language
- 官方 API 配额不够?→ 控制台买流量包,或 HTML 版补位
- 想抓「库存」「运费」?→ 需进入 offer 详情页再解析一次,或申请 offer.detail 接口
- 能商用吗?→ 官方 API 数据含版权,对外展示前阅读《数据使用协议》,必要时签补充条款
八、把脚本升级成「副业现金流」
需求 | 工具 | 成本 |
---|---|---|
定时 | Linux cron / Win 计划任务 | 0元 |
通知 | 企业微信机器人 + curl POST | 0元 |
前端 | Streamlit / PHP 自建页 | 0元 |
订阅 | 知识星球 / 小报童 | 29元/月 已有读者把「1688 行情」做成星球,200 会员 × 50 元 = 月入 1w |
九、合规再提醒:只挖公开矿,不碰隐私矿
- 不登录、不破解、不存储商业机密
- 不公开商家手机号、地址、SKU 级库存
- 对外展示请脱敏 offerId 后三位,避免黄牛精准狙击
- 商用前阅读《1688 数据使用协议》,必要时购买正式流量包
十、结语:让技术「温柔」地赚钱
今天这篇软文,没有对抗、没有炫技,只有:
- 官方 API → 低风险、可商用
- 60 行代码 → 虚拟主机可复制
- CSV 输出 → Excel 能落地
- 把脚本丢给 cron,每天一杯咖啡的时间,就能生成一份「1688 行情报告」。
当别人还在手动滑屏,你已经用 PHP 把 1688 变成了「躺赚」的副业提款机。