2013-03-14 14 views
5

Kickstarter.com projelerini scrapy kullanarak ayrıştırmak istiyorum, ancak başlangıç_öğeleri altında açıkça belirtmediğim örümcek arama projelerini nasıl oluşturacağımı anlayamıyorum. Belirlenen scrapy kodunun ilk kısmına sahibim (gerekli bilgileri bir web sitesinden alabilirim), bunu kickstarter.com/projects alan adı altındaki tüm projeler için yapamıyorum.Scrapy - belirli bir alanın tüm alt sayfalarını ayrıştırma

Okuduklarımdan, ayrışmanın mümkün olduğunu düşünüyorum (1) başlangıç ​​sayfasındaki bağlantıları kullanarak (kickstarter.com/projects), (2) başka bir projeye atlamak için bir proje sayfasından bağlantılar kullanarak ve (3) ayrıştırmak için web sayfalarını bulmak için bir site haritası kullanıyorum (kickstarter.com'un sahip olduğunu sanmıyorum).

Bu yöntemlerin her birini denemek için saatler harcadım ama hiçbir yere gitmiyorum.

Scrapy öğretici kodunu kullandım ve üzerine kurdum. İşte

şimdiye kadar çalışır parçasıdır:

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 

cevap

4

Eğer CrawlSpider sınıflara yaptığınızdan, parse geçersiz kılmaz. CrawlSpider 's bağlantı tarama mantığı gerçekten ihtiyacınız olan parse içinde yer almaktadır.

Sürünmenin kendisi için ise, rules sınıf özniteliği bunun içindir. Bunu test etmedim ama çalışması gerekir:

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

örümcek geçenlerde başlatılan projelerin sayfaları tarar. Ayrıca, return yerine yield kullanın. Örümcekinizin çıktısını bir jeneratörde tutmak daha iyidir ve bunları tutmak için bir liste yapmadan birden çok öğe/istek üretmenizi sağlar.

+0

Kodu çalıştırdım ve işe yarıyor. Bu yeni başlatılan tüm projeleri sıyırdı. Tüm projeleri (sadece yeni başlatılanları değil) kazımak istiyorsam, sadece kuralları ve start_urls'ları değiştirebilir miyim? Çok teşekkür ederim. Bu çok büyük bir yardım. Seni ve toplumu ödemek için ne yapabilirim bilmiyorum. İyilik hareketini geçeceğim. –

+0

@ user2167391: Sorun değil. Scrapy gerçekten harika, ama çevrimiçi örnekleri bulmak gerçekten zor. Kickstarter'a gelince, projelerinin hepsine * ulaşmayı zorlaştırıyorlar, böylece hepsinin nerede bulunduğunu görmeniz gerekecek. – Blender

İlgili konular