2017-09-02 11 views
0

機能していません。Scrapy SitemapSpider私は著名な英国の小売店のウェブサイトをクロールし、次のようにはAttributeErrorを取得しようとしている

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 

また、エラー(link - githubを)投げScrapyパッケージ内sitemapへのリンクと実際のファイルへのリンクを参照して、任意の更なる詳細についてはお気軽にお問い合わせください。あなたの助けに感謝します。

編集:一つの思想 (Scrapyパッケージから)2nd linkを見て、私は_cbsがdef __init__(self, *a, **kw):機能に初期化されて見ることができますが - 私は私自身ののinitロジックそれをオフに投げを持っているという事実ですか?

答えて

1

あなたのスクレーパーに2つの問題があります。一つは、今、あなたは新しい__init__を定義し、基本クラス__init__をオーバーライドしている__init__方法

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

です。これはあなたのinitによって呼び出されないため、_cbsは初期化されません。あなたは簡単に常に解析メソッドへの応答を送信します

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) 

次SitemapScraper以下のようにあなたのinitメソッドを変更することでこの問題を解決することができます。そして、あなたはパースメソッドを全く定義していません。だから私は単純なURLを印刷するだけで追加しました

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

ありがとうございました!素晴らしい! – Philipp

関連する問題