省市區獲取,根據 中國行政區劃程式碼及淘寶部分資料整合而成
阿新 • • 發佈:2018-12-13
爬蟲爬 省市區資料
中國行政區劃程式碼
統計用區劃和城鄉劃分程式碼
目的
原始碼編譯
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("=======資料儲存成功=======") }