一日一技:如何处理配置文件中的重复值?

简介: 一日一技:如何处理配置文件中的重复值?

摄影:产品经理一家很多韩国人的螃蟹店里面的某种鸡汤


在我们创建配置文件的时候,可能会出现一些值需要重复填写多次的问题。例如我最近写了一个可配置爬虫,只需要配置几条 XPath,就能够自动生成一个 Scrapy 爬虫。从而快速完成简单网站的爬取。

这个配置文件长这样:

name: 某某网站爬虫
host: 'https://www.kingname.info'
headers: 
 user-agent: xxx
  host: yyyy
  referer: zzz
rule:
  start_url: 'https://www.kingname.info'
  detail_url: //div[@class="xxx"]/a/@href
  next_page_xpath: //div[@class="next"]/@href
  ...其他配置参数...

这个配置文件是使用 YAML 格式创建的。我们可以看到,最外层的host的值为https://www.kingname.info,而在rule里面,start_url的值也是这个网址。这样就重复了。这种重复的情况还有很多,例如列表页的翻页链接的 XPath 与正文页的翻页链接的 XPath 是一样的,多个类型可以具有相同的执行规则等等。

如果你使用 JSON 来作为配置文件的格式,那么确实你要重复写。但如果你使用 YAML 来作为配置文件的格式,那么你可以通过添加锚记(anchor)和别名(alias)的方式,实现一次填写,多次使用的效果。

我们先来看一个简单的例子:

import yaml
config = '''
name: &name 青南
salary: 99999
other_name: *name
'''
info = yaml.safe_load(config)
print(info)

运行效果如下图所示:

可以看到,原本定义一个key-value类型的值,应该是key: value的形式,但是这里我写成key: &锚记名 value,于是,这个锚记名就相当于是一个变量名,就可以在其他地方引用。引用的时候,写作*锚记名。这有点像 C 语言中的获取变量的内存地址(&),然后显示指针的值(*)。锚记名可以 key 相同,也可以不同。

当然,除了简单的key-value,也可以在复杂的场景下使用,例如:

import yaml
config = '''
article_xpath: &article
    title: //div[@class="title"]/text()
    detail: //div[@class="content"]/text()
    image: 
        - //div/img[@class="xx"]/@href
        - //p/img[@class="yy"]/@href
about_xpath:
    summary: //div[@class="summary"]/text()
book_xpath: *article
'''
info = yaml.safe_load(config)

运行效果如下图所示:

这样一来,如果某一项会多次出现的配置发生了修改,我们只需要改一个地方,就能在多个地方同时自动生效,不用再一个一个手动修改了。既节省了时间又不容易出错。

目录
相关文章
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
348 0
|
前端开发 JavaScript
前端使用fingerprintjs2获取浏览器指纹
前端使用fingerprintjs2获取浏览器指纹
3140 0
|
11月前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
NoSQL Java MongoDB
MongoDB $type 操作符
10月更文挑战第16天
152 2
|
8月前
|
存储 人工智能 监控
Mahilo:多智能体实时协作框架开源!人类与AI无缝交互,复杂任务一键协同
Mahilo 是一个灵活的多智能体框架,支持创建与人类互动的多智能体系统,适用于从客户服务到紧急响应等多种场景。
617 2
Mahilo:多智能体实时协作框架开源!人类与AI无缝交互,复杂任务一键协同
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
25996 64
图解一致性哈希算法,看这一篇就够了!
|
SQL 存储 Cloud Native
揭秘TDengine:这个数据库如何以光速处理时间序列数据,颠覆你的世界观!
【8月更文挑战第7天】随着物联网的发展,数据生成呈爆炸式增长,催生了如TDengine这样的高性能时序数据库。TDengine采用优化的列式存储和标签索引,实现高速写入与高效压缩,减少存储空间的同时保持高性能。内置丰富的分析函数支持复杂的数据聚合操作,并通过数据复制保障高可靠性。其SQL接口易于使用,分布式架构便于扩展,且支持多种云环境部署,成为处理物联网、车联网等场景下时间序列数据的理想选择。
351 0
|
NoSQL Java Redis
认证服务---整合短信验证码,验证码倒计时,验证码防刷校验 【一】
这篇文章介绍了如何在分布式微服务项目中整合短信验证码服务,包括使用阿里云短信验证接口、将短信验证功能集成到第三方服务中、其他服务的远程调用,以及通过Redis实现验证码防刷机制的代码实现和遇到的问题解决方案。
|
自然语言处理 搜索推荐 API
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
1051 0
|
Java 编译器 Linux
程序技术好文:详解Linux安装GCC方法
程序技术好文:详解Linux安装GCC方法
514 0