Web scraping 如何迭代刮取每个项目,无论位置如何

Web scraping 如何迭代刮取每个项目,无论位置如何,web-scraping,scrapy,Web Scraping,Scrapy,我正在使用scrapy,并尝试从产品中获取技术说明。但是我找不到任何我要找的教程 我正在使用这个网站: 例如,我需要提取该产品的型号: Modelo-->KCIN32HA3AN . 它排在第五位。 (//span[@gb-tech-spec-module-list-description'])[5] 但如果我选择其他产品: 模型为:Modelo-->ALS35-WCCR 它位于第6位。我只得到60立方米,因为这是第五位 我不知道如何迭代以获得每个模型,无论位置如何 这就是我现在使用的代码 fr

我正在使用scrapy,并尝试从产品中获取技术说明。但是我找不到任何我要找的教程

我正在使用这个网站:

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

但如果我选择其他产品:

模型为:Modelo-->ALS35-WCCR 它位于第6位。我只得到60立方米,因为这是第五位

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

这就是我现在使用的代码

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

获取第一个返回的匹配项

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

但是,您可以使用与所需元素关联最多的引用,而不是元素位置

例如,我访问了您链接并打开的站点,请注意,值为
modelo
的元素应该与“呈现”modelo的元素相关联:

<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>
这样,
Xpath
就不依赖于位置

  • 要使用
    以下同级

谢谢,这正是我需要的。你搞定了!
//*[contains(text(), "Modelo")]/following-sibling::*[contains(@class, "description")]/text()