以写作调身心

知识星球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;

项目结构和代码组织

.
├── 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 ? 默认没有么

评论