1. 程式人生 > >省市區獲取,根據 中國行政區劃程式碼及淘寶部分資料整合而成

省市區獲取,根據 中國行政區劃程式碼及淘寶部分資料整合而成

爬蟲爬 省市區資料

中國行政區劃程式碼

統計用區劃和城鄉劃分程式碼

目的

原始碼編譯

go get -u github.com/foxiswho/area-go

執行

cd $GOPATH/src/github.com/foxiswho/area-go/
go run area.go

生成後文件:$GOPATH/src/github.com/foxiswho/area-go/area.js

輸出結果

=======獲取資料======

=======獲取成功=====
=======格式化資料=====

=======格式化 擴充套件資料=====
=======處理成功=====
===================
=======  寫入到檔案 area.js    ============
=======  路徑: $GOPATH/src/github.com/foxiswho/area-go/area.js    ============
=======  寫入到檔案 area.sql    ============
=======  路徑: $GOPATH/src/github.com/foxiswho/area-go/area.sql    ============
===================
=======資料儲存成功=======

爬蟲部分使用的是 goquery

GO 語言版 JQUERY — GOQUERY
做過 Web 開發的,應該都用過或聽過 jQuery,它提供了方便的操作 DOM 的 API。使用 Go 語言做伺服器端開發,有時候需要解析 HTML 檔案,比如抓取網站內容、寫一個爬蟲等。這時候如果有一個類似 jQuery 的庫可以使用,操作 DOM 會很方便,而且,上手也會很快。github.com/PuerkitoBio/goquery 這個庫就實現了類似 jQuery 的功能,讓你能方便的使用 Go 語言操作 HTML 文件。
更多介紹 http://blog.studygolang.com/2015/04/go-jquery-goquery/

爬取原始碼 area.go

package main

import (
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"github.com/foxiswho/area-go/mca.gov"
	"github.com/foxiswho/area-go/util"
	"log"
	"math"
	"net/http"
	"strconv"
)

//被爬地址
const SITE = "http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20180708230813.html"

//儲存變數
var area map[int]string
var areaSort = []int{}
//格式化後儲存
var areaFormat map[int]map[int]string
//頂級ID
const topLevelId = 86

const JSON_FILE = "area.js"
const SQL_FILE = "area.sql"

//資料 獲取
func GetAreaData() {
	res, err := http.Get(SITE)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}
	// Load the HTML document
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	area = make(map[int]string)

	doc.Find("tr").Each(func(i int, s *goquery.Selection) {
		if node := s.Find(".xl708733").Nodes; node != nil {
			if len(node) >= 2 {
				//fmt.Println(node[0]," = ",node[1])
				//fmt.Println(s.Find("td.xl708733").Eq(0).Text())
				id := s.Find("td.xl708733").Eq(0).Text()
				if id != "" {
					key, _ := strconv.Atoi(id)
					value := s.Find("td.xl708733").Eq(1).Text()
					area[key] = value
					areaSort = append(areaSort, key)
				}
			}
		}
	})
	//fmt.Println(area)
	fmt.Println(len(area))
}

//格式化資料
func FormatArea() {
	//初始化
	areaFormat = make(map[int]map[int]string)
	//
	for index := range areaSort {
		key := areaSort[index]
		value := area[key]
		modTmp := key % 1000
		//省份
		if modTmp == 0 {
			//是否初始化
			if areaFormat[topLevelId] == nil {
				areaFormat[topLevelId] = make(map[int]string)
			}
			maps := areaFormat[topLevelId]
			maps[key] = value
			areaFormat[topLevelId] = maps
			//直轄市處理
			formatMunicipality(key)
		} else { //市縣
			modCity := modTmp % 100
			//市
			if modCity == 0 {
				tmp := math.Floor(float64(key) / 1000)
				province := int(tmp) * 1000
				if areaFormat[province] == nil {
					areaFormat[province] = make(map[int]string)
				}
				maps := areaFormat[province]
				maps[key] = value
				areaFormat[province] = maps
			} else {
				//縣區
				tmp := math.Floor(float64(key) / 100)
				city := int(tmp) * 100
				if areaFormat[city] == nil {
					areaFormat[city] = make(map[int]string)
				}
				maps := areaFormat[city]
				maps[key] = value
				areaFormat[city] = maps
			}
		}
		//break
	}

	//fmt.Println(areaFormat)
	fmt.Println(len(areaFormat))
	//str, err := json.Marshal(&areaFormat)
	//if err != nil {
	//	fmt.Println("序列化失敗:", err)
	//}
	//fmt.Println("JSON:", str)
}

//直轄市處理
func formatMunicipality(id int) {
	province := int(id/1000) * 1000
	city := int((id/100)+1) * 100
	//直轄市
	municipality := make(map[int]string)
	municipality[110100] = "北京市"
	municipality[120100] = "天津市"
	municipality[310100] = "上海市"
	municipality[500100] = "重慶市"
	if ok := municipality[city]; ok != "" {
		if areaFormat[province] == nil {
			areaFormat[province] = make(map[int]string)
		}
		maps := areaFormat[province]
		maps[city] = ok
		areaFormat[province] = maps
	}
}

func saveFile() {
	str := util.ObjToJson(&areaFormat)
	//
	util.SaveFile(str, JSON_FILE)
}

//擴充套件資料填充
func formatExtData() {
	//
	mca_gov.ReadExt()
	//
	for key, _ := range mca_gov.AreaFormatExt {
		if key > 86 {
			areaFormat[key] = mca_gov.AreaFormatExt[key]
		}
	}

	//str := util.ObjToJson(&areaFormat)
	////
	//util.SaveFile(str, "ext.js")
}

func saveSqlFile() {
	str := ""
	str = util.GetCreateTableSql()+"\n\n"
	str += util.MakeSql(areaFormat)
	//Sql
	util.SaveFile([]byte(str), SQL_FILE)
}

func main() {
	fmt.Println("=======獲取資料======")
	GetAreaData()
	fmt.Println("=======獲取成功=====")
	fmt.Println("=======格式化資料=====")
	//
	FormatArea()
	fmt.Println("=======格式化 擴充套件資料=====")
	//
	formatExtData()
	fmt.Println("=======處理成功=====")
	//
	fmt.Println("===================")
	//
	fmt.Println("=======  寫入到檔案 " + JSON_FILE + "    ============")
	fmt.Println("=======  路徑: $GOPATH/src/github.com/foxiswho/area-go/" + JSON_FILE + "    ============")
	//
	saveFile()
	//
	fmt.Println("=======  寫入到檔案 " + SQL_FILE + "    ============")
	fmt.Println("=======  路徑: $GOPATH/src/github.com/foxiswho/area-go/" + SQL_FILE + "    ============")
	saveSqlFile()
	fmt.Println("===================")
	fmt.Println("=======資料儲存成功=======")
}