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_seeds
与 make_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
等节点全部继承于这个节点,关于这个节点的渲染规则如下:
- 渲染模板根据
data
,也就是我们的种子 - 需要渲染的值:使用1个大括号,在大括号中填写种子内的
Key
的名字 seeds
是包含需要的变量的字典- 如果有不需要渲染的变量,使用节点属性
un_rendered
来处理 - 默认 渲染的结果都是字符串
- 如果
key
不存在的时候存在三种策略,分别是修复,忽略和抛错,默认是修复;修复意味着使用该类型的默认值,忽略会设置为空,抛错就是抛出异常 - 如果需要额外处理渲染后的数据,可以使用
{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)
示例二:某些字段不渲染
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)
示例三:某些字段不渲染
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": "如果被渲染了,我就会出现"}))
示例四:渲染后使用 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)