通过淘宝接口获取淘宝全部商品目录实例

最近项目需要,要获取淘宝商品全部类目结构,有两种方法,1. 可以通过爬虫技术实现, 2. 通过淘宝开放接口实现。

这里选用第2种方法,以下是实现过程:

1. 首先要申请成为淘宝开发者

http://open.taobao.com/index.htm

2. 进入后台后,新建一个应用,得到一个app证书,证书里面有Appkey 和 Appsecret (Appsecret为 API 调用的密钥要注意保密,如泄漏要及时重置)

3. 调用淘宝接口还需要一个 sissionid,通过以下方式得到,

访问URL:   http://container.api.taobao.com/container?appkey=你的AppKey

登录你的淘宝账号,授权确认后在回调的URL中即可得到sissionid

示例:http://www.xxx.com/?top_appkey=xxx&top_parameters=xxx&top_session=你的SessionID&top_sign=xxx

4. 主程序代码GetCategory.java

这里解析json的数据结构用到fastjson开源包(网上搜索一下,这里用的是 fastjson-1.1.34.jar ),

  1 import java.text.SimpleDateFormat;
  2 import java.util.Date;
  3 import java.util.Iterator;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.TreeMap;
  7 import java.util.regex.Matcher;
  8 import java.util.regex.Pattern;
  9
 10 import com.alibaba.fastjson.JSONArray;
 11
 12 import java.io.File;
 13 import java.io.FileOutputStream;
 14 import java.io.IOException;
 15
 16 public class GetCategory {
 17       //protected static String Url = "http://gw.api.tbsandbox.com/router/rest";//沙箱环境调用地址
 18      protected static String Url = "http://gw.api.taobao.com/router/rest";//正式环境调用地址
 19      protected static String appkey = 你的AppKey;
 20      protected static String secret = 你的APPSecret;
 21      protected static String session = 你的SesionID;
 22      protected static File file = new File("c:/cats.txt");
 23      protected static FileOutputStream fop = null;
 24
 25      //调用淘宝接口,获取父目录下的子目录(以json数据格式返回)
 26      public static String getCat(String parent_cid){
 27          TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
 28          apiparamsMap.put("format", "json");//以json数据格式返回
 29          apiparamsMap.put("method", "taobao.itemcats.get"); //获取类目函数
 30          apiparamsMap.put("sign_method","md5");
 31          apiparamsMap.put("app_key",appkey); //appkey
 32          apiparamsMap.put("v", "2.0");//版本
 33          apiparamsMap.put("session",session);//sessionID
 34          String timestamp =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
 35          apiparamsMap.put("timestamp",timestamp);//时间
 36
 37          apiparamsMap.put("fields","cid,parent_cid,name,is_parent");//需要获取的字段
 38          apiparamsMap.put("parent_cid",parent_cid); //父目录id
 39
 40          //生成签名
 41          String sign = Util.md5Signature(apiparamsMap,secret);
 42          apiparamsMap.put("sign", sign);
 43          StringBuilder param = new StringBuilder();
 44          for (Iterator<Map.Entry<String, String>> it = apiparamsMap.entrySet()
 45          .iterator(); it.hasNext();) {
 46              Map.Entry<String, String> e = it.next();
 47              param.append("&").append(e.getKey()).append("=").append(e.getValue());
 48          }
 49          return param.toString().substring(1);
 50      }
 51
 52      //根据父目录递归获取子目录,并写入txt文件
 53      public static void getAllCats(String root) throws IOException{
 54          String result = Util.getResult(Url,getCat(root));
 55          //System.out.print(result);
 56          if(result == null || result.length()==0)
 57          {
 58              System.out.print("root:"+ root + " result null");//获取不到,记录下来后面再手动补充
 59              return;
 60          }
 61 //         String result ="{\"itemcats_get_response\":{\"item_cats\":{\"item_cat\":[{\"cid\":121266001,\"is_parent\":true,\"name\":\"众筹\",\"parent_cid\":0},"
 62 //                 + "{\"cid\":120950001,\"is_parent\":true,\"name\":\"保险分销\",\"parent_cid\":0},"
 63 //                 + "{\"cid\":124470006,\"is_parent\":true,\"name\":\"平行进口车\",\"parent_cid\":0}]},\"request_id\":\"ze1ym5zcokd2\"}}";
 64          Pattern p = Pattern.compile("\"item_cat\":(.*)},\"request_id\":");//提取item_cat部分内容
 65          Matcher m = p.matcher(result);
 66          if (m.find()) {
 67              String catsJsonstr = m.group(1);
 68             List<item_cat> cats = JSONArray.parseArray(catsJsonstr, item_cat.class);
 69             for (int i = 0; i < cats.size(); i++) {
 70                 item_cat cat = cats.get(i);
 71                 String content = cat.cid + "," + cat.name + "," + cat.parent_cid + "," + cat.is_parent + "\r\n";//写入内容,一个类目一行记录
 72                 byte[] contentInBytes = content.getBytes();
 73                 fop.write(contentInBytes);//写入文件
 74                 fop.flush();
 75                 if (cat.is_parent.equals("true")) {
 76                     getAllCats(cat.cid);
 77                 }
 78             }
 79         }
 80     }
 81
 82     public static void getTaobaoCats() {
 83         try {
 84             //打开文件
 85             fop = new FileOutputStream(file);
 86             // if file doesn‘t exists, then create it
 87             if (!file.exists()) {
 88                 file.createNewFile();
 89             }
 90             //获取顶层根目录(0)
 91             getAllCats("0");
 92             //关闭文件
 93             fop.close();
 94             System.out.println("Done");
 95         } catch (IOException e) {
 96             e.printStackTrace();
 97         }
 98     }
 99
100     public static void main(String[] args) {
101         //获取所有类目,并写入txt文件
102         getTaobaoCats();
103      }
104 }

