首页 > 解决方案 > 如何正确设置分页?

问题描述

我目前正在编写一个 Scrapy 代码,它将为每种产品提取 3 种类型的数据。我将数据称为“标题、价格和 upc”。对于每种产品,我已经让我的程序能够正确地抓取标题和价格,但是由于 upc 在另一个页面上,所以我在抓取 upc 时遇到了麻烦。

我希望我的程序为每个产品做的是提取主页上的标题和价格,然后进入另一个页面以提取 UPC 代码。获得 upc 代码后,我希望程序转到主页上的下一个产品,并对其余产品重复相同的方法。

这是我的代码。

import scrapy
from scrapy.utils.response import open_in_browser
from ..items import QuotetutorialItem

data={hidden}
headers={hidden}

class BrickseekSpider(scrapy.Spider):
    name = 'brickseek1'
    allowed_domains = ['brickseek.com']

    def start_requests(self):
        dont_filter = True
        yield scrapy.http.FormRequest(url='https://brickseek.com/login/', headers=headers, formdata=data,
                                      callback=self.parse)

    def parse(self, response):
        items = QuotetutorialItem()
        products = response.css('div.item-list__tile')

        for product in products:
            title = product.css('.item-list__title span::text').extract()
            price = product.css('.item-list__price-column--highlighted .price-formatted__dollars::text').extract()

        #another_page = response.css('div.item-list__tile a::attr(href)').get()
        #if another_page:
            #upc = product.css('div.item-overview__meta-item::text').extract()[6]
            #yield response.follow(another_page, callback=self.parse)

        items['title'] = title
        items['price'] = price
        #items['upc'] = upc

        yield items

标签: pythonpython-3.xscrapy

解决方案


您需要做的就是在访问下一页时将您的项目(在填写标题、价格之后)放入元中(假设您的 css 选择器是正确的)

def parse(self, response):
    items = QuotetutorialItem()
    products = response.css('div.item-list__tile')

    for product in products:
        item = QuotetutorialItem()
        item['title'] = product.css('.item-list__title span::text').extract()
        item['price'] = product.css('.item-list__price-column--highlighted .price-formatted__dollars::text').extract()
        another_page = response.css('div.item-list__tile a::attr(href)').get()
        if another_page:
            yield response.follow(another_page, callback=self.parse_upc,meta={'item':item})
        else:
            yield item

def parse_upc(self,response):
    item=response.meta['item']
    item['upc'] = product.css('div.item-overview__meta-item::text').extract()[6]
    yield item

推荐阅读