2010-02-28 6 views
11

Voglio costruire un web crawler basato su Scrapy per catturare immagini di notizie da diversi siti Web del portale di notizie. Voglio questo crawler di essere:Come costruire un web crawler basato su Scrapy per essere eseguito per sempre?

  1. correre per sempre

    significa che sarà periodica ri-visitare alcune pagine del portale per ottenere gli aggiornamenti.

  2. Priorità di pianificazione.

    Assegna priorità diverse a diversi tipi di URL.

  3. Discussione multi recuperare

Ho letto il documento Scrapy ma non ho trovato qualcosa legato a quello che ho elencato (forse io non sono abbastanza attento). C'è qualcuno qui che sa come farlo? o semplicemente dare qualche idea/esempio a riguardo. Grazie!

risposta

12

Scrapy è un framework per la spidering di siti Web, in quanto tale, è inteso a supportare i tuoi criteri ma non sta andando a ballare per te out of the box; probabilmente dovresti avere una certa familiarità con il modulo per alcune attività.

  1. L'esecuzione per sempre dipende dalla tua applicazione che chiama Scrapy. Dì allo the spiders dove andare e quando andare lì.
  2. Dare priorità è il lavoro di Scheduler middleware che dovresti creare e collegare a Scrapy. La documentazione su questo appare discutibile e non ho guardato il codice - in linea di principio la funzione è lì.
  3. Scrapy è intrinsecamente, fundamentally asynchronous che potrebbe essere quello che desideri: la richiesta B può essere soddisfatta mentre la richiesta A è ancora in sospeso. Il motore di connessione sottostante non ti impedisce di effettuare il multi-threading con bifase, ma Scrapy non fornisce servizi di threading.

Scrapy è una libreria, non un'applicazione. C'è una quantità non trascurabile di lavoro (codice) che un utente del modulo deve fare.

+0

Grazie! A mio parere, gli Spider sembrano funzionare per un lavoro "una tantum" (basta eseguire la scansione di tutti gli elementi specificati e uscire). Quindi intendi se voglio un crawler di lunga durata, dovrei scrivere io stesso l'applicazione e chiamare lo spider per fare il lavoro. Non è facile implementare la logica a lungo termine all'interno di Scrapy tramite middleware o qualcos'altro, giusto? – superb

+0

Probabilmente potresti implementare la logica del re-spider nel livello Spider Middleware, ma le primitive non sembrano adatte per questo e il mio istinto è che spingerai la logica del livello dell'applicazione nel livello di presentazione (se posso essere permesso di abusare della terminologia OSI). http://doc.scrapy.org/topics/spider-middleware.html – msw

+0

Il collegamento scheduler middleware, che ci avete fornito, non sta funzionando ora. –

0

Informazioni sul requisito di esecuzione per sempre, ecco alcuni dettagli.

È necessario catturare il segnale signals.spider_idle e nel metodo che è connesso al segnale, è necessario generare un'eccezione DontCloseSpider. Il segnale spider_idle viene inviato al motore di scrapy quando non vi sono richieste in sospeso e, per impostazione predefinita, lo spider verrà arrestato. Puoi intercettare questo processo.

vedi codici di colpo:

import scrapy 
from scrapy.exceptions import DontCloseSpider 
from scrapy.xlib.pydispatch import dispatcher 

class FooSpider(scrapy.Spider): 
    def __init__(self, *args, **kwargs): 
     super(FooSpider, self).__init__(*args, **kwargs) 
     dispatcher.connect(self.spider_idle, signals.spider_idle) 

    def spider_idle(self): 
     #you can revisit your portal urls in this method 
     raise DontCloseSpider 
Problemi correlati