2017-01-17 14 views
1

Hallo dies ist meine erste Post,Scrapy Paginierung schlägt fehl

Also ich versuche, eine Web Spinne zu machen, die über die Links in invia.cz folgen und kopieren Sie alle Titel vom Hotel entfernt.

import scrapy 


y=0 
class invia(scrapy.Spider): 
    name = 'Kreta' 
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1'] 

    def parse(self, response): 

     for x in range (1, 9): 
      yield { 
      'titles':response.css("#main > div > div > div > div.col.col-content > div.product-list > div > ul > li:nth-child(%d)>div.head>h2>a>span.name::text"%(x)).extract() , 
      } 

     if (response.css('#main > div > div > div > div.col.col-content > 
          div.product-list > div > p > 
          a.next').extract_first()): 
     y=y+1 
     go = ["https://dovolena.invia.cz/d_start_from=13.01.2017&sort=nl_sell&page=%d" % y] 
     print go 
     yield scrapy.Request(
       response.urljoin(go), 
       callback=self.parse 
     ) 

Auf dieser Website Seiten mit AJAX geladen werden, so ändere ich den Wert der URL durch eine nur erhöht manuell, wenn die nächste Schaltfläche in der Seite angezeigt wird.

In der Scrapy Shell, wenn ich testen, ob die Schaltfläche erscheint und die Bedingungen alles ist gut, aber wenn ich die Spinne starte, kriecht es nur die erste Seite.

Es ist meine erste Spinne, also vielen Dank im Voraus.

Auch die errol log Error Log1Error Log

+2

bitte die Protokolle teilen, was ist der Fehler, den Sie bekommen? – eLRuLL

+0

@eLRuLL Ich habe die Fehlerprotokolle gepostet, wenn Sie sie überprüfen möchten. – Kostas

+0

@Granitosaurus Sie haben den Code überprüft? – Kostas

Antwort

0

Ihre Nutzung von „global“ y Variable nicht nur eigentümlich ist, aber wird nicht funktionieren entweder

Sie verwenden y zu berechnen, wie viele Male Parse genannt wurde. Im Idealfall wollen Sie nicht außerhalb der Funktionen Umfang alles zugreifen, so dass Sie mit der Verwendung von request.meta Attribut das Gleiche erreichen:

def parse(self, response): 
    y = response.meta.get('index', 1) # default is page 1 
    y += 1 
    # ... 
    #next page 
    url = 'http://example.com/?p={}'.format(y) 
    yield Request(url, self.parse, meta={'index':y}) 

In Bezug auf Ihre Paginierung Problem, Ihre nächste Seite url CSS-Selektor ist falsch, da die <a> Für den Knoten, den Sie auswählen, ist kein absolutes href angehängt. Auch dieses Problem macht Ihr Problem y obsolet. Zur Lösung dieses Versuchs:

def parse(self, response): 
    next_page = response.css("a.next::attr(data-page)").extract_first() 
    # replace "page=1" part of the url with next number 
    url = re.sub('page=\d+', 'page=' + next_page, response.url) 
    yield Request(url, self.parse, meta={'index':y}) 

EDIT: Hier ist die gesamte Arbeits Spinne:

import scrapy 
import re 


class InviaSpider(scrapy.Spider): 
    name = 'invia' 
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1'] 

    def parse(self, response): 
     names = response.css('span.name::text').extract() 
     for name in names: 
      yield {'name': name} 

     # next page 
     next_page = response.css("a.next::attr(data-page)").extract_first() 
     url = re.sub('page=\d+', 'page=' + next_page, response.url) 
     yield scrapy.Request(url, self.parse) 
+0

Ich habe das gleiche Problem wieder. Es geht nur auf die erste Seite. – Kostas

+0

@Kostas könnten Sie Ihren Code aktualisieren? – Granitosaurus

+0

Dies ist der aktualisierte Code http://imgur.com/a/fVBzJ – Kostas