2012-01-10 26 views
12

Sto usando scrapy per eseguire la scansione di più pagine su un sito. La variabile start_urls viene utilizzata per definire le pagine da sottoporre a ricerca per indicizzazione. avrei inizialmente iniziare con prima pagina, definendo così start_urls = [1st page] nel file example_spider.pystart_urls dinamico in scrapy

Su ottenere maggiori informazioni dal 1 ° pagina, avrei determinare quali sono i prossimi pagine venga eseguita la scansione, poi sarebbe assegnare start_urls conseguenza. Quindi, devo sovrascrivere sopra example_spider.py con le modifiche a start_urls = [1st page, 2nd page, ..., Kth page], quindi eseguire di nuovo la scansione scrapy.

È l'approccio migliore o esiste un modo migliore per assegnare dinamicamente l'API start_urls utilizzando la API scrapy senza dover sovrascrivere example_splider.py? Grazie.

risposta

21

start_urls l'attributo della classe contiene gli URL iniziali - niente di più. Se avete estratto URL delle altre pagine che si desidera raschiare - resa da parse callback corrispondenti richieste con [un altro] callback:

class Spider(BaseSpider): 

    name = 'my_spider' 
    start_urls = [ 
       'http://www.domain.com/' 
    ] 
    allowed_domains = ['domain.com'] 

    def parse(self, response): 
     '''Parse main page and extract categories links.''' 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//*[@id='tSubmenuContent']/a[position()>1]/@href").extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found category url: %s' % url) 
      yield Request(url, callback = self.parseCategory) 

    def parseCategory(self, response): 
     '''Parse category page and extract links of the items.''' 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select("//*[@id='_list']//td[@class='tListDesc']/a/@href").extract() 
     for link in links: 
      itemLink = urlparse.urljoin(response.url, link) 
      self.log('Found item link: %s' % itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

    def parseItem(self, response): 
     ... 

Se avete ancora voglia di personalizzare inizio richiede la creazione, metodo di sostituzione BaseSpider.start_requests()

+0

è la parseItem (self, response) restituisce l'oggetto? – friddle

+0

'parseItem' come qualsiasi altra richiamata può restituire un' item' o un'altra 'richiesta' con un'altra callback – warvariuc

+0

grazie per la risposta – friddle