python - 如何正确设置分页?
问题描述
我目前正在编写一个 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
解决方案
您需要做的就是在访问下一页时将您的项目(在填写标题、价格之后)放入元中(假设您的 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
推荐阅读
- c - C函数的正确返回类型?
- winapi - Windows:使用 FreePascal 调用 WMI 函数——工作示例?
- excel - 小计更改时触发事件(excel、vba)
- wpf - WPF 用户控件作为多边形
- spring-data-jpa - 如何减少 Atomikos 中的 getConnection 时间消耗
- node.js - 请解释在使用 .then() 和 Promise 时调用语法的细微差别的巨大影响
- azerothcore - 如何安装 azerothcore 模块,例如缓冲区 npc 模块
- c++ - DLL 项目未在 Visual Studio 2019 中构建
- python - 使用pytest测试同一个类的不同实例
- r - 将矩阵转换为分配特定列的数组