Можете ли вы использовать Scrapy CrawlSpider для получения данных с нескольких страниц (используя два правила с обратными вызовами и два метода разбора)? - PullRequest
0 голосов
/ 18 марта 2020

Итак, я пытаюсь использовать CrawlSpider, чтобы посетить страницу с категориями рецептов, получить названия и ссылки на категории рецептов, затем go на каждую страницу категории рецептов и перейти по ссылкам рецептов на этих страницах и очистить метаданные. каждого рецепта.

CrawlSpider позволяет легко go переходить от страницы к странице с помощью follow = True в определяемых мной правилах, но я не могу понять, как получить данные с более чем одной страницы. Я понимаю, что с обычным пауком-скрапом вы используете response.follow и meta, чтобы получить данные для сканирования с одной страницы, чтобы соответствовать результату вашего последнего метода анализа. Все, что у меня есть сейчас, - это возможность очищать данные с самой последней страницы, на которой заканчивается паук.

Это предполагаемый вывод: имя рецепта + метаданные с последней страницы со связанной категорией с первой страницы соскоб

Может ли CrawlSpider делать то, что я пытаюсь сделать? Или мне нужно построить его с базовым пауком?

Код на данный момент:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


def listToString(time_list):
    string = " "
    return string.join(time_list)


class OverviewSpiderSpider(CrawlSpider):
    name = 'main'
    allowed_domains = ['panlasangpinoy.com']
    start_urls = ['https://panlasangpinoy.com/recipes/']

    rules = (
        Rule(LinkExtractor(restrict_xpaths="//h4[@class='entry-title']/a"), follow=True),
        Rule(LinkExtractor(restrict_xpaths="//p/a[@class='more-link']"), callback='parse_recipe', follow=True),
        Rule(LinkExtractor(restrict_xpaths="//li[@class='pagination-next']/a"), )
    )

    def parse_recipe(self, response):
        yield {
            'recipe_name': response.xpath("//h1[@class='entry-title']/text()").get(),
            'course_type': response.xpath("normalize-space(//span[@class='wprm-recipe-course "
                                          "wprm-block-text-normal']/text())").get(),
            'cuisine': response.xpath("normalize-space(//span[@class='wprm-recipe-cuisine "
                                      "wprm-block-text-normal']/text())").get(),
            'prep_time': listToString(response.xpath("(//span[@class='wprm-recipe-time wprm-block-text-normal'])"
                                                     "[1]/descendant::*/text()").getall()),
            'cook_time': listToString(response.xpath("(//span[@class='wprm-recipe-time wprm-block-text-normal'])"
                                                     "[2]/descendant::*/text()").getall()),
            'link_url': response.url,
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...