@mkbkkj/spiderhole
TypeScript icon, indicating that this package has built-in type declarations

1.5.0 • Public • Published

爬虫引擎

通过指定的规则,编写简单的配置就能完成一个爬虫。

使用

import Spiderhole from 'spiderhole';

// 创建爬虫
const spider = new Spiderhole(config: Config);
/**
 * 保存到文件
 * - 后缀名为json,保存为json文件
 * - 后缀名为其它,保存为行类型文件(每条数据为一行)
*/
await spider.save('path.json');

配置规则

// 单条数据字段的值来源信息
interface DataRowFieldValue {
    type: 'cmd' | 'request';
    options: {
        url?: string;
        // 获取值之前的操作
        before?: string;
        constant?: Record<string, string>;
        value: string | DataRowFieldValue;
    }
}

interface Config {
    // 指定使用的插件库,当前版本支持:cheerio
    use: "cheerio";
    // 入口链接
    entry: string;
    // 可选,预制的全局常量
    constant?: {
        // 每个key,都会执行一次,执行环境的cheerio为entry的
        [ p: string ]: string;
        /**
         * 可以是一个简单的字符串
         * baseURL: "'https://baidu.com'",
         * 
         * 可以是一个表达式
         * tds: "cheerio('.zszc tr td.yes')",
        */
    },
    // 可选,请求的信息
    request?: {
        // 配置请求的headers信息
        headers?: Record<string, string>; 
    },
    /**
     * 可选,响应的拦截器
     * 1. 这个时候是拿不到常量信息的,因为还不确定响应的信息是否是正确的
     * 2. 可以拿到contentType: 响应数据了下
     * 3. 可以拿到response,类型为AxiosResponse
     * 4. 默认会有一个拦截器:
     * {
     *    "when": "contentType !== 'text/html'",
     *    "error": "`错误的响应数据类型: ${contentType}`"
     * }
    */
    response?: Array<{
        // 判断条件,
        when: string;
        // 条件成立后,抛错的信息
        error?: string;
    }>;

    // 必选参数,数据相关
    data: {
        // 迭代器,在一个页面有多条数据时需要用这个属性进行循环获取数据
        iterator: {
            [ p: string ]: string;
        },
        // 每一条数据的配置
        row: {
            /**
             * 每个key和iterator保持一致
             * 表示在这个迭代器循环的时候,处理这些数据
            */
            [ p: string ]: {
                // 判断是否达到取值条件
                when?: string;
                // 此迭代器产生的字段配置
                fields: Array<{
                    // 字段名称
                    name: string;
                    // 何时取值
                    when?: string;
                    // 没有值或者不取值的默认值
                    default: any;
                    // 常量
                    constant?: Record<string, string>;
                    // 是否是必要字段,如果为true,没值时会抛错,默认:false
                    required?: boolean;
                    // 获取值之前的操作
                    before?: string;
                    // 值的取值
                    value: string | DataRowFieldValue;
                }>;
            }
        }
    },
    // 事件
    event?: {
        // 停止爬数据的条件
        stop?: string;
        // 进入下一页配置
        next?: {
            // 爬取下一页时,间隔时间,数组表示随机的时间范围
            sleep?: number | number[];
            // 下一页的url信息
            url: string;
        };
    };
}

插件规范

调用流程

plugin.save => plugin.start => => base._capture

spider.entry();
spider.exec();
spider.field();

Dependencies (6)

Dev Dependencies (10)

Package Sidebar

Install

npm i @mkbkkj/spiderhole

Weekly Downloads

2

Version

1.5.0

License

ISC

Unpacked Size

25.6 kB

Total Files

22

Last publish

Collaborators

  • sungg12138