如何将两个爬虫合并成一个?

4

有两个蜘蛛在使用同一个资源文件,而且结构几乎相同。

蜘蛛A包含:

import scrapy
import pkgutil

class StockSpider(scrapy.Spider):
    name = "spiderA"
    data = pkgutil.get_data("tutorial", "resources/webs.txt")
    data = data.decode()
    urls = data.split("\r\n")
    start_urls = [url + "string1"  for url in urls]

    def parse(self, response):
        pass

蜘蛛B包含:
import scrapy
import pkgutil

class StockSpider(scrapy.Spider):
    name = "spiderB"
    data = pkgutil.get_data("tutorial", "resources/webs.txt")
    data = data.decode()
    urls = data.split("\r\n")
    start_urls = [url + "string2"  for url in urls]

    def parse(self, response):
        pass

我该如何将SpiderA和SpiderB结合起来,并添加一个开关变量,让根据需要调用不同的爬虫?

2个回答

2
尝试为蜘蛛类型添加单独的参数。您可以通过调用scrapy crawl myspider -a spider_type=second来设置它。请参考以下代码示例:
import scrapy
import pkgutil

class StockSpider(scrapy.Spider):
    name = "myspider"

    def start_requests(self):
        if not hasattr(self, 'spider_type'):
            self.logger.error('No spider_type specified')
            return
        data = pkgutil.get_data("tutorial", "resources/webs.txt")
        data = data.decode()

        for url in data.split("\r\n"):
            if self.spider_type == 'first':
                url += 'first'
            if self.spider_type == 'second':
                url += 'second'
            yield scrapy.Request(url)

    def parse(self, response):
        pass

而且,您始终可以创建基本主类,然后从中继承,在其中仅重载一个变量(您添加到URL中的变量)和名称(用于单独调用)。"最初的回答"。

0

spider_type 导致错误

NameError: name 'spider_type' is not defined.

这是在爬虫类中的self.spider_type。

import scrapy
import pkgutil

class StockSpider(scrapy.Spider):
    name = "myspider"

    def start_requests(self):
        if not hasattr(self, 'spider_type'):
            self.logger.error('No spider_type specified')
            return
        data = pkgutil.get_data("tutorial", "resources/webs.txt")
        data = data.decode()

        for url in data.split("\r\n"):
            if self.spider_type == 'first':
                url += 'first'
            if self.spider_type == 'second':
                url += 'second'
            yield scrapy.Request(url)

    def parse(self, response):
        pass

为了更加严格和准确。

scrapy crawl myspider -a spider_type='second'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接