2016-11-17 5 views
1

Ich versuche, einige ausgewählte Domänen zu crawlen und nur die wesentlichen Seiten von diesen Websites zu nehmen. Mein Ansatz besteht darin, eine Webseite der Domain zu crawlen und eine begrenzte Anzahl von URLs zu verwenden. Diese URLs werden nach wiederkehrenden URLs gecrawlt, die ich auf der ersten Webseite gefunden habe. Auf diese Weise versuche ich alle URLs zu eliminieren, die nicht mehr vorkommen (Content-URLs wie Produkte usw.). Der Grund, warum ich um Hilfe frage, ist, weil scrapy.Request nicht mehr als einmal ausgeführt wird. Dies ist, was ich bisher:Scrap Crawl mehrere Domänen mit wiederkehrenden URLs pro Domain

class Finder(scrapy.Spider): 
name = "finder" 
start_urls = ['http://www.nu.nl/'] 
uniqueDomainUrl = dict() 
maximumReoccurringPages = 5 

rules = (
    Rule(
     LinkExtractor(
      allow=('.nl', '.nu', '.info', '.net', '.com', '.org', '.info'), 
      deny=('facebook','amazon', 'wordpress', 'blogspot', 'free', 'reddit', 
        'videos', 'youtube', 'google', 'doubleclick', 'microsoft', 'yahoo', 
        'bing', 'znet', 'stackexchang', 'twitter', 'wikipedia', 'creativecommons', 
        'mediawiki', 'wikidata'), 
     ), 
     process_request='parse', 
     follow=True 
    ), 
) 

def parse(self, response): 
    self.logger.info('Entering URL: %s', response.url) 
    currentUrlParse = urlparse.urlparse(response.url) 
    currentDomain = currentUrlParse.hostname 
    if currentDomain in self.uniqueDomainUrl: 
     yield 

    self.uniqueDomainUrl[currentDomain] = currentDomain 

    item = ImportUrlList() 
    response.meta['item'] = item 

    # Reoccurring URLs 
    item = self.findReoccurringUrls(response) 
    list = item['list'] 

    self.logger.info('Output: %s', list) 

    # Crawl reoccurring urls 
    #for href in list: 
    # yield scrapy.Request(response.urljoin(href), callback=self.parse) 

def findReoccurringUrls(self, response): 
    self.logger.info('Finding reoccurring URLs in: %s', response.url) 

    item = response.meta['item'] 
    urls = self.findUrlsOnCurrentPage(response) 
    item['list'] = urls 
    response.meta['item'] = item 

    # Get all URLs on each web page (limit 5 pages) 
    i = 0 
    for value in urls: 
     i += 1 
     if i > self.maximumReoccurringPages: 
      break 

     self.logger.info('Parse: %s', value) 
     request = Request(value, callback=self.test, meta={'item':item}) 
     item = request.meta['item'] 

    return item 

def test(self, response): 
    self.logger.info('Page title: %s', response.css('title').extract()) 
    item = response.meta['item'] 
    urls = self.findUrlsOnCurrentPage(response) 
    item['list'] = set(item['list']) & set(urls) 
    return item 

def findUrlsOnCurrentPage(self, response): 
    newUrls = [] 
    currentUrlParse = urlparse.urlparse(response.url) 
    currentDomain = currentUrlParse.hostname 
    currentUrl = currentUrlParse.scheme +'://'+ currentUrlParse.hostname 

    for href in response.css('a::attr(href)').extract(): 
     newUrl = urlparse.urljoin(currentUrl, href) 

     urlParse = urlparse.urlparse(newUrl) 
     domain = urlParse.hostname 

     if href.startswith('#'): 
      continue 

     if domain != currentDomain: 
      continue 

     if newUrl not in newUrls: 
      newUrls.append(newUrl) 

    return newUrls 

Es scheint nur zu sein, um die erste Seite ausgeführt wird, die andere Request() wird nicht genannt, wie ich auf dem Rückruf sehen.

Antwort

0

Was ImportUrlList() tut? Du hast es implementiert?

Sie haben vergessen, auch scrapy.Request auf findReoccuringUrls

request = scrapy.Request(value, callback=self.test, meta={'item':item}) 

def findReoccurringUrls(self, response): 
    self.logger.info('Finding reoccurring URLs in: %s', response.url) 

    item = response.meta['item'] 
    urls = self.findUrlsOnCurrentPage(response) 
    item['list'] = urls 
    response.meta['item'] = item 

    # Get all URLs on each web page (limit 5 pages) 
    i = 0 
    for value in urls: 
     i += 1 
     if i > self.maximumReoccurringPages: 
      break 

     self.logger.info('Parse: %s', value) 
     request = scrapy.Request(value, callback=self.test, meta={'item':item}) 
     item = request.meta['item'] 
+0

ImportUrlList enthält nur ein Feld mit einer Liste = dict() zu nennen; Ich möchte findUrlsOnCurrentPage wiederverwenden, also habe ich eine neue Funktion für den Rückruf gemacht, weil ich mit dieser Funktion experimentiert habe, nannte ich es Test. Beim ersten Aufruf hat die Funktion bereits eine Seite geholt, daher muss ich die Anfrage nicht wiederholen. –