2017-03-04 9 views
-1

Hallo Danke, dass Sie sich die Zeit genommen haben, um Ihnen zu helfen.Wie geht man mit scrapy zur nächsten Seite?

Problem: Ich habe versucht, die Spinne zu verknüpfen, um weiter zur nächsten Seite zu gehen, aber es funktioniert nicht, also hatte ich gehofft, einige Hinweise darauf zu bekommen, was ich falsch mache.

class infoSpider(scrapy.Spider): 
name = 'info_spider' 
start_urls = ['https://www.youtube.com/results?search_query=cars'] 

def parse(self, response): 
    SET_SELECTOR = '.yt-lockup' 
    for content in response.css(SET_SELECTOR): 

     NAME_SELECTOR = '.yt-lockup-byline a ::text' 
     IMAGE_SELECTOR = 'img ::attr(src)' 
     yield { 
      'name': content.css(NAME_SELECTOR).extract_first(), 
      'image': content.css(IMAGE_SELECTOR).extract_first(), 
     } 

    NEXT_PAGE_SELECTOR = '.yt-uix-button-content a ::attr(href)' 
    next_page = response.css(NEXT_PAGE_SELECTOR).extract_first() 
    if next_page: 
     yield scrapy.Request(
      response.urljoin(next_page), 
      callback=self.parse 
     ) 

Update: Es gibt ein paar Ergebnisse zurück, geht aber nicht weiter auf die nächste Seite. Ich habe festgestellt, dass es einen zufälligen Schlüssel zu jedem nächsten Tasten gibt, muss einen Weg um das zu finden.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen (do downvote nicht bitte!)

Vielen Dank im Voraus.

+0

Warum fühlen sich die Leute immer gezwungen, einen Downvote zu machen? (Es ist eine gültige Frage) – EVX

Antwort

2

Sie werden einen Link Extractor verwenden wollen. Sie können den Regelsatz verwenden, um den Link für die nächste Seite anzugeben. Hier ist die offizielle Dokumentation https://doc.scrapy.org/en/latest/topics/link-extractors.html

class infoSpider(scrapy.Spider): 
name = 'info_spider' 
start_urls = ['https://www.youtube.com/results?search_query=cars'] 

rules = (
    Rule(LinkExtractor(allow=(), restrict_css=('.yt-uix-button-content a ::attr(href)')), callback="parse_page", follow=True), 
) 

def parse_page(self, response): 
    SET_SELECTOR = '.yt-lockup' 
    for content in response.css(SET_SELECTOR): 

     NAME_SELECTOR = '.yt-lockup-byline a ::text' 
     IMAGE_SELECTOR = 'img ::attr(src)' 
     yield { 
      'name': content.css(NAME_SELECTOR).extract_first(), 
      'image': content.css(IMAGE_SELECTOR).extract_first(), 
     } 
+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/15419626) – jlordo

+0

danke. Ich frage mich, –

+0

Kann die Regel nur Klasse oder kann es auch Informationen von anderen HTML-Typen anders als Klasse greifen? Wie ein Dateityp usw. – EVX

0

ändern

NEXT_PAGE_SELECTOR = '.yt-uix-button-content a ::attr(href)' 

zu

NEXT_PAGE_SELECTOR = '.yt-uix-button-content a::attr(href)' 

ODER ändern Sie Ihre letzten Zeilen Code

try: 
    next_page = response.css('.yt-uix-button-content a::attr(href)').extract()[0] 

    yield scrapy.Request(
     response.urljoin(next_page), 
     callback=self.parse 
    ) 
except IndexError: 
    pass 
+0

Sie können '.extract_first()' verwenden, um Fehler zu vermeiden. Wenn Sie '.extract_first ('')' verwenden, erhalten Sie eine einfache Domain-URL (dh http://example.com), die höchstwahrscheinlich durch den scrapy dupe-Filter gefiltert wird, so dass Sie nicht einmal Prüfungen durchführen müssen, wenn Sie gehen für volle faule Ansatz :) – Granitosaurus

+0

@Granitosaurus ich bin mit .extract_first() verstehe nicht ganz? – EVX

+0

Haben Sie meinen Code getestet? – Umair

0

I sug gest Sie verwenden REGELN

rules = (
     Rule(
       LinkExtractor(
          restrict_xpaths='//*[contains(@class, "yt-uix-button-content")]/a'), 
       callback='self.parse'), 

     ) 

andere suggeston, nicht überschreiben Parse Funktion.

+0

Entschuldigen Sie, dass dies das Problem nicht gelöst hat. – EVX

+0

Wie mein Update erwähnt, scheint es ein Problem mit der Klasse zu geben, die zurückgibt, was benötigt wird. – EVX

Verwandte Themen