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

首先分析到请求url为:

http://www.zhenai.com/zhenghun

接下来用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))
}

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

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

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

所以在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
}

运行后就看不到乱码了:

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



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


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

最新文章

  1. iOS 小知识点(持续更新)
  2. 【转载】Log4j详细使用教程
  3. chrome浏览器调用 ajax 提示net::ERR_INCOMPLETE_CHUNKED_ENCODING问题解决方案,以及 Response.Close 和 Response.End 的一些问题。
  4. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
  5. PaintCode调研
  6. Oracle EBS中查询Profile的各种SQL【转载】
  7. 【数据结构与算法分析——C语言描述】第二章总结 算法分析
  8. 用 const 限定类的成员函数
  9. Fox-H 函数
  10. 重学C语言 -- printf,scanf
  11. ant来历
  12. 【转】android移植之request_suspend_state: wakeup & init: untracked pid xx exited问题的解决
  13. windows media player 中播放pls的方法
  14. Swift - 产生不重复数字的随机数生成器
  15. 在O(1)时间删除指定链表结点
  16. cronlog分割tomcat catalina.out日志
  17. Swift基础之Swift调用OC语言文件使用步骤
  18. 一张图看懂AR至GL数据流
  19. 微服务与Spring Cloud资料
  20. Rolling in the Deep (Learning)

热门文章

  1. lambda表达式与匿名内部类与双冒号(::)
  2. Markdown 直接转换公众号文章,不再为排版花时间
  3. JSP获取网络IP地址
  4. C++11新增容器以及元组
  5. Fragment的创建与通信
  6. Linux、Windows 和 Mac 中的换行符对比
  7. 12 (OC)* AFNetworking
  8. App引流增长技术:Deeplink(深度链接)技术
  9. [LeetCode] 由 “分形" 所想
  10. 【linux】【sonarqube】安装sonarqube7.9