Scrapy / Parse несколько категорий и подкатегорий с одной и той же функцией - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть рабочий (в большинстве случаев) код для очистки сайта электронной коммерции.Я начинаю с URL-адреса и сканирую основные категории, затем захожу на одного юриста для сканирования подкатегорий и повторяю те же действия, пока не попаду на страницу продуктов.

Это выглядит так:

class ExampleSpider(scrapy.Spider):
    name = "example_bot"  # how we have to call the bot
    start_urls = ["https://......html"]

def parse(self, response):
    for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
        yield response.follow(link, callback = self.parse_on_categories) #going to one layer deep from landing page

def parse_on_categories(self, response):
    for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
        yield response.follow(link, callback = self.parse_on_subcategories) #going to two layer deep from landing page

def parse_on_subcategories(self, response):
    (same code than above)

def parse_data(self, response):
    (parse data)

Я заметил, что для некоторых частей веб-сайта мне нужно углубиться в подкатегории, чтобы иметь возможность анализировать продукты.Поскольку я всегда повторно использую один и тот же код для сканирования категорий, мне интересно, можно ли было просто повторно использовать первую функцию, пока не останется больше категорий для сканирования.Вот что я попробовал:

def parse(self, response):
    for link in response.css('div.mvNavSub ul li a::attr(href)').extract():
        yield response.follow(link, callback = self.parse_on_categories)

def parse_on_categories(self, response):
    if response.css('div.mvNavSub ul li a::attr(href)').extract(): # if there is categories to crawl
        self.parse(response)
    else:
        self.parse_data(response)

def parse_data(self, response):

Если есть категории для сканирования, я бы хотел, чтобы parse_on_categories вызывала первую функцию.Если нет, нужно вызвать parse_data.

Но пока я не могу заставить его работать, поэтому, если бы вы могли поставить меня на трек, это было бы очень признательно :) спасибо

1 Ответ

0 голосов
/ 26 декабря 2018

Вы должны выдавать все, что получаете от методов parse () и parse_data ().

def parse_on_categories(self, response):
    if response.css('div.mvNavSub ul li a::attr(href)').extract():
        callback = self.parse
    else:
        callback = self.parse_data

    for r in callback(response):
        yield r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...