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

首先分析到请求url为:

http://www.zhenai.com/zhenghun

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

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. )
  7. func main() {
  8. //返送请求获取返回结果
  9. resp, err := http.Get("http://www.zhenai.com/zhenghun")
  10. if err != nil {
  11. panic(fmt.Errorf("Error: http Get, err is %v\n", err))
  12. }
  13. //关闭response body
  14. defer resp.Body.Close()
  15. if resp.StatusCode != http.StatusOK {
  16. fmt.Println("Error: statuscode is ", resp.StatusCode)
  17. return
  18. }
  19. body, err := ioutil.ReadAll(resp.Body)
  20. if err != nil {
  21. fmt.Println("Error read body, error is ", err)
  22. }
  23. //打印返回值
  24. fmt.Println("body is ", string(body))
  25. }

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

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

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

所以在github上下载:

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

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

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

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

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

那么代码就变成这样:

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "golang.org/x/text/transform"
  7. //"golang.org/x/text/encoding/simplifiedchinese"
  8. "io"
  9. "golang.org/x/text/encoding"
  10. "bufio"
  11. "golang.org/x/net/html/charset"
  12. )
  13. func main() {
  14. //返送请求获取返回结果
  15. resp, err := http.Get("http://www.zhenai.com/zhenghun")
  16. if err != nil {
  17. panic(fmt.Errorf("Error: http Get, err is %v\n", err))
  18. }
  19. //关闭response body
  20. defer resp.Body.Close()
  21. if resp.StatusCode != http.StatusOK {
  22. fmt.Println("Error: statuscode is ", resp.StatusCode)
  23. return
  24. }
  25. //utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
  26. utf8Reader := transform.NewReader(resp.Body, determinEncoding(resp.Body).NewDecoder())
  27. body, err := ioutil.ReadAll(utf8Reader)
  28. if err != nil {
  29. fmt.Println("Error read body, error is ", err)
  30. }
  31. //打印返回值
  32. fmt.Println("body is ", string(body))
  33. }
  34. func determinEncoding(r io.Reader) encoding.Encoding {
  35. //这里的r读取完得保证resp.Body还可读
  36. body, err := bufio.NewReader(r).Peek(1024)
  37. if err != nil {
  38. fmt.Println("Error: peek 1024 byte of body err is ", err)
  39. }
  40. //这里简化,不取是否确认
  41. e, _, _ := charset.DetermineEncoding(body, "")
  42. return e
  43. }

运行后就看不到乱码了:

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



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


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

用go语言爬取珍爱网 | 第一回的更多相关文章

  1. 用go语言爬取珍爱网 | 第三回

    前两节我们获取到了城市的URL和城市名,今天我们来解析用户信息. 用go语言爬取珍爱网 | 第一回 用go语言爬取珍爱网 | 第二回 爬虫的算法: 我们要提取返回体中的城市列表,需要用到城市列表解析器 ...

  2. 用go语言爬取珍爱网 | 第二回

    昨天我们一起爬取珍爱网首页,拿到了城市列表页面,接下来在返回体城市列表中提取城市和url,即下图中的a标签里的href的值和innerText值. 提取a标签,可以通过CSS选择器来选择,如下: $( ...

  3. python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍

    来啦,老弟 我们已经知道怎么使用 Requests 进行各种请求骚操作 也知道了对服务器返回的数据如何使用 正则表达式 来过滤我们想要的内容 ... 那么接下来 我们就使用 requests 和 re ...

  4. 使用python爬取东方财富网机构调研数据

    最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...

  5. Python爬虫之爬取慕课网课程评分

    BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...

  6. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...

  7. [转]使用python爬取东方财富网机构调研数据

    最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了 ...

  8. Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

  9. GoLang爬取花瓣网美女图片

    由于之前一直想爬取花瓣网(http://huaban.com/partner/uc/aimeinv/pins/) 的图片,又迫于没时间,所以拖了很久. 鉴于最近在学go语言,就刚好用这个练手了. 预览 ...

随机推荐

  1. CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录

    前言 Linux 基本的权限控制仅可以对所属用户.所属组.其他用户进行的权限控制,而不能精确地控制每个用户的权限.ACL 规则就是用来解决这个问题的. 使用 ACL 规则,我们可以针对单一账户设置文件 ...

  2. LaTeX 自动避免重复内容

    在编辑自动化文档时,很容易出现在文档多处提及相同内容的情况.例如,描述某具体设备的图片,在多个工艺中都会用到,而又无法确定工艺出现顺序,或者对于不同企业,工艺不尽相同.这时我们可能会希望,latex帮 ...

  3. kafka topic消息分配partition规则(Java源码)

    我们知道Kafka 的消息通过topic进行分类.topic可以被分为若干个partition来存储消息.消息以追加的方式写入partition,然后以先入先出的顺序读取. 下面是topic和part ...

  4. Net基础篇_学习笔记_第九天_数组_冒泡排序(面试常见题目)

    冒泡排序: 将一个数组中的元素按照从大到小或从小到大的顺序进行排列. for循环的嵌套---专项课题 int[] nums={9,8,7,6,5,4,3,2,1,0}; 0 1 2 3 4 5 6 7 ...

  5. 右键没有新建word选项

    两类解决办法 一. 1. 新建一个txt文本,并插入如下内容: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.doc] @=&quo ...

  6. 亮剑.NET学习札记

    学习前提要: 因为书的版本过老,有些章节不学了,要学的包括以下章节 暂定:1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,附录A 第一章:主要是介绍.NET,包括面向 ...

  7. PTA A1001&A1002

    从今天起每天刷1-2题PAT甲级 第一天 A1001 A+B Format (20 分) 题目内容 Calculate a+b and output the sum in standard forma ...

  8. 上传本地Jar包到阿里云的云效私有仓库

    一.前言 前2天玩了一下上传本地jar到maven中央仓库,随后我们老大又给我说了一个叫云效的私有仓库也可以玩,小编试了一下,果然很舒服,配置很简单,效率很高,几分钟就能搞定,只需要自己有个阿里云的账 ...

  9. IDEA远程debug线上项目(实操版)

    # 1.在服务器上 tomcat 的 bin目录下找到并打开 catalina.sh 在文件中搜索: ``` JPDA_ADDRESS= ``` 找一个服务器上没有被使用的端口,填入,如50005,保 ...

  10. [C++] 头文件中不要用using namespace std

    先总结下: 1. using namespce std:尽量不要(或者强硬一点,不许)在头文件中使用. 解析: 不让这么用,主要原因就是防止名字重复(即自定义变量名和std中名字重复),因为头文件会被 ...