徐州网站建设要多少钱,江西网站设计方案,wordpress取5篇置顶文章,友情链接代码wordpress下面给出一份可直接落地的「Java 版 1688 商品详情 API 爬虫」完整示例#xff0c;覆盖签名算法、HTTP 调用、JSON 解析、异常重试、频率控制等关键要点#xff0c;复制即可运行。
#xff08;注#xff1a;1688 接口需企业认证并申请 AppKey / AppSecret#xff0c;以下代…下面给出一份可直接落地的「Java 版 1688 商品详情 API 爬虫」完整示例覆盖签名算法、HTTP 调用、JSON 解析、异常重试、频率控制等关键要点复制即可运行。注1688 接口需企业认证并申请 AppKey / AppSecret以下代码以官方 REST 网关item_get为例也可平替为第三方代理网关只需换域名即可 。一、Maven 依赖dependencies !-- HTTP -- dependency groupIdorg.apache.httpcomponents.client5/groupId artifactIdhttpclient5/artifactId version5.3.1/version /dependency !-- JSON -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.17.0/version /dependency /dependencies二、签名工具1688 官方 MD5 签名规则public class SignUtil { public static String sign(TreeMapString, String params, String appSecret) { StringBuilder sb new StringBuilder(appSecret); for (Map.EntryString, String e : params.entrySet()) { sb.append(e.getKey()).append(e.getValue()); } sb.append(appSecret); return md5(sb.toString()).toUpperCase(); } private static String md5(String raw) { try { byte[] bs MessageDigest.getInstance(MD5).digest(raw.getBytes(StandardCharsets.UTF_8)); StringBuilder hex new StringBuilder(); for (byte b : bs) hex.append(String.format(%02X, b 0xFF)); return hex.toString(); } catch (Exception e) { throw new RuntimeException(e); } } }三、统一入口 ——ItemGetServicepublic class ItemGetService { private static final String GATEWAY https://api.1688.com/router/rest; private final String appKey; private final String appSecret; private final CloseableHttpClient http; public ItemGetService(String appKey, String appSecret) { this.appKey appKey; this.appSecret appSecret; this.http HttpClients.custom() .setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create() .setMaxConnTotal(50).setMaxConnPerRoute(10).build()) .build(); } /** 获取商品详情自动重试 3 次 */ public ItemDO getItem(long numIid) throws IOException { TreeMapString, String params new TreeMap(); params.put(method, item_get); params.put(app_key, appKey); params.put(timestamp, String.valueOf(System.currentTimeMillis())); params.put(num_iid, String.valueOf(numIid)); params.put(v, 2.0); params.put(sign_method, md5); params.put(format, json); params.put(sign, SignUtil.sign(params, appSecret)); String url GATEWAY ? URLEncodedUtils.format( params.entrySet().stream() .map(e - new BasicNameValuePair(e.getKey(), e.getValue())) .collect(Collectors.toList()), StandardCharsets.UTF_8); for (int i 0; i 3; i) { try (CloseableHttpResponse resp http.execute(new HttpGet(url))) { if (resp.getCode() 200) { JsonNode root new ObjectMapper().readTree(EntityUtils.toString(resp.getEntity())); if (0.equals(root.get(code).asText())) { return new ObjectMapper().convertValue(root.get(item), ItemDO.class); } throw new IllegalStateException(API 业务错误: root.get(msg).asText()); } } catch (Exception e) { if (i 2) throw e; try { Thread.sleep(1000); } catch (InterruptedException ignore) {} } } throw new RuntimeException(重试 3 次仍失败); } Data // lombok public static class ItemDO { private String title; private BigDecimal price; private Integer num; // 库存 private String picUrl; private ListSku skus; } public void shutdown() throws IOException { http.close(); } }四、频率控制 批量调用示例public class CrawlerBoot { public static void main(String[] args) throws Exception { ItemGetService api new ItemGetService(你的AppKey, 你的AppSecret); ListLong numIids List.of(610947572360L, 623456789012L); // 商品ID池 for (Long id : numIids) { ItemGetService.ItemDO item api.getItem(id); System.out.printf(标题%s 价格%s 库存%d%n, item.getTitle(), item.getPrice(), item.getNum()); Thread.sleep(350); // 约 3 次/秒低于官方 5 次/秒限制 } api.shutdown(); } }五、常见坑 优化建议签名顺序必须TreeMap升序否则 4005 授权失败。免费账号每日调用上限 1 万次超出需购买套餐峰值时段做好限流与重试。如需 SKU 图、阶梯价、近 30 天销量需在参数额外指定fieldsskus,priceRange,saleInfo。若走第三方代理网关如api-gw.onebound.cn签名规则不变仅换域名即可。数据落库时建议用ON DUPLICATE KEY UPDATE做幂等避免重复写入。六、一句话总结以上代码即为“Java 爬虫 1688 详情 API 接口”的最小可运行骨架已帮你屏蔽掉签名、编码、重试、频率等所有细节直接填上自己的 AppKey / Secret 即可把 1688 商品库变成本地数据表