2017-09-02 2 views
0

Ich versuche, die Website eines prominenten britischen Einzelhändler zu kriechen und ein Attribut erhalte wie folgt:Scrapy SitemapSpider nicht funktioniert

nl_env/lib/python3.6/site-packages/scrapy/spiders/sitemap.py", line 52, in _parse_sitemap for r, c in self._cbs:

AttributeError: 'NlSMCrawlerSpider' object has no attribute '_cbs'

Es ist wahrscheinlich ich nicht ganz zu begreifen, wie ein SitemapSpider arbeitet - meinen Code unten:

class NlSMCrawlerSpider(SitemapSpider): 
name = 'nl_smcrawler' 
allowed_domains = ['newlook.com'] 
sitemap_urls = ['http://www.newlook.com/uk/sitemap/maps/sitemap_uk_product_en_1.xml'] 
sitemap_follow = ['/uk/womens/clothing/'] 

# sitemap_rules = [ 
#  ('/uk/womens/clothing/', 'parse_product'), 
# ] 


def __init__(self): 
    self.driver = webdriver.Safari() 
    self.driver.set_window_size(800,600) 
    time.sleep(2) 


def parse_product(self, response): 
    driver = self.driver 
    driver.get(response.url) 
    time.sleep(1) 

    # Collect products 
    itemDetails = driver.find_elements_by_class_name('product-details-page content') 


    # Pull features 
    desc = itemDetails[0].find_element_by_class_name('product-description__name').text 
    href = driver.current_url 

    # Generate a product identifier 
    identifier = href.split('/p/')[1].split('?comp')[0] 
    identifier = int(identifier) 

    # datetime 
    dt = date.today() 
    dt = dt.isoformat() 

    # Price Symbol removal and integer conversion 
    try: 
     priceString = itemDetails[0].find_element_by_class_name('price product-description__price').text 
    except: 
     priceString = itemDetails[0].find_element_by_class_name('price--previous-price product-description__price--previous-price ng-scope').text 
    priceInt = priceString.split('£')[1] 
    originalPrice = float(priceInt) 

    # discountedPrice Logic 
    try: 
     discountedPriceString = itemDetails[0].find_element_by_class_name('price price--marked-down product-description__price').text 
     discountedPriceInt = discountedPriceString.split('£')[1] 
     discountedPrice = float(discountedPriceInt) 
    except: 
     discountedPrice = 'N/A' 

    # NlScrapeItem 
    item = NlScrapeItem() 

    # Append product to NlScrapeItem 
    item['identifier'] = identifier 
    item['href'] = href 
    item['description'] = desc 
    item['originalPrice'] = originalPrice 
    item['discountedPrice'] = discountedPrice 
    item['firstSighted'] = dt 
    item['lastSighted'] = dt 

    yield item 

auch zögern Sie nicht, für weitere Details zu bitten, den Link zum sitemap und einen Link zu der eigentlichen Datei innerhalb des Scrapy Paket sehen den Fehler (link - github) abzuwerfen. Ihre Hilfe wäre herzlich willkommen.

Edit: Ein Gedanke am 2nd link sucht (aus dem Scrapy Paket), kann ich sehen, _cbs in der def __init__(self, *a, **kw): Funktion initialisiert wird - ist die Tatsache, dass ich meine eigene init Logik habe es weg zu werfen?

Antwort

1

Zwei Probleme gibt es in Ihrem Schaber. Eine davon ist die __init__ Methode

def __init__(self): 
    self.driver = webdriver.Safari() 
    self.driver.set_window_size(800, 600) 
    time.sleep(2) 

Jetzt haben Sie eine neue __init__ definiert und die Basisklasse __init__ außer Kraft gesetzt. Das wird nicht von Ihrem Init aufgerufen und daher wird _cbs nicht initialisiert. Sie können dies leicht beheben, indem Sie init-Methode wie unten

def __init__(self, *a, **kw): 
    super(NlSMCrawlerSpider, self).__init__(*a, **kw) 

    self.driver = webdriver.Safari() 
    self.driver.set_window_size(800, 600) 
    time.sleep(2) 

Als nächstes wird der SitemapScraper Wechsel wird immer Antwort auf die Parse-Methode senden. Und Sie haben die Parse-Methode überhaupt nicht definiert. So fügte ich ein einfaches hinzu, um nur die URLs zu drucken

def parse(self, response): 
    print(response.url) 
+0

danke - das hat funktioniert! Fantastisch! – Philipp

Verwandte Themen