2017-08-05 3 views
0

Ich habe ein paar Probleme mit scrapy. Wenn ich den Befehl scrapy crawl album -o test.xml ausführen, funktioniert die Spinne gut. aber wenn ich aus einem Skript kriechen, ich gebe einen verschiedenenstart_urls zur Spinne, aber bekommen die gleiche reusult mit Befehl. Beide URLs sind verfügbar. Hier ist der Code, den ich geschrieben habe. Bitte zeig was ich falsch mache, danke.scrapy Crawl funktioniert gut in Befehl, aber haben Sie etwas Sorgen, wenn Sie von einem Skript

Spinne Dateixiami_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) 

Scripttest.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() 

Antwort

0

Datei Wenn Sie den Wert von start_urls in spider Konstruktor setzen finden Sie es als self.start_urls. Auf diese Weise setzen Sie jedoch das Instanzattribut Ihrer Spider-Klasse, während start_urls ein Klassenattribut ist. Deshalb funktioniert es nicht.

Werfen Sie einen Blick auf diese SO question für Möglichkeiten, wie es richtig geht.

Verwandte Themen