package main
import (
"os"
"strconv"
"encoding/csv"
"io/ioutil"
"fmt"
"net/http"
"encoding/json"
)
//产品数据类型
type ExcelData map[string][][]string
//总页数类型
type numPageData map[string]int
// 获取总页数的url
//api返回数据格式为 {"count":5}
var pageNumUrl string = "http://xxx.com/catalog/product/num";
// 获取产品的url
/*
{'data' =>
[
['terry','1','2','3'],
['water','11','22','33'],
['xxx','111','222','333'],
]
}
*/
var dataUrl string = "http://xxx.com/catalog/product/products";
func main() {
// 新建文件/root/go/data,并设置成777即可,不用新建csv文件
f, err := os.Create("/root/go/data/quarkscm_product_3.csv")
if err != nil {
panic(err)
}
defer f.Close()
f.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
w := csv.NewWriter(f)
pageNum := getPageNum();
// 按照总页数循环
for i:=1 ; i <= pageNum ; i++ {
fmt.Println("pageNum: d%", i);
// 得到产品
excel_data := getProductData(i);
// 遍历数据,写入csv
for _,v1 := range excel_data["data"]{
w.Write(v1)
}
}
w.Flush()
}
// 通过api得到总页数
func getPageNum() int{
resp, err := http.Get(pageNumUrl)
fmt.Println("pageNumUrl: s%", pageNumUrl)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var result numPageData
err = json.Unmarshal(data, &result)
if err != nil {
panic(err)
}
fmt.Println("pageNumPage:", result["count"])
return result["count"]
}
// 通过api获取产品
func getProductData(p int) ExcelData{
dataUrlP := dataUrl + "?page=" + strconv.Itoa(p) ;
fmt.Println("dataUrlP: s%",dataUrlP)
resp, err := http.Get(dataUrlP)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
//fmt.Printf("%s\n", data)
var result ExcelData
err = json.Unmarshal(data, &result)
if err != nil {
panic(err)
}
//fmt.Println("result:", result)
return result
}