使用 Go 语言爬取豆瓣图书 Top250
Aidan Engineer

今天做核酸的时候在掘金看到一篇讲学 Go 语言的帖子,好家伙写的跟小说是的,不过里边有一个使用 goquery 爬取网页的操作我很感兴趣,自己尝试了一下

感悟就是 Go 确实很简单,但只要逻辑理明白了语言真的只是工具而已

具体实现可以看掘金的 原文 ,写的特别好,我这里直接贴一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main

import (
"fmt"
"log"
"net/http"
"os"
"strconv"
"strings"

"github.com/PuerkitoBio/goquery"
)

func main() {

// 创建我们要导出的 TXT 文件
file, err := os.Create("Douban-Book-TOP250")
if err != nil {
fmt.Println(err)
}
defer file.Close()

// 创建一个客户端对象,用于发送请求
var client = http.Client{}

for i := 0; i < 250; i += 25 {
// 发送一条新请求
req, _ := http.NewRequest("GET", "https://book.douban.com/top250?start="+strconv.Itoa(i), nil)
// 设置 User-Agent(必须)
req.Header.Set("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")

// 发送请求
resp, err := client.Do(req)
// 处理异常
if err != nil {
fmt.Println("http get error", err)
return
}
// 关闭流
defer resp.Body.Close()

// 通过 goquery 将流中的内容构建成一棵 DOM 树
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
log.Fatal(err)
}

// 拿到所有标记的节点集合进行 each 循环,i = 序号,s = 节点本身
doc.Find("div.indent>table>tbody>tr.item").Each(func(i int, s *goquery.Selection) {
// 拿到节点集合中的 Items
item := s.Find("td[valign=top]")

// 通过 Item 节点获取到我们所需要的数据
// 对数据进行去空格 去换行操作
bookName := strings.Replace(strings.Replace(item.Find("div.pl2>a").Text(), "\n", "", -1), " ", "", -1)

author := strings.Split(s.Find("p.pl").Text(), "/")[0]

quote := strings.Replace(strings.Replace(s.Find("p.quote").Text(), "\n", "", -1), " ", "", -1)

// 拿到处理好的数据后填充文件即可

//fmt.Print("TOP" + fmt.Sprint(i) + "-" + bookName + "-" + author + "-" + quote)

// 处理字符直接的空格长度,尽量对齐
bookName = bookName + strings.Repeat(" ", (120-len(bookName)))
author = author + strings.Repeat(" ", (50-len(author)))

content := "TOP" + strconv.Itoa(i) + "\t" + bookName + author + quote + "\n"

file.WriteString(content)
})
}

fmt.Print(" 程序执行完毕,请查看结果。")

}

几个需要注意的点:

  1. User-Agent 必须使用,可以在豆瓣中 F12 查看一下,这里使用的和我浏览器中的不一样,但也可以使用
  2. 写入到文件时如果处理对齐,需要考虑空格的重复次数不要出现负数的情况
  3. 编号受豆瓣分页的影响,如果按升序来需要单独处理
  • 本文标题:使用 Go 语言爬取豆瓣图书 Top250
  • 本文作者:Aidan
  • 创建时间:2022-01-06 17:51:30
  • 本文链接:https://aidanblog.top/web_crawler-douban_book_top/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论