python - Scrapy回调函数在另一个文件中

标签 python scrapy

我正在使用 Scrapy 和 Python 来抓取多个网站。

我有很多结构如下的蜘蛛:

import library as lib

class Spider(Spider):
   ...

   def parse(self, response):
       yield FormRequest(..., callback=lib.parse_after_filtering_results1)
       yield FormRequest(..., callback=lib.parse_after_filtering_results2)

   def parse_after_filtering_results1(self,response):
       return results

   def parse_after_filtering_results2(self,response):
       ... (doesn't return anything)

我想知道是否有任何方法可以将回调中调用的最后两个函数放在我所有蜘蛛都通用的另一个模块中(这样,如果我修改它,那么它们都会改变) 。我知道它们是类函数,但我是否可以将它们放入另一个文件中?

我尝试在我的library.py 文件中声明函数,但我的问题是如何将所需的2个参数(self、response)传递给它们。

最佳答案

创建一个基类来包含这些常用函数。然后你真正的蜘蛛就可以继承它。例如,如果您的所有蜘蛛都扩展了 Spider,那么您可以执行以下操作:

spiders/basespider.py:

from scrapy import Spider

class BaseSpider(Spider):
    # Do not give it a name so that it does not show up in the spiders list.
    # This contains only common functions.

    def parse_after_filtering_results1(self, response):
        # ...

    def parse_after_filtering_results2(self, response):
        # ...

spiders/realspider.py:

from .basespider import BaseSpider

class RealSpider(BaseSpider):
     # ...

    def parse(self, response):
        yield FormRequest(..., callback=self.parse_after_filtering_results1)
        yield FormRequest(..., callback=self.parse_after_filtering_results2)

如果您有不同类型的蜘蛛,您可以创建不同的基类。或者您的基类可以是一个普通对象(不是 Spider),然后您可以将其用作 mixin。

关于python - Scrapy回调函数在另一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619754/

相关文章:

python - Scrapy处理asp.net站点中的 session cookie或302

python - 如何获取scrapyrt的POST元数据?

python - 使用 scrapy 在表中查找正确的数据

python - pandas 替换列子集的空值

python - 蜘蛛停止爬行或遇到异常后如何退出Scrapy Python脚本?

Python/Windows : List only USB removable drives

python - 从电子邮件中的标题添加

python - Scrapy CrawlSpider 重试抓取

python - python中生成器对象的大小

Python:沿特定维度查找大于阈值的最大数组索引