• 用go语言爬取珍爱网 | 第一回


    image

    我们来用go语言爬取“珍爱网”用户信息。

    首先分析到请求url为:

    http://www.zhenai.com/zhenghun

    image

    接下来用go请求该url,代码如下:

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "net/http"
    )
    
    func main() {
    
     //返送请求获取返回结果
     resp, err := http.Get("http://www.zhenai.com/zhenghun")
    
     if err != nil {
       panic(fmt.Errorf("Error: http Get, err is %v
    ", err))
     }
    
     //关闭response body
     defer resp.Body.Close()
    
     if resp.StatusCode != http.StatusOK {
       fmt.Println("Error: statuscode is ", resp.StatusCode)
       return
     }
    
     body, err := ioutil.ReadAll(resp.Body)
    
     if err != nil {
       fmt.Println("Error read body, error is ", err)
     }
    
     //打印返回值
     fmt.Println("body is ", string(body))
    }
    

    运行后会发现返回体里有很多乱码:

    image

    在返回体里可以找到 即编码为gbk,而go默认编码为utf-8,所以就会出现乱码。接下来用第三方库将其编码格式转为utf-8。

    由于访问golang.org/x/text需要梯子,不然报错:

    image

    所以在github上下载:

    mkdir -p $GOPATH/src/golang.org/x
    cd $GOPATH/src/golang.org/x
    git clone https://github.com/golang/text.git
    

    然后将gbk编码转换为utf-8,需要修改代码如下:

    utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
    body, err := ioutil.ReadAll(utf8Reader)
    

    考虑到通用性,返回的编码格式不一定是gbk,所以需要对实际编码做判断,然后将判断结果转为utf-8,需要用到第三方库golang.org/x/net/html,同样的在github上下载:

    mkdir -p $GOPATH/src/golang.org/x
    cd $GOPATH/src/golang.org/x
    git clone https://github.com/golang/net
    

    那么代码就变成这样:

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "net/http"
     "golang.org/x/text/transform"
     //"golang.org/x/text/encoding/simplifiedchinese"
     "io"
     "golang.org/x/text/encoding"
     "bufio"
     "golang.org/x/net/html/charset"
    )
    
    func main() {
    
     //返送请求获取返回结果
     resp, err := http.Get("http://www.zhenai.com/zhenghun")
    
     if err != nil {
       panic(fmt.Errorf("Error: http Get, err is %v
    ", err))
     }
    
     //关闭response body
     defer resp.Body.Close()
    
     if resp.StatusCode != http.StatusOK {
       fmt.Println("Error: statuscode is ", resp.StatusCode)
       return
     }
    
     //utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
     utf8Reader := transform.NewReader(resp.Body, determinEncoding(resp.Body).NewDecoder())
     body, err := ioutil.ReadAll(utf8Reader)
    
     if err != nil {
       fmt.Println("Error read body, error is ", err)
     }
    
     //打印返回值
     fmt.Println("body is ", string(body))
    }
    
    func determinEncoding(r io.Reader) encoding.Encoding {
    
     //这里的r读取完得保证resp.Body还可读
     body, err := bufio.NewReader(r).Peek(1024)
    
     if err != nil {
       fmt.Println("Error: peek 1024 byte of body err is ", err)
     }
    
     //这里简化,不取是否确认
     e, _, _ := charset.DetermineEncoding(body, "")
     return e
    }
    

    运行后就看不到乱码了:

    image

    今天先爬到这里,明天将提取返回体中的地址URL和城市,下一节见。



    本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。


    扫码关注,精彩内容第一时间推给你

    image

  • 相关阅读:
    《C++ Primer》学习笔记第2章 变量和基本类型
    Java学习笔记类的继承与多态特性
    Java的冒泡排序问题
    新起点,分享,进步
    MVC2中Area的路由注册实现
    了解一下new关键字实现阻断继承的原理
    利用Bing API开发的搜索工具(MVC+WCF)
    ASP.NET MVC中错误处理方式
    const和readonly内部区别
    WCF中校验参数的实现方式(一)
  • 原文地址:https://www.cnblogs.com/liabio/p/11696028.html
Copyright © 2020-2023  润新知