2016-08-10 4 views
0

Ниже код scrapy (взято из одного сообщения в блоге) работает нормально, чтобы отменить данные только на первой странице. Я добавил «Правило» для извлечения данных со второй страницы, но все же он берет данные только с первой страницы.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 

ответ

0

Есть несколько проблем здесь с пауком. Во-первых вы перекрывая parse() метод, который зарезервирован по crawlspider, согласно документации:

При написании правил обхода паука, избегать использования в качестве обратного вызова разобрана, так как 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 
+0

Спасибо! работал отлично. – Overflow