Scrapy Pagination терпит неудачу на множественном листинге - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь очистить сайт с помощью скрапа. Когда я очищаю определенную страницу, работает очистка нумерации страниц, но когда я пытаюсь очистить все страницы одним скачком, нумерация страниц не работает.
Я попытался создать дополнительную функцию для нумерации страниц, но это не решает проблему. Вся помощь будет оценена. Что я делаю неправильно ? Вот мой код:

# -*- coding: utf-8 -*-
import scrapy

from scrapy.loader.processors import MapCompose, Join
from scrapy.loader import ItemLoader
from scrapy.http import Request

from avtogumi.items import AvtogumiItem


class BasicSpider(scrapy.Spider):
    name = 'gumi'
    allowed_domains = ['avtogumi.bg']
    start_urls = ['https://bg.avtogumi.bg/oscommerce/index.php' ]

    def parse(self, response):

        urls = response.xpath('//div[@class="brands"]//a/@href').extract()
        for url in urls:
            url = response.urljoin(url)
            yield scrapy.Request(url=url, callback=self.parse_params)


    def parse_params(self, response):

        l = ItemLoader(item=AvtogumiItem(), response=response)

        l.add_xpath('title', '//h4/a/text()')
        l.add_xpath('subtitle', '//p[@class="ft-darkgray"]/text()')
        l.add_xpath('price', '//span[@class="promo-price"]/text()',
            MapCompose(str.strip, str.title))
        l.add_xpath('stock', '//div[@class="product-box-stock"]//span/text()')
        l.add_xpath('category', '//div[@class="labels hidden-md hidden-lg"][0]//text()')
        l.add_xpath('brand', '//h4[@class="brand-header"][0]//text()', 
            MapCompose(str.strip, str.title))
        l.add_xpath('img_path', '//div/img[@class="prod-imglist"]/@src')

        yield l.load_item()

        next_page_url = response.xpath('//li/a[@class="next"]/@href').extract_first()
        if next_page_url:
            next_page_url = response.urljoin(next_page_url)
            yield scrapy.Request(url=next_page_url, callback=self.parse_params)

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Проблема в следующем:

l = ItemLoader(item=AvtogumiItem(), response=response)

l.add_xpath('title', '//h4/a/text()')
l.add_xpath('subtitle', '//p[@class="ft-darkgray"]/text()')
l.add_xpath('price', '//span[@class="promo-price"]/text()',
    MapCompose(str.strip, str.title))
l.add_xpath('stock', '//div[@class="product-box-stock"]//span/text()')
l.add_xpath('category', '//div[@class="labels hidden-md hidden-lg"][0]//text()')
l.add_xpath('brand', '//h4[@class="brand-header"][0]//text()', 
    MapCompose(str.strip, str.title))
l.add_xpath('img_path', '//div/img[@class="prod-imglist"]/@src')

yield l.load_item()

Этот фрагмент кода будет анализировать и загружать ровно один результат.Если у вас есть страница с несколькими результатами, вам придется поместить этот код в цикл for и перебрать все результаты поиска, которые вы хотите проанализировать:

objects = response.xpath('my_selector_here')
for object in objects:
    l = ItemLoader(item=AvtogumiItem(), response=response)

    l.add_xpath('title', '//h4/a/text()')
    l.add_xpath('subtitle', '//p[@class="ft-darkgray"]/text()')
    l.add_xpath('price', '//span[@class="promo-price"]/text()',
        MapCompose(str.strip, str.title))
    l.add_xpath('stock', '//div[@class="product-box-stock"]//span/text()')
    l.add_xpath('category', '//div[@class="labels hidden-md hidden-lg"][0]//text()')
    l.add_xpath('brand', '//h4[@class="brand-header"][0]//text()', 
        MapCompose(str.strip, str.title))
    l.add_xpath('img_path', '//div/img[@class="prod-imglist"]/@src')

    yield l.load_item()

Надеюсь, это поможет

0 голосов
/ 18 сентября 2018

использовать / перезаписать этот код

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request


class BasicSpider(scrapy.Spider):
    name = 'gumi'
    allowed_domains = ['avtogumi.bg']
    start_urls = ['https://bg.avtogumi.bg/oscommerce/']

    def parse(self, response):   
        urls = response.xpath('//div[@class="brands"]//a/@href').extract()
        for url in urls:
            yield Request(url=response.urljoin(url), callback=self.parse_params)

    def parse_params(self, response):
        subjects = response.xpath('//div[@class="full-product-box search-box"]')
        for subject in subjects:
            yield {
                'title': subject.xpath('.//h4/a/text()').extract_first(),
                'subtitle': subject.xpath('.//p[@class="ft-darkgray"]/text()').extract_first(),
                'price': subject.xpath('.//span[@class="promo-price"]/text()').extract_first(),
                'stock': subject.xpath('.//div[@class="product-box-stock"]//span/text()').extract_first(),
                'category': subject.xpath('.//div[@class="labels hidden-md hidden-lg"][0]//text()').extract_first(),
                'brand': subject.xpath('.//h4[@class="brand-header"][0]//text()').extract_first(),
                'img_path': subject.xpath('.//div/img[@class="prod-imglist"]/@src').extract_first(),
            }
        next_page_url = response.xpath('//li/a[@class="next"]/@href').extract_first()
        if next_page_url:
            yield Request(url=next_page_url, callback=self.parse_params)

13407 пунктов соскоб

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...