Я застрял некоторое время, надеюсь, кто-нибудь поможет мне решить следующее:
Что я пытаюсь сделать:
Со следующего веб-сайта https://www.coop.nl/boodschappen Я пытаюсь перейти с
1) Уровень категории:
category_url = response.xpath("//div[contains(@class,'block categories')]//a/@href")
2) Уровень обзора продукта:
product_url = response.xpath("//article[contains(@class,'gi b0_12 b2_06 b4_08 listItem')]//div/a/@href").extract()
3) Уровень детализации продукта:
Извлечение и хранение следующих предметов:
Уровень категории: category_name
, category_url
Уровень обзора продукта: product_url
Уровень детализации продукта: product_name
, product_description
,
product_pricesI
, product_pricesII
В настоящее время появляется следующая ошибка
line 21, in parse item['category_name'] = category_name
NameError: name 'item' is not defined
Я использую Scrapy 1.5.2 и Python 3.6.4
Items.py файл
import scrapy
class CoopItem(scrapy.Item):
category_name = scrapy.Field()
category_url = scrapy.Field()
product_name = scrapy.Field()
product_description = scrapy.Field()
product_pricesI = scrapy.Field()
product_pricesII = scrapy.Field()
product_url = scrapy.Field()
файл coop.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from ..items import CoopItem
class CoopSpider(scrapy.Spider):
name = 'coop'
allowed_domains = ['coop.nl']
start_urls = [
'https://www.coop.nl/boodschappen/'
]
def parse(self, response):
# categories
#item = CoopItem()
category_name = response.xpath("//div[contains(@class,'block categories')]//div[contains(@class,'title')]/span/text()")
category_url = response.xpath("//div[contains(@class,'block categories')]//a/@href")
#item['category_name'] = category_name
#item['category_url'] = category_url
for href in category_url:
cat_url = href.extract()
cat_name = category_name.extract()
yield Request(url = cat_url,
callback = self.parse_products, meta= {'category_name':cat_name, 'category_url':cat_url})
def parse_products(self, response):
# Product overview page(s)
product_url = response.xpath("//article[contains(@class,'gi b0_12 b2_06 b4_08 listItem')]//div/a/@href").extract()
#NEXT_PAGE_SELECTOR = '.pagination--lister a.next::attr(href)'
#next_page = response.css(NEXT_PAGE_SELECTOR).extract_first()
NEXT_PAGE_SELECTOR = response.xpath("//div[contains(@class,'pagination--lister')]//a[contains(@rel,'next')]/@href")
for href in NEXT_PAGE_SELECTOR:
next_page_url = href.extract()
yield scrapy.Request(url=next_page_url, callback=self.parse_products)
yield Request(url, callback = self.parse_product_items, meta={'category_name': category_name, 'category_url': category_url, 'product_url': product_url})
def parse_product_items(self, response):
# Product detail page
product_name = response.xpath("//h1[contains(@itemprop,'name')]//text()").extract()
product_description = response.xpath("//dl[contains(@class,'definitionList')]//text()").extract()
product_pricesI = response.xpath("//div[contains(@class,'primeDetails gi b0_12 b3_12 b3_push_01 m-0')]//ins/text()").extract()
product_pricesII = response.xpath("//div[contains(@class,'primeDetails gi b0_12 b3_12 b3_push_01 m-0')]//span/text()").extract_first()
item = CoopItem()
item['category_name'] = category_name
item['category_url'] = category_url
item['product_name'] = product_name
item['product_description'] = product_description
item['product_pricesI'] = product_pricesI
item['product_pricesII'] = product_pricesII
item['product_url'] = product_url
yield item