爬取行政区代码

练习写的,比较烂

PHP

<?php
function http_request($url, $params = array(), $method = 'GET', $json = TRUE, $timeout = 10)
{

    $ch = curl_init();
    $method = strtoupper($method);
    if ($method == 'GET') {
        if (!empty($params)) {
            $url .= '?' . http_build_query($params, '', '&');
        }

        curl_setopt($ch, CURLOPT_URL, $url);
    } else if ($method == 'POST') {
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($ch);
    curl_close($ch);

    if ($json) {
        return json_decode($content, true);
    } else {
        return $content;
    }
}

$request = http_request("http://cnis.7east.com/widget.do?type=service&ajax=yes&action=cnislist", [], 'post');
$data = [];
foreach ($request['rows'] as $value) {
    $data[$value['code']]['local_name'] = $value['local_name'];
    $second_data = http_request("http://cnis.7east.com/widget.do?type=service&action=cnischildlist&a=2&ajax=yes&pid={$value['region_id']}");
    foreach ($second_data['rows'] as $row) {
        $data[$value['code']]['children'][$row['code']]['local_name'] = $row['local_name'];
        $third_data = http_request("http://cnis.7east.com/widget.do?type=service&action=cnischildlist&a=2&ajax=yes&pid={$row['region_id']}");
        foreach ($third_data['rows'] as $item) {
            $data[$value['code']]['children'][$row['code']]['children'][$item['code']]['local_name'] = $item['local_name'];
        }
    }
}

echo json_encode($data);

go

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"math"
	"net/http"
	"net/url"
	"strconv"
	"time"
)

// v.(map[string]interface{}) v原本为interface 这里意思是转类型为map interface转其他类型v.(type)
// 结构体必须是首字母大写 不然会被忽略
type RequestData struct {
	Total int
	Rows  []map[string]interface{} // []为切片类型,切片可以不写长度的申明  map为map类型[键的类型]值的类型
}

func main() {
	t1 := time.Now()
	//需要post的数据,以key-value形式提交
	data := make(url.Values)
	//data["appId"] = []string{"10001"}
	//data["appKey"] = []string{"test"}
	//data["option"] = []string{"upload"}
	//data["sign"] = []string{"1111"}

	res, err := http.PostForm("http://cnis.7east.com/widget.do?type=service&ajax=yes&action=cnislist", data)
	//设置http中header参数,可以再此添加cookie等值
	//res.Header.Add("User-Agent", "***")
	//res.Header.Add("http.socket.timeou", 5000)

	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	//fmt.Println(string(body))

	//requestData := make(map[string]interface{}) // json字符转map interface{}这个目前不是很懂,反正不确定value值类型的时候这样子写就ok了

	// json转结构
	requestData := RequestData{}
	json.Unmarshal([]byte(string(body)), &requestData)

	arr := requestData.Rows
	var lastSlice []map[string]interface{}
	for _, v := range arr {
		lastMap := make(map[string]interface{}) // 申明初始化一个map map是个引用类型,所以要在循环里面创建,不然就会覆盖之前的值
		lastMap["code"] = v["code"]
		lastMap["name"] = v["local_name"]
		lastMap["region_id"] = v["region_id"]
		children := getChildren(v["region_id"].(float64)) // 这里不能直接转int 报错说这里是float64类型
		if children != nil {
			lastMap["children"] = children
		}
		lastSlice = append(lastSlice, lastMap)
	}

	// 转json
	str, err := json.Marshal(lastSlice)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("map to json", string(str))

	elapsed := time.Since(t1)
	fmt.Println(elapsed)
}

func getChildren(id float64) []map[string]interface{} {
	data := make(url.Values)
	id = math.Floor(id)                              // 下取整 本来以为转整后就是int了,结果是我想多了,这步意义不大,下面是float64toString的方法
	idString := strconv.FormatFloat(id, 'f', -1, 64) // float64toString 如果是float32最后的参数就是32 第二个参数如下
	// 'b' (-ddddp±ddd,二进制指数)
	// 'e' (-d.dddde±dd,十进制指数)
	// 'E' (-d.ddddE±dd,十进制指数)
	// 'f' (-ddd.dddd,没有指数)
	// 'g' ('e':大指数,'f':其它情况)
	// 'G' ('E':大指数,'f':其它情况)
	res, err := http.PostForm("http://cnis.7east.com/widget.do?type=service&action=cnischildlist&a=2&ajax=yes&pid="+idString, data)
	//设置http中header参数,可以再此添加cookie等值
	//res.Header.Add("User-Agent", "***")
	//res.Header.Add("http.socket.timeou", 5000)

	if err != nil {
		fmt.Println(err.Error())
		return nil
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	//fmt.Println(string(body))
	// json转结构
	requestData := RequestData{}
	json.Unmarshal([]byte(string(body)), &requestData)
	arr := requestData.Rows
	if len(arr) == 0 {
		return nil
	}
	var lastSlice []map[string]interface{}
	for _, v := range arr {
		lastMap := make(map[string]interface{}) // 申明初始化一个map map是个引用类型,所以要在循环里面创建,不然就会覆盖之前的值
		lastMap["code"] = v["code"]
		lastMap["name"] = v["local_name"]
		lastMap["region_id"] = v["region_id"]
		if v["layer"].(float64) < 3 {
			fmt.Println(v["local_name"])
			children := getChildren(v["region_id"].(float64)) // 这里不能直接转int 报错说这里是float64类型
			if children != nil {
				lastMap["children"] = children
			}
		}
		lastSlice = append(lastSlice, lastMap)
	}
	return lastSlice
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值