我们在创建配置文件的时候,可能会出现一些值需要重复填写的问题。比如我最近写了一个可配置的爬虫,只需要配置几个XPath就可以自动生成一个Scrapy爬虫。从而快速完成简单网站的爬取。该配置文件如下所示:名称:某个网站爬虫主机:'https://www.kingname.info'headers:user-agent:xxxhost:yyyyreferer:zzzrule:start_url:'https://www.kingname.info'detail_url://div[@class="xxx"]/a/@hrefnext_page_xpath://div[@class="next"]/@href...其他配置参数...此配置文件使用YAML格式创建的。我们可以看到最外层host的值是https://www.kingname.info,rule中start_url的值也是这个URL。如此重复。这种重复的情况很多,比如列表页的翻页链接的XPath和正文页的相同,多个类型可以有相同的执行规则等等。如果你使用JSON作为配置文件的格式,那你就真的要重写了。但是如果你使用YAML作为配置文件的格式,那么你可以添加锚点和别名来达到一次填充多次使用的效果。先看一个简单的例子:importyamlconfig='''name:&nameQingnansalary:99999other_name:*name'''info=yaml.safe_load(config)print(info)运行效果如下图所示:看,本来定义一个key-value类型的value应该是key:value的形式,但是这里我写成key:&锚点名value,所以这个锚点名相当于一个变量名,可以在别处引用。引用时,写*anchornotation。这有点像在C中获取变量(&)的内存地址,然后显示指针(*)的值。锚名称可以具有相同的键或不同的键。当然,除了简单的key-value,也可以用在复杂的场景,例如:importyamlconfig='''article_xpath:&articletitle://div[@class="title"]/text()detail://div[@class="content"]/text()image:-//div/img[@class="xx"]/@href-//p/img[@class="yy"]/@hrefabout_xpath:summary://div[@class="summary"]/text()book_xpath:*article'''info=yaml.safe_load(config)运行效果如下图所示:这样,如果某个item会出现多次配置已修改。我们只需要更改一个地方,它会同时在多个地方自动生效。无需手动一一修改。既节省时间又不容易出错。本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。