代码中用到的类目的实体类:item_cat.java

 1 public class item_cat {
 2     /**
 3      * 类目id
 4      */
 5     public String cid;
 6     /**
 7      * 是否为父目录
 8      */
 9     public String is_parent;
10     /**
11      * 父目录ID
12      */
13     public String parent_cid;
14     /**
15      * 目录名称
16      */
17     public String name;
18     public item_cat() {
19         super();
20         // TODO Auto-generated constructor stub
21     }
22     public item_cat(String cid, String is_parent, String parent_cid, String name) {
23         super();
24         this.cid = cid;
25         this.is_parent = is_parent;
26         this.parent_cid = parent_cid;
27         this.name = name;
28     }
29     public String getCid() {
30         return cid;
31     }
32     public void setCid(String cid) {
33         this.cid = cid;
34     }
35     public String getIs_parent() {
36         return is_parent;
37     }
38     public void setIs_parent(String is_parent) {
39         this.is_parent = is_parent;
40     }
41     public String getName() {
42         return name;
43     }
44     public void setName(String name) {
45         this.name = name;
46     }
47     @Override
48     public String toString() {
49         return "item_cat [cid=" + cid + ", is_parent=" + is_parent + ", parent_cid=" + parent_cid + ", name=" + name + "]";
50     }
51 }

最后获取到的文件内数据格式如下:

类目ID,类目名称,父类目ID,是否为父目录

121266001,众筹,0,true
121278001,影音,121266001,false
121280001,公益,121266001,false
121274002,书籍,121266001,false
121284001,娱乐,121266001,false
121288001,科技,121266001,false

...

刚好是一张自关联的目录结构表。

时间: 2024-10-08 22:18:53

通过淘宝接口获取淘宝全部商品目录实例的相关文章

使用大淘客接口获取产品数据

