2013-03-14 4 views
5

Vorrei analizzare i progetti di kickstarter.com usando scrapy, ma non riesco a capire come realizzare i progetti di ricerca spider che non esplicitamente specificano sotto start_urls. Ho trovato la prima parte del codice scrapy (posso estrarre le informazioni necessarie da un sito Web), non riesco a farlo per tutti i progetti sotto il dominio kickstarter.com/projects.Scrapy - analizza tutte le sotto-pagine di un determinato dominio

Da quello che ho letto, credo che l'analisi sia possibile (1) utilizzando i collegamenti nella pagina iniziale (kickstarter.com/projects), (2) utilizzando i collegamenti da una pagina di progetto per passare a un altro progetto, e (3) utilizzando una mappa del sito (che non credo abbia kickstarter.com) per individuare le pagine web da analizzare.

Ho passato ore a provare ciascuno di questi metodi ma non riesco a ottenere nulla.

Ho usato il codice tutorial scrapy e costruito su di esso.

Qui è la parte finora che funziona:

from scrapy import log 
from scrapy.contrib.spiders import CrawlSpider 
from scrapy.selector import HtmlXPathSelector 

from tutorial.items import kickstarteritem 

class kickstarter(CrawlSpider): 
    name = 'kickstarter' 
    allowed_domains = ['kickstarter.com']  
    start_urls = ["http://www.kickstarter.com/projects/brucegoldwell/dragon-keepers-book-iv-fantasy-mystery-magic"] 

    def parse(self, response): 
     x = HtmlXPathSelector(response) 

     item = kickstarteritem() 
     item['url'] = response.url 
     item['name'] = x.select("//div[@class='NS-project_-running_board']/h2[@id='title']/a/text()").extract() 
     item['launched'] = x.select("//li[@class='posted']/text()").extract() 
     item['ended'] = x.select("//li[@class='ends']/text()").extract() 
     item['backers'] = x.select("//span[@class='count']/data[@data-format='number']/@data-value").extract() 
     item['pledge'] = x.select("//div[@class='num']/@data-pledged").extract() 
     item['goal'] = x.select("//div[@class='num']/@data-goal").extract() 
     return item 

risposta

4

Dal momento che stai sottoclasse CrawlSpider, Non escludere parse. La logica di scansione dei collegamenti di CrawlSpider è contenuta in parse, che è veramente necessaria.

Per quanto riguarda la ricerca per indicizzazione, questo è l'attributo di classe rules. Non ho ancora testato, ma dovrebbe funzionare:

from scrapy.contrib.spiders import CrawlSpider 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.loader import XPathItemLoader 
from scrapy.selector import HtmlXPathSelector 

from tutorial.items import kickstarteritem 

class kickstarter(CrawlSpider): 
    name = 'kickstarter' 
    allowed_domains = ['kickstarter.com']  
    start_urls = ['http://www.kickstarter.com/discover/recently-launched'] 

    rules = (
     Rule(
      SgmlLinkExtractor(allow=r'\?page=\d+'), 
      follow=True 
     ), 
     Rule(
      SgmlLinkExtractor(allow=r'/projects/'), 
      callback='parse_item' 
     ) 
    ) 

    def parse_item(self, response): 
     xpath = HtmlXPathSelector(response) 
     loader = XPathItemLoader(item=kickstarteritem(), response=response) 

     loader.add_value('url', response.url) 
     loader.add_xpath('name', '//div[@class="NS-project_-running_board"]/h2[@id="title"]/a/text()') 
     loader.add_xpath('launched', '//li[@class="posted"]/text()') 
     loader.add_xpath('ended', '//li[@class="ends"]/text()') 
     loader.add_xpath('backers', '//span[@class="count"]/data[@data-format="number"]/@data-value') 
     loader.add_xpath('pledge', '//div[@class="num"]/@data-pledged') 
     loader.add_xpath('goal', '//div[@class="num"]/@data-goal') 

     yield loader.load_item() 

Il ragno striscia pagine dei progetti lanciati di recente.

Inoltre, utilizzare yield anziché return. È meglio mantenere l'output del tuo spider un generatore e ti consente di produrre più voci/richieste senza creare un elenco per conservarle.

+0

Ho eseguito il codice e funziona. Questo raschia tutti i progetti lanciati di recente. Se voglio raschiare tutti i progetti (non solo quelli lanciati di recente), devo solo modificare le regole e start_urls? Grazie mille. Questo è un grande aiuto. Non so cosa posso fare per ripagare te e la comunità. Trasmetterò l'atto di gentilezza. –

+0

@ user2167391: Nessun problema. Scrapy è davvero fantastico, ma è davvero difficile trovare esempi online. Per quanto riguarda Kickstarter, rendono difficile accedere a * all * dei loro progetti, quindi dovrai vedere dove si trovano tutti. – Blender