Итак, я пытаюсь использовать 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,
}