Очистить многоуровневое меню с помощью Scrapy 1.5 - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь получить все ссылки из многоуровневого меню.
start_urls = ['https://www.bbcgoodfood.com/recipes/category/ingredients']

import scrapy

from foodisgood.items import FoodisgoodItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst


class BbcSpider(CrawlSpider):

    name = 'bbc'
    allowed_domains = ['bbcgoodfood.com']

    start_urls = ['https://www.bbcgoodfood.com/recipes/category/ingredients']

    rules = (
        Rule(LinkExtractor(allow=(r'/recipes/category/[\w-]+$'), restrict_xpaths='//article[contains(@class, "cleargridindent")]'), callback='parse_sub_categories', follow=True),
        Rule(LinkExtractor(allow=(r'/recipes/collection/[\w-]+$'), restrict_xpaths='//article[contains(@class, "cleargridindent")]'), callback='parse_collections', follow=True),
    )

    def parse_sub_categories(self, response):
        l = ItemLoader(item=FoodisgoodItem(), response=response)

        l.default_output_processor = TakeFirst()

        l.add_xpath('category_title', '//h1[@class="section-head--title"]/text()')
        l.add_value('page_url', response.url)

        yield l.load_item()

    def parse_collections(self, response):
        l = ItemLoader(item=FoodisgoodItem(), response=response)

        l.default_output_processor = TakeFirst()

        l.add_xpath('collection_title', '//h1[@class="section-head--title"]/text()')
        l.add_value('page_url', response.url)

        yield l.load_item()

Результаты очистки меню Но я не могу понять, как заполнять пустыепервый столбец перед названием коллекции.

На данный момент у меня есть:

EMPTY |Рецепты стейков |https://www.bbcgoodfood.com/recipes/collection/steak

Но мне нужно:

Мясо |Рецепты стейков |https://www.bbcgoodfood.com/recipes/collection/steak

Может кто-нибудь дать мне совет, что нужно сделать, чтобы получить результат с подкатегорией в первом столбце?

Спасибо всем)

1 Ответ

0 голосов
/ 21 ноября 2018

То, что вы хотите, на самом деле не выполнимо с использованием правил CrawlSpider (по крайней мере, не простым способом).

Обычный способ сделать это документирован в Передача дополнительных данных вфункции обратного вызова .
Вы извлекаете категорию при первом обратном вызове, а затем создаете новый запрос, передавая эту информацию в meta dict.

...