2012-12-28 9 views
9

Come si scorre tra siti con Scrapy? Mi piacerebbe estrarre il corpo di tutti i siti che corrispondono a http://www.saylor.org/site/syllabus.php?cid=NUMBER, dove NUMBER è da 1 a 400 o giù di lì.Iterazione tramite siti con Python Scrapy

ho scritto questo ragno:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from syllabi.items import SyllabiItem 

class SyllabiSpider(CrawlSpider): 

    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    start_urls = ['http://www.saylor.org/site/syllabus.php?cid='] 
    rules = [Rule(SgmlLinkExtractor(allow=['\d+']), 'parse_syllabi')] 

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

     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = x.select("/html/body/text()").extract() 
     return syllabi 

Ma non funziona. Capisco che stia cercando dei link in questo start_url, che non è proprio quello che voglio che faccia. Voglio scorrere i siti. Ha senso?

Grazie per l'aiuto.

+1

E 'possibile costruire l'elenco di URL desiderati in anticipo? ex. 'urls = [" example.com?cid={}".format(x) per x nell'intervallo (1, 401)] '? Disclaimer: non ho mai usato Scrapy. – Kevin

risposta

11

Prova questo:

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from syllabi.items import SyllabiItem 

class SyllabiSpider(BaseSpider): 
    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    max_cid = 400 

    def start_requests(self): 
     for i in range(self.max_cid): 
      yield Request('http://www.saylor.org/site/syllabus.php?cid=%d' % i, 
        callback=self.parse_syllabi) 

    def parse_syllabi(self, response): 
     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = response.body 

     return syllabi 
+0

Grazie. Ora come faccio a separare l'output in file per ogni sito web? Quando apro un file con un nome di variabile per scrivere in parse_syllabi, l'output per ogni sito va all'ultimo file e l'altro rimane vuoto. Non sai cosa sta succedendo dietro le quinte. –

+0

Quello che succede dietro le quinte è la magia chiamata [Twisted] (http://twistedmatrix.com/). Probabilmente sarebbe meglio per te accettare questa risposta, se fosse utile, e quindi aprire una nuova domanda. –

+0

E 'stato utile. Ho iniziato una nuova domanda: perché Scrapy passa da un loop all'altro? Grazie per l'aiuto. –

Problemi correlati