Передача данных с мета в скрапе - PullRequest
0 голосов
/ 28 октября 2019

Я хочу передать sec_url из метода parse_sec_frame в parse_frame и вывести все три значения одновременно. Попробовал это следующим образом без удачи и не мог придумать никакой другой логики. Любое предложение по этому поводу? Ниже приведен код:

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


class CtSpider(CrawlSpider):
    custom_settings = {
        'CONCURRENT_REQUESTS': 1
    }
    name = 'ct'

    allowed_domains = ['cartoon3rbi.net']
    start_urls = ['https://www.cartoon3rbi.net/cartooncat-920.html']
    #
    rules = (
        Rule(LinkExtractor(restrict_xpaths='//div[@class="pagination"]/a[4]'), follow=True),

        Rule(LinkExtractor(restrict_xpaths='//div[@class="cartoon_eps_name"]'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):

        for el in response.xpath('//div[@id="topme"]'):
            response.meta['NAME'] = el.xpath('//div[@class="block_title"]/text()').extract()

            frames = el.xpath('//div[@class="embedcode"]/iframe/@src').extract()

            for frame in frames:
                yield scrapy.Request(url=frame, callback=self.parse_frame, meta=response.meta)
                sec_link = frame.replace('1', '4')
                yield scrapy.Request(url=sec_link, callback=self.parse_sec_frame)

    def parse_sec_frame(self, response):
        response.meta['url'] = response.xpath('//div[@id="picasa"]/iframe/@src').extract_first()
        yield scrapy.Request(url=response.meta['url'], callback=self.parse_frame, meta=response.meta)

    def parse_frame(self, response):
        name = response.meta['NAME']
        url = response.xpath('//div[@id="picasa"]/iframe/@src').extract_first()
        sec_url = response.meta['url']
        yield {
            'Name': name,
            'Url': url,
            'sec_link': sec_url,
        }

1 Ответ

1 голос
/ 29 октября 2019

Почему вы меняете response.meta? Вам нужно создать новый request и работать с request.meta, если вы хотите yield позже. Или вы можете немного изменить свой код:

   def parse_item(self, response):

        for el in response.xpath('//div[@id="topme"]'):
            NAME = el.xpath('//div[@class="block_title"]/text()').extract()

            frames = el.xpath('//div[@class="embedcode"]/iframe/@src').extract()

            for frame in frames:
                yield scrapy.Request(url=frame, callback=self.parse_frame, meta=response.meta)
                sec_link = frame.replace('1', '4')
                yield scrapy.Request(url=sec_link, callback=self.parse_sec_frame, meta={'NAME': NAME})

    def parse_sec_frame(self, response):
        url = response.xpath('//div[@id="picasa"]/iframe/@src').extract_first()
        yield scrapy.Request(url=url, callback=self.parse_frame, meta={'NAME': response.meta["NAME"], 'url': url})

    def parse_frame(self, response):
        name = response.meta['NAME']
        url = response.xpath('//div[@id="picasa"]/iframe/@src').extract_first()
        sec_url = response.meta['url']
        yield {
            'Name': name,
            'Url': url,
            'sec_link': sec_url,
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...