Как я могу объединить двух пауков в один? - PullRequest
4 голосов
/ 17 марта 2019

Есть два паука, которые используют один и тот же файл ресурсов и почти одинаковую структуру.

SpiderA содержит:

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

SpiderB содержит:

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 и добавить переменную-переключатель, чтобы crapy scral вызывал другого паука в зависимости от моих потребностей?

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Попробуйте добавить отдельный параметр для типа паука. Вы можете установить его с помощью вызова 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 голосов
/ 19 марта 2019

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...