bricks
开发指南
2.3 请求篇
2.3.3 配置开发

2.3.3 配置开发

配置式开发需要依赖配置式爬虫

form

spider配置为一个列表,当你需要请求的时候,可以使用 form.Download 类型的节点。

定义

可以使用以下方式定义初始化:

 
from bricks.spider import form
 
 
class MySpider(form.Spider):
 
    @property
    def config(self) -> form.Config:
        return form.Config(
            init=[
                form.Init(func=lambda: {"page": 1})
            ],
            spider=[
                form.Download(
                    url="https://fx1.service.kugou.com/mfanxing-home/h5/cdn/room/index/list_v2",
                    params={
                        "page": "{page}",
                        "cid": 6000
                    },
                    headers={
                        "User-Agent": "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Mobile Safari/537.36",
                        "Content-Type": "application/json;charset=UTF-8",
                    },
                )
            ]
        )
 
 
if __name__ == '__main__':
    spider = MySpider()
    spider.run()
 
 

配置说明

每个 form.Download 节点代表一个下载请求,该节点的实例化参数和request实例化参数基本一致,可以参考 Request,唯一需要强调的:

  • archive: 是否启用存档模式,启用时会存储当前状态,将节点指针指向当前位置,重试的时候不会重新开始!

配置化的定义的make_seedsmake_request 两个流程是解耦的,当你存在种子的变量时,可以使用{种子内的 Key 的名称}的方式进行占位符,例如 "{page}"

template

spider配置为一个列表,当你需要请求的时候,可以使用 template.Download 类型的节点。

定义

可以使用以下方式定义初始化:

import time
 
from bricks.spider import template
from bricks.spider.template import Config
 
 
class Spider(template.Spider):
 
    @property
    def config(self) -> Config:
        return Config(
            init=[
                template.Init(
                    func=lambda: {"page": 1},
                    layout=template.Layout(
                        factory={
                            "time": lambda: time.time()
                        }
                    ),
 
                )
            ],
            download=[
                # 第一个下载配置
                template.Download(
                    url="https://fx1.service.kugou.com/mfanxing-home/h5/cdn/room/index/list_v2",
                    params={
                        "page": "{page}",
                        "cid": 6000
                    },
                    headers={
                        "User-Agent": "@chrome",
                        "Content-Type": "application/json;charset=UTF-8",
                    },
                ),
 
            ]
        )
 
 
if __name__ == '__main__':
    spider = Spider()
    spider.run()
 

配置说明

每个 template.Download 节点代表一个下载请求,该节点的实例化参数和request实例化参数基本一致,可以参考 Request,唯一需要强调的:

选择哪个下载配置进行下载由当前种子内的$config的值决定,如当$config的值为 0时,选取第一个配置(索引的选择规则)

设当前所有的解析配置为 downlaod_settings , 当前种子为 seeds

则取值规则为:downlaod_settings[seeds['$config']%len(downlaod_settings)]

当你存在种子的变量时和 form 类型的方法是一致的,可以使用{种子内的 Key 的名称}的方式进行占位符,例如 "{page}"

渲染规则

节点可渲染归功于其父类:bricks.lib.nodes.RenderNode,目前 download 等节点全部继承于这个节点,关于这个节点的渲染规则如下:

  1. 渲染模板根据data,也就是我们的种子
  2. 需要渲染的值:使用1个大括号,在大括号中填写种子内的 Key 的名字
  3. seeds是包含需要的变量的字典
  4. 如果有不需要渲染的变量,使用节点属性 un_rendered 来处理
  5. 默认 渲染的结果都是字符串
  6. 如果 key 不存在的时候存在三种策略,分别是修复,忽略和抛错,默认是修复;修复意味着使用该类型的默认值,忽略会设置为空,抛错就是抛出异常
  7. 如果需要额外处理渲染后的数据,可以使用 {key: adapter} 的方式,默认的 adapter int、str、float、list、dict、json 几种,可以自定义

下面声明几种常用示例:

示例一:普通渲染

 
from bricks.spider.form import Download
 
if __name__ == '__main__':
    custom = Download(url="{url}")
    print(custom.render({"url": "this is url"}).url)
 

图 0

示例二:某些字段不渲染

 
from bricks.spider.form import Download
 
if __name__ == '__main__':
    custom = Download(url="{this is un_rendered url}", un_rendered=["url"])
    print(custom.render({"url": "this is url"}).url)
 
 

图 1

示例三:某些字段不渲染

 
from bricks.spider.form import Download
 
if __name__ == '__main__':
    custom = Download(
        url="{value}",
        params={"a": "{value}"},
        body="{value}",
        un_rendered=["params.a", "body"]
    )
    print(custom.render({"value": "如果被渲染了,我就会出现"}))
 

图 2

示例四:渲染后使用 adapter 处理

 
from bricks.spider.form import Download
 
 
def demo(x):
    return x + "-hahahahaha"
 
 
if __name__ == '__main__':
    custom = Download(
        url="{value:float}",
        params={"a": "{value:demo}"},
    )
    # 这里可以注册一个额外的渲染器
    custom.register_adapter("demo", demo)
    render1 = custom.render({"value": 15.3333})
    print(render1.url, type(render1.url))
    print(render1.params)
 

图 3