一日一技:如何處理配置文件中的重復值?
在我們創建配置文件的時候,可能會出現一些值需要重復填寫多次的問題。例如我最近寫了一個可配置爬蟲,只需要配置幾條 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)
運行效果如下圖所示:
這樣一來,如果某一項會多次出現的配置發生了修改,我們只需要改一個地方,就能在多個地方同時自動生效,不用再一個一個手動修改了。既節省了時間又不容易出錯。
本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。