scrapy内置的itemloader的一种替代方法,它关注于后备解析器的可维护性。

scrapy-loader-upkeep的Python项目详细描述


https://img.shields.io/pypi/pyversions/scrapy-loader-upkeep.svghttps://img.shields.io/pypi/v/scrapy-loader-upkeep.svghttps://travis-ci.org/BurnzZ/scrapy-loader-upkeep.svg?branch=masterhttps://codecov.io/gh/BurnzZ/scrapy-loader-upkeep/branch/master/graph/badge.svg

概述

这比内置的scrapy的itemloader有所改进 这主要关注随着时间的推移蜘蛛的可维护性

这允许开发人员跟踪在 爬网,允许安全删除过时的css/xpath回退规则。

动机

默认情况下,scrapy支持在其ItemLoader中添加多个css/xpath规则 以便为开发人员提供一种方便的方式来跟上站点的变化。

然而,有些站点比其他站点更频繁地更改布局,而有些则执行 在开发人员需要适应这些更改的情况下,a/b测试数周/数月。

这些回退css/xpath规则很快就会过时,并填满项目。 有潜在的死代码,对蜘蛛的长期维护构成威胁。

创意方案:https://github.com/scrapy/scrapy/issues/3795

用法

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,以便在 给定的解析器。这支持两种主要类型的创建回退分析器:

  1. 多次调用
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,...}
  1. 单个调用中的分组解析器
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+

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
反射Java反射:高负载下的NoSuchMethodException   java RxJava:one request>list of Integer>sequence of requests for each int>result to list   java为什么循环之前索引会增加   JavaSpring远程处理和RESTfulURL   java Hibernate搜索仅对我的实体的一部分进行索引   使用DPAD快速滚动时,java RecyclerView onCreateViewHolder调用过多   java将JSON解析到一个表中   java导航抽屉标题textview nullpointerexception   基于接口的Java链接队列   java Guice运行时依赖项参数重新注入   java展平/压缩ZSH中的深度嵌套目录   JavaSpring:Http406此请求标识的资源只能   java如何制作Android启动器图标   Java代码在windows上显示不正确(包含希腊语句子)   使用yourkit进行内存分析所用的java时间   java为什么可以序列化属性而不能序列化对象本身?