2017-02-16 4 views
0

Im folgenden Code parst Funktion ausführt etwa 32-mal (foor Schleife 32 href Found) in der sameway jeder sublink sollte die Daten (32 einzelne URLs parse_next Funktion) .Aber gehen und kratzen parse_next Funktion nur einmal ausgeführt wird (einfache Fahrt)/nicht genannt (und Ausgabe cSV-Datei wird empty.can mir jemand helfen, wo ich Fehler gemacht habescraping: Abschaben zweite Ebene der URL

import scrapy 
import logging 

logger = logging.getLogger('mycustomlogger') 

from ScrapyTestProject.items import ScrapytestprojectItem 
class QuotesSpider(scrapy.Spider): 
    name = "nestedurl" 
    allowed_domains = ['www.grohe.in'] 
    start_urls = [ 
     'https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/', 
def parse(self, response): 
    logger.info("Parse function called on %s", response.url) 
    for divs in response.css('div.viewport div.workspace div.float-box'): 
     item = {'producturl': divs.css('a::attr(href)').extract_first(), 
       'imageurl': divs.css('a img::attr(src)').extract_first(), 
       'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
     next_page = response.urljoin(item['producturl']) 
     #logger.info("This is an information %s", next_page) 
     yield scrapy.Request(next_page, callback=self.parse_next, meta={'item': item}) 
     #yield item 

def parse_next(self, response): 
    item = response.meta['item'] 
    logger.info("Parse function called on2 %s", response.url) 
    item['headline'] = response.css('div#content a.headline::text').extract() 
    return item 
    #response.css('div#product-variants a::attr(href)').extract() 
+0

Überprüft Ihre for-Schleife und sollte ordnungsgemäß funktionieren. Daher sollte in Ihren Protokollen ein Fehler auftreten. Haben Sie versucht, die Spinne mit einem DEBUG-Protokolllevel auszuführen? Dies sollte Ihnen einen Hinweis geben, wo was schief geht. – Casper

Antwort

0

Ok so ein paar Dinge schief gehen.

  • Einrückungen
  • start_urls Liste ist nicht geschlossen mit [
  • allowed_domains nutzt die Domain-Endung .in, während Sie .com

Arbeits Code unten kratzen wollen:

import scrapy 
import logging 

class QuotesSpider(scrapy.Spider): 
    name = "nestedurl" 
    allowed_domains = ['www.grohe.com'] 
    start_urls = [ 
     'https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/' 
    ] 
    def parse(self, response): 
     # logger.info("Parse function called on %s", response.url) 
     for divs in response.css('div.viewport div.workspace div.float-box'): 
      item = {'producturl': divs.css('a::attr(href)').extract_first(), 
        'imageurl': divs.css('a img::attr(src)').extract_first(), 
        'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
      next_page = response.urljoin(item['producturl']) 
      #logger.info("This is an information %s", next_page) 
      yield scrapy.Request(next_page, callback=self.parse_next, meta={'item': item}) 
      #yield item 

    def parse_next(self, response): 
     item = response.meta['item'] 
     # logger.info("Parse function called on2 %s", response.url) 
     item['headline'] = response.css('div#content a.headline::text').extract() 
     return item 
     #response.css('div#product-variants a::attr(href)').extract() 

Hinweis: entfällt einige Protokollierungs-/Element-Pipelines, da diese auf meinem Computer nicht definiert sind.

+0

Thanks.if ich kommentiere ** allowed_domains ** es funktioniert. Ich habe eine riesige Liste von URLs. Jede URL-Seite enthält ihre eigene Art der HTML-Präsentation für den Browser. Wie kann ich ein normalisiertes Skript schreiben, um den HTML-Code dieser auflistenden Webseiten-URLs zu durchlaufen und die Daten ungeachtet des Formats zu verwerfen. – pradeep

Verwandte Themen