scrapy内置的itemloader的一种替代方法,它关注于后备解析器的可维护性。
scrapy-loader-upkeep的Python项目详细描述
概述
这比内置的scrapy的itemloader有所改进 这主要关注随着时间的推移蜘蛛的可维护性。
这允许开发人员跟踪在 爬网,允许安全删除过时的css/xpath回退规则。
动机
默认情况下,scrapy支持在其ItemLoader中添加多个css/xpath规则 以便为开发人员提供一种方便的方式来跟上站点的变化。
然而,有些站点比其他站点更频繁地更改布局,而有些则执行 在开发人员需要适应这些更改的情况下,a/b测试数周/数月。
这些回退css/xpath规则很快就会过时,并填满项目。 有潜在的死代码,对蜘蛛的长期维护构成威胁。
用法
fromscrapy_loader_upkeepimportItemLoaderclassSiteItemLoader(ItemLoader):pass
在spider回调中使用它看起来像:
defparse(self,response):loader=SiteItemLoader(response=response,stats=self.crawler.stats)
除了 向它注入stat依赖项,这是跟踪使用情况所必需的 语法分析器规则的。
这只适用于以下ItemLoader方法:
- add_css()
- replace_css()
- add_xpath()
- replace_xpath()
基本蜘蛛示例
这是从examples/ 目录。
$ scrapy crawl quotestoscrape_simple_has_missing
这应该在统计中输出:
2019-06-1614:32:32[scrapy.statscollectors]INFO:DumpingScrapystats:{...'parser/QuotesItemLoader/author/css/1':10,'parser/QuotesItemLoader/quote/css/1/missing':10,'parser/QuotesItemLoader/quote/css/2':10...}
在本例中,我们可以看到quote字段的1st css规则 在刮伤过程中有过完全不匹配的情况。
新功能
与上面的示例一样,我们仅限于 在执行期间调用了add_css()、add_xpath()等。
在某些情况下,开发人员将使用 许多不同的解析器来处理站点中不同的布局。它会使 有一个更好的上下文来理解解析器的作用。
支持一个新的可选参数name,以便在 给定的解析器。这支持两种主要类型的创建回退分析器:
- 多次调用
loader.add_css('NAME','h1::text',name='Name from h1')loader.add_css('NAME','meta[value="title"]::attr(content)',name="Name from meta tag")
会导致如下结果:
{...'parser/QuotesItemLoader/NAME/css/1/Name from h1':8,'parser/QuotesItemLoader/NAME/css/1/Name from h1/missing':2,'parser/QuotesItemLoader/NAME/css/2/Name from meta tag':7,'parser/QuotesItemLoader/NAME/css/2/Name from meta tag/missing':3,...}
- 单个调用中的分组解析器
loader.add_css('NAME',['h1::text','meta[value="title"]::attr(content)',],name='NAMEs at the main content')loader.add_css('NAME',['footer .name::text','div.page-end span.name::text',],name='NAMEs at the bottom of the page')
会导致如下结果:
{...'parser/QuotesItemLoader/NAME/css/1/NAMEs at the main content':8,'parser/QuotesItemLoader/NAME/css/1/NAMEs at the main content/missing':2,'parser/QuotesItemLoader/NAME/css/2/NAMEs at the main content':7,'parser/QuotesItemLoader/NAME/css/2/NAMEs at the main content/missing':3,'parser/QuotesItemLoader/NAME/css/3/NAMEs at the bottom of the page':8,'parser/QuotesItemLoader/NAME/css/3/NAMEs at the bottom of the page/missing':2,'parser/QuotesItemLoader/NAME/css/4/NAMEs at the bottom of the page':7,'parser/QuotesItemLoader/NAME/css/4/NAMEs at the bottom of the page/missing':3,...}
后者对于将回退解析器组合在一起非常有用 与页面的布局/安排相关。
要求
Python3.6+