2013-03-14 15 views
5

Chciałabym przeanalizować projekty kickstarter.com za pomocą scrapy, ale nie mogę wymyślić, jak zrobić projekty przeszukiwania pająków, których nie określam wprost pod hasłami start_urls. Mam pierwszą część kodu do scrapy (mogę wyodrębnić niezbędne informacje z jednej strony), po prostu nie mogę tego zrobić dla wszystkich projektów w domenie kickstarter.com/projects.Scrapy - parsowanie wszystkich podstron danej domeny

Z tego, co przeczytałem, uważam, że parsowanie jest możliwe (1) za pomocą linków na stronie początkowej (kickstarter.com/projects), (2) za pomocą linków z jednej strony projektu, aby przejść do innego projektu, oraz (3) za pomocą mapy witryny (której nie uważam za kickstarter.com), aby zlokalizować strony internetowe do analizy.

Spędziłem wiele godzin próbując każdej z tych metod, ale do tej pory nie dochodzę.

Użyłem kodu samouczka do scrapowania i zbudowałem na nim.

Oto część tak daleko, że działa:

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 

Odpowiedz

4

Skoro jesteś instacji CrawlSpider, nie zastępują parse. Logika indeksowania linków CrawlSpider jest zawarta w parse, której naprawdę potrzebujesz.

Jeśli chodzi o samo indeksowanie, właśnie do tego służy atrybut klasy rules. Nie testowałem tego, ale powinno działać:

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

Pająk przeszukuje strony ostatnio uruchomionych projektów. Można również użyć yield zamiast return. Lepiej jest zachować wyjście pająka jako generator, który pozwala ci uzyskać wiele przedmiotów/żądań bez tworzenia listy, która je zatrzyma.

+0

Uruchomiłem kod i działa. To scrapy wszystkich ostatnio uruchomionych projektów. Jeśli chcę zeskrobać wszystkie projekty (nie tylko te ostatnio uruchomione), czy po prostu zmienię reguły i parametry start_urls? Dziękuję bardzo. To jest ogromna pomoc. Nie wiem, co mogę zrobić, aby spłacić ciebie i społeczność. Przekażę akt dobroci. –

+0

@ user2167391: Nie ma problemu. Scrapy jest naprawdę świetna, ale naprawdę trudno jest znaleźć przykłady w Internecie. Jeśli chodzi o Kickstarter, utrudniają dostęp do * wszystkich * swoich projektów, więc będziesz musiał zobaczyć, gdzie się znajdują. – Blender