Scrapy - очистка данных только с первой страницы, а не со следующей страницы в разбиении на страницы

Ниже приведен код очистки (взятый из одного сообщения в блоге), который отлично работает для удаления данных только с первой страницы. Я добавил «Правило» для извлечения данных со второй страницы, но все же он берет данные только с первой страницы.

Любой совет?

Вот код:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from ..items import TfawItem


class MasseffectSpider(CrawlSpider):
    name = "massEffect"
    allowed_domains = ["tfaw.com"]
    start_urls = [
        'http://www.tfaw.com/Companies/Dark-Horse/Series/?series_name=Adventure-Time',
    ]

    rules = (
        Rule(LinkExtractor(allow=(),
                           restrict_xpaths=('//div[@class="small-corners-light"][1]/table/tbody/tr[1]/td[2]/a[@class="regularlink"]',)),
             callback='parse', follow=True),
    )

    def parse(self, response):
        for href in response.xpath('//a[@class="regularlinksmallbold product-profile-link"]/@href'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_detail_page)
        pass

    def parse_detail_page(self, response):
        comic = TfawItem()
        comic['title'] = response.xpath('//td/div[1]/b/span[@class="blackheader"]/text()').extract()
        comic['price'] = response.xpath('//span[@class="redheader"]/text()').extract()
        comic['upc'] = response.xpath('//td[@class="xh-highlight"]/text()').extract()
        comic['url'] = response.url
        yield comic

person Overflow    schedule 10.08.2016    source источник


Ответы (1)


Здесь есть несколько проблем с вашим пауком. Сначала вы переопределяете метод parse(), который зарезервирован Crawspider, в соответствии с документацией:

При написании правил обходчика избегайте использования синтаксического анализа в качестве обратного вызова, поскольку CrawlSpider использует сам метод синтаксического анализа для реализации своей логики. Поэтому, если вы переопределите метод синтаксического анализа, паук больше не будет работать.

Теперь вторая проблема заключается в том, что ваш LinkExtractor ничего не извлекает. В частности, ваш xpath здесь ничего не делает.

Я бы порекомендовал вообще не использовать CrawlSpider и просто использовать базовый scrapy.Spider следующим образом:

import scrapy
class MySpider(scrapy.Spider):
    name = 'massEffect'
    start_urls = [
        'http://www.tfaw.com/Companies/Dark-Horse/Series/?series_name=Adventure-Time',
    ]

    def parse(self, response):
        # parse all items
        for href in response.xpath('//a[@class="regularlinksmallbold product-profile-link"]/@href'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_detail_page)
        # do next page
        next_page = response.xpath("//a[contains(text(),'next page')]/@href").extract_first()
        if next_page:
            yield Request(response.urljoin(next_page), callback=self.parse)

    def parse_detail_page(self, response):
        comic = dict()
        comic['title'] = response.xpath('//td/div[1]/b/span[@class="blackheader"]/text()').extract()
        comic['price'] = response.xpath('//span[@class="redheader"]/text()').extract()
        comic['upc'] = response.xpath('//td[@class="xh-highlight"]/text()').extract()
        comic['url'] = response.url
        yield comic
person Granitosaurus    schedule 10.08.2016