zoukankan      html  css  js  c++  java
  • 用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

  • 相关阅读:
    CAAnimation动画相关文章
    [源代码]List的增加与删除
    [原创]c# 类中 Collection 字段初始化的特殊之处
    c# 多数值区间判断是否有重叠
    将M个客服随机分配给N个客户
    c# IList.ToList()后更改元素值会不会影响原列表的值
    java单元测试之Mock静态方法
    java的Spring学习2- junit和mock
    java mybatis学习二
    java8 方法引用与lambda
  • 原文地址:https://www.cnblogs.com/liabio/p/11696028.html
Copyright © 2011-2022 走看看