跳过正文
用go语言爬取珍爱网 | 第一回
  1. Posts/

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

·647 字·2 分钟· · ·
Golang 爬虫
小碗汤
作者
小碗汤
云原生搬砖师

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\n", 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\n", 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和城市,下一节见。


-------莫愁前路无知己 天下谁人不识君-------

相关文章

用go语言爬取珍爱网 | 第二回
·1283 字·3 分钟·
Golang 爬虫
用go语言爬取珍爱网 | 第三回
·3629 字·8 分钟·
Golang 爬虫
爬虫性能分析及优化
·894 字·2 分钟·
Golang 爬虫
爬虫遇到了点问题
·524 字·2 分钟·
Golang 爬虫
爬取珍爱网后用户信息展示
·3431 字·7 分钟·
Golang 爬虫
golang 设置 http response 响应头与坑
·1148 字·3 分钟·
Golang

公众号二维码