跳到主要内容
  1. Blog/

介绍我写的一个网络数据抓取程序

··字数 1260·3 分钟
爬虫 go

使用 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 文件会覆盖已存在文件,不会保存历史。如果需要及时获取更新,需要另外安装文件变化监视器自行触发后续动作。