爬虫自动转码,获取城市列表:城市名称+URL

次序 · · 990 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

//下载插件工具
go get -v github.com/gpmgo/gopm

//自动导入包插件
gopm get -g -v golang.org/x/tools/cmd/goimports

//转码插件
gopm get -g -v golang.org/x/text

//自动检测网页编码
gopm get -g -v golang.org/x/net/html

package main

import (
    "net/http"
    "io/ioutil"
    "fmt"
    "golang.org/x/text/transform"
    "io"
    "golang.org/x/text/encoding"
    "golang.org/x/net/html/charset"
    "bufio"
    "regexp"
)

func main() {
    resp, err := http.Get("http://www.zhenai.com/zhenghun")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
        fmt.Println("Error:status code", resp.StatusCode)
        return
    }
    e := determinEncoding(resp.Body)
    utf8Reader := transform.NewReader(resp.Body, e.NewDecoder())
    all, err := ioutil.ReadAll(utf8Reader)
    if err != nil {
        panic(err)
    }
    printCityList(all)

}
func printCityList(contents []byte) {
    re := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-0a-z]+)"[^>]*>([^<]+)</a>`)
    matches := re.FindAllSubmatch(contents, -1)
    for _, m := range matches {
        fmt.Printf("City: %s, URL: %s\n", m[2], m[1])
    }
    fmt.Printf("Matches found:%d\n", len(matches))
}

func determinEncoding(r io.Reader) encoding.Encoding {
    bytes, err := bufio.NewReader(r).Peek(1024)
    if err != nil {
        panic(err)
    }
    e, _, _ := charset.DetermineEncoding(bytes, "")
    return e
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:次序

查看原文:爬虫自动转码,获取城市列表:城市名称+URL

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

990 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传