无论位置如何,如何迭代以抓取每个项目

How to iterate to scrape each item no matter the position

我正在使用 scrapy,我正在使用 scrape 产品的技术说明。但是我找不到任何我正在寻找的教程。

我正在使用这个网站:Air Conditioner 1

例如,我需要提取该产品的型号: 型号 ---> KCIN32HA3AN .它位于第 5 位。 (//span[@class='gb-tech-spec-module-list-description'])[5]

但如果我选择其他产品: Air Conditioner 2

型号为:Modelo ---> ALS35-WCCR 它位于第 6 个位置。我只得到这个 60 m3 因为它是第 5 个位置。

我不知道如何迭代获取每个模型,无论位置如何。

这是我现在使用的代码

from scrapy.item import Field
from scrapy.item import Item
from scrapy.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.loader.processors import MapCompose
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader

class Hotel(Item):
    titulo = Field()
    precio = Field()
    marca = Field()
    modelo = Field()

class TripAdvisor(CrawlSpider):
    name = 'Hoteles'

    custom_settings = {
      'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.80 Chrome/71.0.3578.80 Safari/537.36',
      'CLOSESPIDER_PAGECOUNT': 20
    }

    start_urls = ['https://www.garbarino.com/productos/aires-acondicionados-split/4278']

    download_delay = 2

    rules = (
        Rule(  
            LinkExtractor(
                allow=r'/?page=\d+'
            ), follow=True),

        Rule( 
            LinkExtractor(
                allow=r'/aire-acondicionado-split'
            ), follow=True, callback='parse_items'),
    )

    def parse_items(self, response):
        sel = Selector (response)
        item = ItemLoader(Hotel(), sel)
        
        item.add_xpath('titulo', '//h1/text()')
        item.add_xpath('precio', '//*[@id="final-price"]/text()')
        item.add_xpath('marca', '(//span[@class="gb-tech-spec-module-list-description"])[1]/text()', MapCompose(lambda i: i.replace('\n', ' ').replace('\r', ' ').strip()))
        item.add_xpath('modelo', '(//span[@class="gb-tech-spec-module-list-description"])[5]/text()', MapCompose(lambda i: i.replace('\n', ' ').replace('\r', ' ').strip()))

        yield item.load_item()

对于这两个,您可以使用以下 css 选择器:

 ul:nth-child(2) > li:nth-child(1) > span

取第一个返回的匹配项

按位置获取元素并不好,网站可能会更改很多次,这会迫使您修复爬虫,在某些情况下,需要修复几次。

但是您可以使用一些与您想要的元素最相关而不是元素位置的参考。

例如,我访问了您链接的网站并打开了这个 product page,请注意,值为 modelo 的元素应该与“呈现”[=12] 的元素相关联=]:

<ul>
    <li>
        <h3 class="gb-tech-spec-module-list-title">Modelo</h3>
        <span class="gb-tech-spec-module-list-description">BSI26WCCR</span>
    </li>
    <li>
        <h3 class="gb-tech-spec-module-list-title">Tipo de Tecnología</h3>
        <span class="gb-tech-spec-module-list-description">Inverter</span>
    </li>
    ...
</ul>

因此,您可以执行以下操作:

//*[contains(text(), "Modelo")]/following-sibling::*[contains(@class, "description")]/text()

这样一来,Xpath就不依赖位置了。