全部
常见问题
产品动态
精选推荐

Java爬虫实战指南:按关键字搜索淘宝商品

管理 管理 编辑 删除

在电商数据分析、市场调研等领域,获取淘宝商品信息是一项常见需求。Java 语言凭借其强大的网络编程能力和丰富的库支持,成为实现此类爬虫的理想选择。本文将详细介绍如何使用 Java 爬虫按关键字搜索淘宝商品,并提供完整的代码示例。

一、准备工作

1. 注册淘宝开放平台账号

在使用淘宝 API 之前,需要在淘宝开放平台注册账号并创建应用。注册完成后,平台会分配一个 App KeyApp Secret,这两个参数是调用 API 时的身份验证凭证。

2. 添加 Maven 依赖

为了方便地发送 HTTP 请求和解析 JSON 数据,我们需要在项目中添加以下 Maven 依赖:

xml

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>

二、代码实现

1. 发送 HTTP 请求

使用 HttpClient 发送 GET 请求,调用淘宝的商品搜索接口:

java

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;

public class TaobaoProductSearchCrawler {
    public static String searchTaobaoProducts(String appKey, String appSecret, String keyword, int page) {
        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
        Map<String, String> params = new HashMap<>();
        params.put("method", "taobao.item.search");
        params.put("app_key", appKey);
        params.put("timestamp", timestamp);
        params.put("v", "2.0");
        params.put("keyword", keyword);
        params.put("page", String.valueOf(page));
        params.put("sign_method", "md5");
        params.put("sign", generateSignature(appKey, appSecret, timestamp, params));

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("https://gw.api.taobao.com/router.json?" + toQueryString(params));
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity());
                } else {
                    System.out.println("请求失败,状态码:" + response.getStatusLine().getStatusCode());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String generateSignature(String appKey, String appSecret, String timestamp, Map<String, String> params) {
        StringBuilder signStr = new StringBuilder(appKey + timestamp + appSecret);
        for (Map.Entry<String, String> entry : params.entrySet()) {
            signStr.append(entry.getKey()).append(entry.getValue());
        }
        return md5(signStr.toString());
    }

    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger no = new BigInteger(1, messageDigest);
            String hashtext = no.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static String toQueryString(Map<String, String> params) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (sb.length() > 0) {
                sb.append("&");
            }
            sb.append(entry.getKey()).append("=").append(entry.getValue());
        }
        return sb.toString();
    }
}

2. 解析 JSON 响应

使用 Jackson 库解析返回的 JSON 数据,提取商品信息:

java

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) {
        String appKey = "your_app_key";
        String appSecret = "your_app_secret";
        String keyword = "iPhone 13";
        int page = 1;
        String response = TaobaoProductSearchCrawler.searchTaobaoProducts(appKey, appSecret, keyword, page);
        if (response != null) {
            parseResponse(response);
        }
    }

    public static void parseResponse(String jsonResponse) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode rootNode = objectMapper.readTree(jsonResponse);
            int code = rootNode.path("code").asInt();
            String errorMessage = rootNode.path("errorMessage").asText();
            if (code == 0) {
                JsonNode itemsNode = rootNode.path("item_search_response").path("items");
                for (JsonNode itemNode : itemsNode) {
                    String title = itemNode.path("title").asText();
                    String price = itemNode.path("price").asText();
                    String picUrl = itemNode.path("pic_url").asText();
                    String detailUrl = itemNode.path("detail_url").asText();
                    System.out.println("商品标题: " + title);
                    System.out.println("商品价格: " + price);
                    System.out.println("商品图片: " + picUrl);
                    System.out.println("商品详情页 URL: " + detailUrl);
                }
            } else {
                System.out.println("API 请求失败,错误信息: " + errorMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、注意事项与优化建议

1. 遵守淘宝开放平台的使用规范

在使用淘宝 API 时,务必遵守其使用规范,避免频繁请求导致 IP 被封禁。

2. 合理设置请求间隔

为了降低对淘宝服务器的压力,建议在请求之间设置合理的间隔时间,例如使用 Thread.sleep() 方法。

3. 异常处理

在实际应用中,网络请求可能会遇到各种异常情况,如网络超时、数据格式错误等。因此,需要在代码中添加完善的异常处理逻辑,确保爬虫的稳定运行。

通过上述步骤,您可以轻松实现一个按关键字搜索淘宝商品的 Java 爬虫。希望这篇文章对您有所帮助!


请登录后查看

one-Jason 最后编辑于2025-07-09 11:05:36

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}}
沙发 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打赏
已打赏¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打赏
已打赏¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
打赏
已打赏¥{{reward_price}}
40
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定
打赏金额
当前余额:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
请输入 0.1-{{reward_max_price}} 范围内的数值
打赏成功
¥{{price}}
完成 确认打赏

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服