Python-Scrapy: получение имени переменной, определенной в одной функции, через другую - PullRequest
0 голосов
/ 25 июня 2018

После объявления переменной в функции синтаксического анализа как «self.Title» и выдачи данных через другую функцию, она возвращает данные только одного URL-адреса по всем остальным. Что может быть не так.Вот фрагмент кода.

import scrapy
from scrapy.http import Request

class TestSpider(scrapy.Spider):
    name = 'Test'
    allowed_domains = ['example.com']
    start_urls = ['https://example.com/search?q=com.foo', 'https://example.com/search?q=bar', 'https://example.com/search?q=data']

    def parse(self, response):

        self.Title = response.xpath('//*[@class="search-title"]/a/text()')[0].extract()
        Ini_Url = response.xpath('//*[@class="search-title"]/a/@href')[0].extract()
        Ab_url = "https://example.com" + Ini_Url + "/download?from=details"
        yield Request(Ab_url, callback=self.parse_download)

    def parse_download(self, response):
        Download_URL = response.xpath('//*[@class="fdownload-box"]/p[2]/a/@href')[0].extract()

        yield{"Download_URL": Download_URL, "Title": self.Title}

И вывод будет выглядеть так, как будто Download_URL различны для всех 3 очищенных URL-адресов, но заголовок, хотя разные, одинаковы для всех 3 запросов.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

В качестве решения я написал этот фрагмент в первой функции:

request.meta['Title'] = Title
yield request

И вызвал его в другую с помощью:

Title = response.meta['Title']
0 голосов
/ 25 июня 2018

Вы не можете хранить данные для каждого элемента в экземпляре класса Spider.

Когда parse возвращает Request, передайте Title как metadata, как описано в документах . Затем он доступен для использования в parse_download в свойстве response.meta.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...