不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

知识星球Go项目实战爬虫项目总结

介绍

知识星球Go项目实战的第一个实战项目—>爬虫。
本文记录直播内容和相关细节。

前端相关

DOM,CSS选择器,jQuery

系统设计

技术选型

  • 前端:Bootstrap和jQuery
  • 后端:Go
  • 数据库:MySQL

数据库设计思路

  • job_info 表:我们计划抓取猎聘、Boss直聘和拉钩网三个网站的 Go 语言相关职位信息。通过分析三个网站上的职位信息数据,结合咱们的目标,设计了 job_info 表;
  • crawl_rule 表:针对 job_info 表的设计,我们希望在网站职位的详情页能够获取到相应信息。因为每个网站页面结构不同,抓取策略也会不一样,因此有了此表;
  • auto_crawl_rule 表:crawl_rule 表是针对一个职位详情页的,但我们不可能手动一个页面一个页面抓取,而是希望能够提供一些信息将某个网站上相关职位信息批量抓取。此表用于抓取职位列表信息,进而抓取一个个职位信息;

数据库设计原则和注意事项(重点)

1,字段不允许 NULL 且提供默认值,即 NOT NULL DEFAULT xx;
2,选择合适的最小数据类型;
3,确保是非负数的字段,加上 unsigned;
4,使用 COMMENT 给字段加备注;
5,表一般应该有 created_at 字段;
6,没特殊情况,请使用 InnoDB 引擎;
7,字符编码使用 utf8mb4;不要用utf8
8,VARCHAR 类型的长度值使用 2 的幂次方减1或减2,比如 varchar(127) varchar(255) varchar(510) 因为 510 这个数字(长度)本身需要 2 个字节存储。(也就是长度超过 255 之后,用两个字节存储长度,所以减 2);
9,根据查询条件,建立必要的索引;
10,NOT NULL,确保它一定不是NULL;

项目结构和代码组织

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
.
├── cmd //项目入口,主程序
│ └── crawler
│ ├── background.go
│ ├── crawler
│ └── main.go
├── config //配置信息
│ └── config.yaml
├── dao //数据访问对象,直接和数据存储打交道
│ ├── auto_crawl_rule.go
│ ├── auto_crawl_rule_test.go
│ ├── crawl_rule.go
│ ├── db.go
│ └── job.go
├── docs //文档
│ └── db.sql
├── global //全局信息,初始化
│ ├── app.go
│ ├── error.go
│ └── init.go
├── go.mod
├── go.sum
├── http //
│ ├── controller //MVC 的 controller
│ │ ├── job_handler.go
│ │ └── job_handler_test.go
│ ├── middleware //http的中间件
│ │ ├── logger.go
│ │ └── recover.go
│ └── routes.go
├── LICENSE
├── logic //业务逻辑
│ ├── crawler
│ │ ├── colly.go
│ │ ├── goquery.go
│ │ ├── parser.go
│ │ └── work.go
│ └── job.go
├── model //映射的结构体
│ ├── auto_crawl_rule.go
│ ├── crawl_rule.go
│ └── job_info.go
├── README.md
├── template //模板
│ ├── detail.html
│ └── index.html
└── util //辅助工具
├── file.go
├── http.go
├── int.go
└── ip.go

关于配置文件

1,写死,保底
2,通过配置拿到数据,两种形式,读取配置文件和命令行参数传递过来
3,读环境变量

小结

本项目主要熟悉和培养用Go设计项目的框架,同时也把前段时间学习的知识点做了综合运用。下面记录下一些关键信息:

  • 熟悉go mod
  • 执行数据库语句的代码和数据库语句最好分开来操作
  • 数据量很大的时候,最好不要随意改变数据表中的字段,不然服务会挂
  • 项目中还有待完善的部分,例如Colly的实现,结构体转数据表或数据表转结构体,选择分析器的部分

提问环节

Q1:cmd下为什么要有crawler文件夹
如果cmd下放main.go,编译出来的文件名叫什么?—cmd

Q2:并发版爬虫?什么时候成分布式的啊
抓的太频繁,会被封。

Q3:測試 controller 會直接對 db 調用,不知道這樣好嗎

Q4:http 为什么要加 recover ? 默认没有么

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!