Как связать элементы одного метода синтаксического анализа с другим? - PullRequest
0 голосов
/ 13 июля 2020

'' '

    import scrapy
    from ..items import GooddealItem

    class FarmtoolsSpider(scrapy.Spider):
        name = 'farmtools'
        allowed_domains = ['www.gooddeal.com']
        start_urls = ['https://www.gooddeal.com/all? 
        source=private&sort=publishdate%20desc']

        def parse(self, response):

            items = GooddealItem()

            rows = response.xpath('//ul[@class="card-collection"]/li')

            for row in rows:
                link = row.xpath('.//a/@href').get() #this is the full link.
                link_split = link.split('/')[-1] #this splits the url link th first time.
                linkid = link_split.split('?')[0] #this splits it the second time.
                title = row.xpath('.//div[1]/p[@class="card__body-title"]/text()').get()
                county = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/following-sibling::node()/text()').get()
                price = row.xpath('.//p[@class="card__price"]/span[1]/text()').get()
                subcat = row.xpath('.//a/div/div[2]/div[1]/p[2]/text()[2]').get()
                zero = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/text()').get()
                if zero == '0 min':

                     items['linkid'] = linkid
                     items['title'] = title
                     items['county'] = county
                     items['price'] = price
                     items['subcat'] = subcat
                     items['zero'] = zero
                     items['link'] = link

                    yield response.follow(url = link, callback=self.parse_item_page)

        def parse_item_page(self, response):

            items = GooddealItem()

            rows = response.xpath('/html/body[1]')

            for row in rows:
                category = row.xpath('.//main/div/div[1]/div/div[1]/div/nav/span/a[1]/span/text()').get(),
                views = row.xpath('.//main/div/div[1]/div/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[1]/div/div/span[2]/text()').get(),
                seller_id = row.xpath('.//main/div/div[1]/div/div[2]/div[2]/div[2]/div[3]/div/div[1]/div[1]/div[2]/a/@href').get(),
                seller_ads = row.xpath('.//main/div/div[1]/div/div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[3]/dd/text()').get(),
                lifetime_ads = row.xpath('//main/div/div[1]/div/div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[4]/dd/text()').get()

                items['category'] = category
                items['views'] = views
                items['seller_id'] = seller_id
                items['seller_ads'] = seller_ads
                items['lifetime_ads'] = lifetime_ads

                yield items

' '' Я застрял на этом, поскольку это моя первая попытка. Когда я запускаю код, я просто возвращаюсь:

2020-07-12 22:53:21 [scrapy.core.scraper] DEBUG: скопировано с <200 <a href="https://www.gooddeal.com/dogs-for-sale/dachshunds/25348559%3E" rel="nofollow noreferrer">https://www.gooddeal.com/dogs-for-sale/dachshunds/25348559> {'category': (None,), 'Life_ads': None, 'seller_ads': (None,), 'seller_id': (None,), 'views': (None,)}

Любая помощь будет оценена, спасибо

1 Ответ

0 голосов
/ 13 июля 2020

Я предполагаю, что вы хотите, чтобы данные, извлеченные методом parse, были объединены вместе с данными, извлеченными из parse_item_page.

Если вы используете Scrapy v1.7 + вы можете использовать cb_kwargs при построении запроса.

Этот параметр получает dict с произвольными данными, которые будут использоваться в качестве аргумента в функции обратного вызова. Таким образом, вам нужно будет сделать что-то вроде этого в своем запросе:

        ...
        yield response.follow(url = link, callback=self.parse_item_page, cb_kwargs={'scraped_item': items})

Чтобы это работало, вам также необходимо изменить функцию обратного вызова, чтобы получить этот параметр. Примерно так:

    def parse_item_page(self, response, scraped_item):
        ...

Scrapy позаботится об отправке scraped_item при вызове parse_item_page.

Если вы используете Scrapy v1.6 или старше:

Вам нужно будет использовать параметр meta . Этот метод все еще работает в более поздних версиях, но предпочтительнее cb_kwargs (решение выше).

При построении запроса вы будете использовать мета-параметр, чтобы включить в запрос некоторые произвольные данные. Данные будут доступны в объекте ответа, который получает функция обратного вызова. Ваш запрос должен выглядеть так:

        ...
        yield response.follow(url = link, callback=self.parse_item_page, meta={'scraped_item': items})

В этом случае вы получите доступ к данным, позвонив response.meta:

    def parse_item_page(self, response):
        items = response.meta.get('scraped_item') #response.meta is a dict
        ...
...