Scrapy: как передать элемент между методами, используя мета - PullRequest
0 голосов
/ 05 апреля 2019

Я новичок в scrapy и python и пытаюсь передать элемент item ['author'] в parse_quotes следующему методу разбора parse_bio

Я попробовал подходы request.meta и response.meta, как показано в документации по scrapy, но безуспешно. см. код в соответствии с ниже.

Спасибо заранее за ваш вклад

import scrapy
from tutorial.items import QuotesItem

class QuotesSpider(scrapy.Spider): 

name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/login',
        #'http://quotes.toscrape.com/page/2',
    ]

    # Scraping a site with login
    # Important: Cookie settings must be "True" to keep the login session alive

    custom_settings = {'COOKIES_ENABLED': True}

    def parse(self, response):
        return scrapy.FormRequest.from_response(
            response,
            formdata={'username': 'john', 'password': 'secret'},
            callback=self.parse_quotes
            )


    def parse_quotes(self, response):
        for sel in response.css('div.quote'):
            item = QuotesItem()
            item['text'] = sel.css('span.text::text').get()
            item['author'] = sel.css('small.author::text').get()
            item['tags'] = sel.css('div.tags a.tag::text').getall()
            item['quotelink'] = sel.css('small.author ~ a[href*="goodreads.com"]::attr(href)').get()
            item['author_bio_link'] = sel.css('.author + a')
            yield item

            # follow the detail links @ shortcut
            # vertical crawling
            for a in item['author_bio_link']:
                yield response.follow(a, callback = self.parse_bio)

    def parse_bio(self, response):
        item = QuotesItem()
        item['author_born'] = response.css('p span::text').getall()
        item['author_born'] = item['author_born'][:2]
        item['author_bio'] = response.css('div.author-description ::text').get().strip()
        yield item

        # follow pagination links @ shortcut
        # horizontal crawling

        for a in response.css('li.next a'):
            yield response.follow(a, callback = self.parse_quotes)

Я ожидаю получить элемент ['author'] из parse_quotes, переданного parse_bio

1 Ответ

0 голосов
/ 05 апреля 2019

Я предлагаю вам использовать meta таким образом:

def parse_quotes(self, response):
    for sel in response.css('div.quote'):
        item = QuotesItem()
        item['text'] = sel.css('span.text::text').get()
        item['author'] = sel.css('small.author::text').get()
        item['tags'] = sel.css('div.tags a.tag::text').getall()
        item['quotelink'] = sel.css('small.author ~ a[href*="goodreads.com"]::attr(href)').get()
        item['author_bio_link'] = sel.css('.author + a')
        yield item

        # follow the detail links @ shortcut
        # vertical crawling
        for a in item['author_bio_link']:
            yield response.follow(a, self.parse_bio, 
                                  meta={'author': item['author']})  # <- you set it here

def parse_bio(self, response):
    item = QuotesItem()
    item['author_born'] = response.css('p span::text').getall()
    item['author_born'] = item['author_born'][:2]
    item['author_data'] = response.meta.get('author')  # <- you get it here
    item['author_bio'] = response.css('div.author-description ::text').get().strip()
    yield item

    # follow pagination links @ shortcut
    # horizontal crawling

    for a in response.css('li.next a'):
        yield response.follow(a, callback = self.parse_quotes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...