- /
- Blog/
- 介绍我写的一个网络数据抓取程序/
介绍我写的一个网络数据抓取程序
目录
使用 go 实现了一个网络数据抓取程序。本程序使用了 ferret 来定义与执行抓取逻辑,使用 go-co-op/gocron 来管理定时任务,使用 viper 来读取配置文件,包括程序配置、任务配置。
简介 #
项目程序库位置:
在通过比较几种爬虫实现方式后,我选择了使用 ferret 来实现网络数据爬取功能的支持,因为它使用了 fql dsl 来定义逻辑,可以方便的修改,并且修改后不需要重新编译程序。
为了在程序中通过库的方式来使用 ferret,我研究了 ferret 开源库的例子,并模仿例子将 ferret 作为库嵌入到程序中,这样就不需要使用 ferret cli 了。
为了可以支持多个 fql 脚本,并且每个脚本可以有不同的定时策略,引入了 go-co-op/gocron 作为程序中定时调度器。
配置说明 #
分为 程序配置、作业配置、fql 脚本。
程序配置 #
程序配置文件,configs/crawl.yaml
,当前版本的程序不能修改这个路径。因为本程序使用
spf13/viper
作为配置工具库,所以可以支持 viper 所支持的格式。
当前有效的配置项为:
jobsdir: configs/fql # default configDir/jobs
fqldir: configs/fql # default configDir/fql
outdir: output # default current working directory
scheduler:
# maximum fql crawling jobs running cocurrenly running
max: 4
- jobsdir
- 程序会在这个目录下扫描爬取作业配置文件
- fqldir
- ferret 脚本的根目录
- outdir
- ferret 脚本执行的输出位置
- scheduler.max
- gocron 调度的最大并发度
抓取作业配置 #
在 configs/crawl.yaml
中的jobsdir
指向了作业配置文件所在目录。程序会在这个目录以及其子目录中扫描所有的 yaml 作业配置文件。
作业配置文件的格式,示例如下:
enable: true
fqljobs:
- name: zhihu/hotlist
desc: 知乎热榜
script: zhihu/hotlist.fql
output: zhihu_hotlist.json
enable: true
schedule:
every: 3m
- name: bilibili/weekly
script: bilibili/weekly.fql
desc: b站 每周必看
schedule:
cron: "* 3 18/1 * * 5 *" # 每周五18:00-23:00
- enable
- 必填项, 默认为 false。用于一次性打开/禁止所有在当前 yaml 配置文件中的任务。
- job.name
- 必填项, 作业名称,在单个 yaml 配置文件中需要唯一
- job.desc
- 选填项,描述信息,帮助记忆、理解
- job.script
- 必填项,ferret 查询脚本的相对路径。程序会从
configs/crawl.yaml#fqldir
指定的目录查找 - job.output
- 选填项,fql 结果保存的文件的相对路径,这些文件会统一保存在
config/crawl.yaml#output
指定的目录。若缺失,程序会默认为config/crawl.yaml#fqldir + '_' + script + .json
的格式,比如上面 bilibili/weekly 没有指定 output,那么程序自动生成的文件默认名称为configs_fql_bilibili_weekly.json
- job.enable
- 选填项,当缺失时,默认值为 false。则只有当配置文件
enable=true
时,enable=true
的任务才会被加载 - job.schedule
- 优先读取
cron
,若缺失,会尝试读取every
。若都不存在,则默认为 7m。因为本程序使用了 go-co-op/gocron 调度库,所以,填写cron
时,可以使用 cron 表达式;填写every
时,可以选择支持以下这些单位来定义时间频率,s->秒、m->分钟、h->小时。如果时间间隔很长,比如好多天,或者一个月,那么建议使用 cron 表达式,可以更加精确的控制时间
作业配置文件可以同时配置多个作业,作业配置文件的数目也没有限制,只要是在 configs/crawl.yaml#fqldir
指定的目录或子目录下。根据自己的需要来规划。
fql #
ferret 的查询脚本,本程序会在 config/crawl.yaml#fqldir
目录或子目录下查找。这些 fql 脚本使用ferret query language 编写,事先可通过
montferret.dev/try/
来开发测试。
程序运行 #
在程序运行上,确保已经编译好本程序,也可以下载可执行版本。
如何安装或编译 #
- 下载
github.com/lizhuoqi/crawling/releases
gitee.com/lizhuoqi/crawling/releases
- 自行编译
> git clone 本程序的开源url crawling
> go mod tidy -v
> go build -v
> # 或者使用 make
> make build
运行 #
> ./crawl
程序运行时,产生的 json 文件会覆盖已存在文件,不会保存历史。如果需要及时获取更新,需要另外安装文件变化监视器自行触发后续动作。