2017-08-05 9 views
0

私は治療にいくつか問題があります。私がコマンドscrapy crawl album -o test.xmlを実行すると、スパイダーはうまく動作します。スクリプトからクロールすると、私はと違うstart_urlsをスパイダーに与えますが、と同じのコマンドと同じになります。両方のURLが利用可能です。ここに私が書いたコードがあります。私が間違っていることを指摘してください、ありがとう。scrapyのクロールはコマンドではうまくいきますが、スクリプトから実行すると何か心配があります

スパイダーファイルxiami_scrapy.py

import scrapy 
empty_referer = { 
    'Referer': '' 
} 

class AlbumSpider(scrapy.Spider): 
    name = 'album' 
    start_urls = [ 
     'http://www.xiami.com/artist/album-eJlX61793', 
    ] 
    artist = 'giga' 

    def __init__(self, url=None, artist=None, *args, **kwargs): 
     super(AlbumSpider, self).__init__(*args, **kwargs) 
     if artist is not None: 
      self.artist = artist 
     if url is not None: 
      self.start_urls = [url] 

    def parse(self, response): 
     for album in response.css('.album_item100_thread'): 
      yield { 
       'artist': self.artist, 
       'title': album.css('.name>a>strong::text').extract_first(), 
       'fav_count': album.css('.fav_c_ico::text').extract_first(), 
       'star_rating': album.css('.album_rank>em::text').extract_first(), 
       'release_date': response.css('.company>a::text')[1].extract().strip(), 
       'company': album.css('.company>a::text')[0].extract(), 
       'url': album.css('.name>a::attr(href)').extract_first(), 
      } 

     next_page = response.css('.p_redirect_l::attr(href)').extract_first() 
     if next_page is not None: 
      next_page = response.urljoin(next_page) 
      yield scrapy.Request(next_page, headers=empty_referer, callback=self.parse) 

スクリプトあなたはクモのコンストラクタでstart_urlsの値を設定している場合、あなたはself.start_urlsとしてそれを参照してくださいtest.py

from twisted.internet import reactor, defer 
from scrapy.crawler import CrawlerRunner 
from xiamiscrapy.spiders.xiami_scrapy import AlbumSpider 
from scrapy.utils.log import configure_logging 

configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'}) 
runner = CrawlerRunner() 

@defer.inlineCallbacks 
def crawl(): 
    spider = AlbumSpider(url='http://www.xiami.com/artist/album-bzMAng64c0a',artist='reol') 
    yield runner.crawl(spider) 
    reactor.stop() 

crawl() 
reactor.run() 

答えて

0

を提出。しかし、この方法では、あなたのスパイダークラスのインスタンス属性を設定しますが、start_urlsはクラス属性です。それがうまくいかない理由です。

これを正しく実行する方法についてはSO questionをご覧ください。

関連する問題