Il y a deux araignées qui utilisent le même fichier de ressources et presque la même structure.

L'araignée contient:

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

Le spiderB contient:

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

Comment puis-je combiner spiderS et spider, et ajouter une variable de commutation pour laisser crapy scral appeler différentes araignées en fonction de mes besoins?

4
it_is_a_literature 17 mars 2019 à 12:03

2 réponses

Meilleure réponse

Essayez d'ajouter un paramètre distinct pour le type d'araignée. Vous pouvez le définir en appelant scrapy crawl myspider -a spider_type=second. Vérifiez cet exemple de code:

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

Et vous pouvez également toujours créer la classe principale de base, puis en hériter, en surchargeant une seule variable (que vous ajoutez à l'URL) et un nom (pour les appels séparés).

2
vezunchik 19 mars 2019 à 05:44

spider_type entraîne une erreur

NameError: name 'spider_type' is not defined.

C'est self.spider_type dans la classe spider.

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

Pour le rendre plus strictement et plus précisément.

scrapy crawl myspider -a spider_type='second'
0
showkey 19 mars 2019 à 07:07