当前位置: 首页 > 知识库问答 >
问题:

是否有任何方法为每个卡盘使用单独的刮擦管道?

东郭宏朗
2023-03-14

我想获取不同域下的网页,这意味着我必须在“scrapy crawl myspider”命令下使用不同的蜘蛛。然而,由于网页的内容不同,我不得不使用不同的管道逻辑将数据放入数据库。但是对于每个spider,它们都必须经过settings.py中定义的所有管道。是否有其他优雅的方法为每个卡盘使用单独的管道?

共有3个答案

贺雅健
2023-03-14

一个更健壮的解决方案;不记得我在哪里找到的,但是一个糟糕的开发人员在某个地方提出了它...使用此方法可以让您通过不使用包装器在所有蜘蛛上运行一些管道。它还使您不必重复检查是否使用管道的逻辑

包装器:

def check_spider_pipeline(process_item_method):
    """
        This wrapper makes it so pipelines can be turned on and off at a spider level.
    """
    @functools.wraps(process_item_method)
    def wrapper(self, item, spider):
        if self.__class__ in spider.pipeline:
            return process_item_method(self, item, spider)
        else:
            return item

    return wrapper

使用方法:

@check_spider_pipeline
def process_item(self, item, spider):
    ........
    ........
    return item

Spider的用法:

pipeline = {some.pipeline, some.other.pipeline .....}
松元明
2023-03-14

上面的一个稍微好一点的版本如下。这是更好的,因为这种方式允许您选择性地打开不同蜘蛛的管道比上面管道中的'not in['spider1','spider2']'的编码更容易。

在spider类中,添加

#start_urls=...
pipelines = ['pipeline1', 'pipeline2'] #allows you to selectively turn on pipelines within spiders
#...

然后在每个管道中,您可以使用getattr方法作为魔术。加:

class pipeline1():  
    def process_item(self, item, spider):
       if 'pipeline1' not in getattr(spider, 'pipelines'):
          return item
       #...keep going as normal  
施飞雨
2023-03-14

ITEM_PIPELINES设置是在引擎启动期间为项目中的所有spider全局定义的。每个蜘蛛都不能动态更改它。

以下是一些需要考虑的选项:

>

  • 更改管道的代码。跳过/继续处理管道的process_item方法中蜘蛛返回的项目,例如:

    def process_item(self, item, spider): 
        if spider.name not in ['spider1', 'spider2']: 
            return item  
    
        # process item
    

    改变你开始爬行的方式。从脚本中执行此操作,基于作为参数传递的蜘蛛名称,在调用crawler.configure()之前覆盖您的ITEM_PIPELINES设置。

    另见:

    • 很有意思。开始爬网后如何更改爬行器设置?

    希望这有所帮助。

  •  类似资料:
    • 问题内容: 到目前为止,我一直只使用scrapy并编写自定义类来使用ajax处理网站。 但是,如果我要使用scrapy-splash,据我所知,它会在javascript之后刮擦呈现的html,那么对我的抓取工具的速度会产生重大影响吗? 用scrapy刮擦香草html页面与使用scrapy-splash渲染javascript html所花费的时间之间的比较是什么? 最后,scrapy-splas

    • 我希望有、和,其中每一个都映射到Elastic Beanstatk上相同应用程序的单独环境。 这有可能吗? 在我的托管区域上,例如。com ,我已经为www.example设置了cname记录。com,登台。实例com和演示。实例com,每个都有一个指向各自的EB url的值。 第一个是我设置的www.example。com工作,请求到达环境。但是当我试图通过ping staging联系其他人时。

    • 问题内容: 我开始使用Continuum.io的Python Anaconda发行版进行工作。 我已经能够启动并运行Anaconda,但是我无法确定Anaconda是否 为它创建的每个新环境都 创建一个新的环境变量,或者它是否依赖于公共系统。 __ 我在文档中找不到关于此的任何信息。 此外,当我执行a时,我没有在新创建的环境中看到变量—尽管我确实找到了一些新的anaconda创建的环境变量。 我能

    • 问题内容: 我正在尝试整理我的第一个数据驱动测试框架,该框架通过Selenium Grid / WebDriver在多个浏览器上运行测试。现在,我在自己的类中拥有每个测试用例,并且对浏览器进行了参数设置,因此它在每个浏览器中都运行一次每个测试用例。 在大型测试框架上常见吗?还是应该将每个测试用例复制并微调到其各自类中的每个浏览器?因此,如果我正在测试chrome,firefox和IE,是否应该为每

    • 目前,我有一个符合 UI 文本字段代表的类。在这类课上,我有两个文本字段:密码和电话号码。此外,我还有两种方法:1:函数文本字段应开始编辑(UI文本字段)- 如何将密码文本字段与第一个函数关联,而不是另一个函数,反之亦然?本质上,当我设置textfields委托时,我想能够选择为每个相关的textfield调用哪些方法?

    • 问题内容: 我正在使用Django REST Framework编写API,并且想知道在使用基于类的视图时是否可以为每个方法指定权限。 阅读文档,如果您正在编写基于函数的视图,那么仅使用装饰器对要使用权限保护的视图的函数,我认为这样做非常容易。不过,我不明白的方式使用与CBVS时做同样的课,因为那时我指定用满级的权限属性,但将被再应用到所有类方法(,,… )。 因此,是否可以用CBV编写API视图