使用大淘客获取优惠券产品列表 1.申请大淘客账号 2.申请开放平台权限(一般1-3天就可以开通成功) 3.创建应用,创建成功如图所示 这个以9块9包邮为例,获取数据(9.9文档 http://www.dataoke.com/pmc/api-d.html?id=15) 所用到的自定义函数函数如下 /* * 发起GET网络提交 * @params string $url : 网络地址 */ function https_get($url) { $curl = curl_init(); curl_se

订餐系统之获取淘宝外卖订单

当时的情况是这样的:我们一个客户用了我们的订餐系统,也在淘宝外卖上开了店,但是订餐系统中的订单都要通过调度系统,根据配送员的位置,把订单发送给合适的配送员,所以要把淘宝外卖的订单加到订餐系统中(据说淘宝外卖也是因为味捷外卖才开发这个接口的). 淘宝外卖提供的接口我知道的有三个,1.获取未确认的订单:2.确认订单:3.拒绝订单.所以订餐系统要做的就是从淘宝外卖获取未确认的订单.确认订单并加入订餐系统. 开放平台地址: http://open.taobao.com/doc/api_cat_detai

获取淘宝订单的解决方案——转

项目需求: 需求很简单,就是想获取淘宝的订单: 获取淘宝订单的几种方式: 聚石塔: 首先是该商家必须已经入驻了聚石塔,因为聚石塔可以共享改商家的淘宝.天猫.阿里云.支付宝等信息.所以你可以通过该商家的聚石塔账号来调取订单信息. 实现难度:★★ 使用率:★★ 因为只要有商家的聚石塔账号,就可以让商家给你提供API接口,去调用该商家的淘宝,天猫订单信息,所以实现难度不大,但是使用率很低.因为入驻聚石塔的商家基本上都是大商家,而且入驻聚石塔的条件也比较苛刻. 物流宝: taobao.logistics

淘宝接口实现ip归属地查询

<?php header('content-type:text/html;charset=utf-8'); /*获取当前ip归属地 调用淘宝接口 */ function get_ip_place($ip){ $jsonip=file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip); return $jsonip; } /*获取客户端ip*/ function getip() { if(geten

征信接口之淘宝API接口

小贷公司对用户征信数据的把控只能依赖传统的央行征信这一单一维度,当需要验证用户购买力.住址稳定性.工作单位地址等特征时,往往会很无力. 贷款用户的淘宝数据包含了贷款人的消费能力.收货地址稳定性等特征,在已有的技术方案上,要获取淘宝数据需自行研发爬虫,将碰到以下困难: 1 淘宝登录机制的破解,具体表现在破解人工验证码.用户身份特征.高频IP.异地登录等. 2 通过个人资料页.地址页.订单页的多重内页.二级内页解析数据. 3 当淘宝改版时,解析规则必须同步升级,否则失败. 4 当多用户同时授权淘宝数

调用淘宝接口有每IP数量/时间限制-负载均衡解决

其实标题不太准确,不过原理是一样. 这里要解决的问题是:调用淘宝接口有每IP数量/时间限制,但是我们的调用量较大,有可能超过这个限制,从而导致可能被淘宝屏蔽一小段时间.为了解决这个问题,我们需要用多个公网ip去掉接口.而实现这一点的最好地方就是在路由器这一级别. 简要做法如下: 1)做一台linux路由器,它负责接受内网对淘宝的调用请求,然后平均分发到多个公网接口.具体是两个步骤:a)使用iptables标记(FWMARK)数据包:b)然后根据这个标记匹配不同的策略路由来分发到不同网卡接口. 2

Beatiful Soup获取淘宝商品详情

Beatiful Soup生成商品详情页面的剖析树, 主要函数:findAll(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs) 利用findAll先获取标签范围的内容,再利用正则表达式进行匹配输出. Beatiful Soup的中文文档: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#Searching%20t

爬虫实战【8】Selenium解析淘宝宝贝-获取多个页面

作为全民购物网站的淘宝是在学习爬虫过程中不可避免要打交道的一个网站,而是淘宝上的数据真的很多,只要我们指定关键字,将会出现成千上万条数据. 今天我们来讲一下如何从淘宝上获取某一类宝贝的信息,比如今天我们以"手机"作为关键词,举个例子. 分析页面的源代码 [插入图片,淘宝手机页面示意] 上面是搜索框,下面显示了很多宝贝信息,最下面是翻页的控制按钮. [插入图片,淘宝手机页面源代码] 我们看一下这个页面的源代码,发现都是一些js,还提示了要运行脚本才能显示. 难道宝贝也是Ajax加载的?我

淘宝小号出售{淘宝知识之淘宝经验}教你如何正确发帖、回帖

淘宝白号淘宝白号淘宝白号 结论:如果你对自己的帖子足够自信,并且没有什么特殊要求,那么你就大胆地把帖子发到这里吧. 这一点看似不值得讨论,有的淘友便会说:"当然是经验畅谈居啦,这里的人气这么旺."但是且慢马上下结论,凡事都有利弊两面,经验居人气旺,一方面意味着发在这里的帖子更容易被人看到,另一方面也由于在这里发的帖子多,你的帖子也将更快下沉,也就是说你的帖子发在别的版块被阅读的可能反而更多,所以发在经验畅谈居的帖子,应该是好帖,大家才会不断地帮你把帖子顶上来,这样你的帖子才会被更多的人