Golang实现的简单爬虫

序言

今天在工作上面需要用到爬虫抓取部分信息,之前用Python实现了CSDN博客的抓取,后想到了目前整天面对的Golang,便摸索了一下,实现了一个简单的抓取豆瓣排行的爬虫,主要分为下面几个步骤.

  • 发起Http请求
  • 解析Html元素
  • 存储抓取到的数据

发起http请求

在请求方面,直接采用的Golang的”net/http”包来进行开发,步骤如下:

  • 初始化
1
2
client := &http.Client{}
req, err := http.NewRequest("GET", swoop.url, nil)
  • set请求信息
1
2
3
for key, value := range swoop.header {
req.Header.Add(key, value)
}
  • 发起请求
1
2
3
4
resp, err := client.Do(req)
if err != nil {
log.Fatalf("do client err->%v", err)
}
  • 接收响应
1
2
3
4
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("read resp err->%v", err)
}

解析Html元素

  • 设置参数并请求
    首先需要定义个设置参数结构体,便于操作:
1
2
3
4
type Swoop struct {
url string
header map[string]string
}

设置参数后发起请求

1
2
3
url := "https://movie.douban.com/top250?start=" + strconv.Itoa(i*25)
swoop := &Swoop{url, header}
html := swoop.get_html_header()

  • 解析Html元素
    发起请求后,接收到Html元素,接下来需要做的就是解析Html元素,将其转化为我们想要的格式,解析Html格式需要到页面浏览器查看对应的Html元素后再做操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//评价人数
commentCount := `<span>(.*?)评价</span>`
rp2 := regexp.MustCompile(commentCount)
txt2 := rp2.FindAllStringSubmatch(html, -1)

//评分
pattern3 := `property="v:average">(.*?)</span>`
rp3 := regexp.MustCompile(pattern3)
txt3 := rp3.FindAllStringSubmatch(html, -1)

//电影名称
pattern4 := `img width="(.*?)" alt="(.*?)" src=`
rp4 := regexp.MustCompile(pattern4)
txt4 := rp4.FindAllStringSubmatch(html, -1)

如下Html页面代码,其中评价包含在”<\span>”标签内,所以在解析的时候需要解析<\span>标签:

1
2
3
4
5
6
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.5</span>
<span property="v:best" content="10.0"></span>
<span>702861人评价</span>
</div>

如下页面代码,包含了width、alt、src三个value,则需要拿到title就需要解析<\img>标签后读取第二个value值,即alt

1
<img width="100" alt="这个杀手不太冷" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg" class="">

  • 运行代码后效果如下
    运行中:
    run

运行结束:
result

数据存储

数据存储一般根据自己的需要来做,我这里采用的是csv文件存储.
如下所示:
print

GitHub

源代码链接

文章目录
  1. 1. 序言
  2. 2. 发起http请求
  3. 3. 解析Html元素
  4. 4. 数据存储
    1. 4.1. GitHub