2017-11-06 16 views
0

Ich muss eine vordefinierte Liste der Kategorie URLs aufrufen. In jeder dieser Kategorien muss ich die Daten von der Seite extrahieren, gehe auch zum Link auf der nächsten Seite und extrahiere erneut.Scrap mehrere URLs und Seitenumbruch mit Scrapy

Ich habe diesen Beispielcode, aber etwas fehlt:

import scrapy 
import re 

class YellowBot(scrapy.Spider): 
    name = "yellow" 
    allowed_domains = ["www.yellowpages.com"] 
    start_urls = [ 
     'http://www.yellowpages.com/b/category1/', 
     'http://www.yellowpages.com/b/category2/', 
     'http://www.yellowpages.com/b/category3/', 
     'http://www.yellowpages.com/b/category4/' 
    ] 
    headers = { 
     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36' 
    } 



    def start_requests(self): 
     for url in self.start_urls: 
      yield scrapy.Request(
       url=url, 
       headers=self.headers 
      ) 

    def parse(self, response): 
     self.logger.info('- page %s', response.url) 
     ITEM_SELECTOR = 'ul.businesses li' 
     SOURCE_TYPE = 'pages' 
     for ficha in response.css(ITEM_SELECTOR): 
      ficha = { 
       'id' : ficha.xpath('normalize-space(.//@data-bid)').extract_first(), 
       'name' : ficha.css('.business-name ::text').extract_first(), 
       'description': ficha.xpath('.//div[@itemprop="description"]/text()').extract_first() 
      } 

      if ficha['id'] is not None: 
       yield ficha 

      next_page = response.css('.m-results-pagination li.last a::attr(href)').extract_first() 
      if next_page is not None: 
       yield scrapy.Request(
        response.urljoin(next_page), 
        headers=self.headers 
       ) 

Es extrahiert nur die erste Kategorie (auch die folgenden Seiten durch den Pager): http://www.yellowpages.com/b/category1/

Aber es nicht verarbeitet die nächste Kategorie Seite: http://www.yellowpages.com/b/category2/

Antwort

0

Versuchen Sie, die folgenden Änderungen: allowed_domains = ['yellowpages.com']

und yield scrapy.Request(url=url, callback=self.parse, headers=self.headers). Sie sollten auch eine callback=self.parse in Ihren ausstehenden Anforderungen für die nächsten Seiten angeben.

Auch nicht sicher über Ihre start_urls. Ich habe versucht, die Antwort unter Verwendung Ihrer Selektoren durch scrapy.shell zu überprüfen und response.css('ul.businesses li') gibt eine leere Liste zurück.

+0

war es, dass (Rückruf). Es war nur eine Beispiel-Domäne. Vielen Dank! – geoDesarrollos