2013-06-10 10 views
5

Sto usando Python e Scrapy per questa domanda.Come si usa Scrapy per eseguire la scansione all'interno delle pagine?

Sto tentando di strisciare pagina web A, che contiene un elenco di link a pagine web B1, B2, B3, ... Ogni B pagina contiene un link a un'altra pagina, C1, C2, C3, ..., che contiene un'immagine.

Quindi, utilizzando Scrapy, l'idea in pseudo-codice è:

links = getlinks(A) 
for link in links: 
    B = getpage(link) 
    C = getpage(B) 
    image = getimage(C) 

Tuttavia, io sono in esecuzione in un problema quando si cerca di analizzare più di una pagina in Scrapy. Ecco il mio codice:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('...') 

    items = [] 
    for link in links: 
     item = CustomItem() 
     item['name'] = link.select('...') 
     # TODO: Somehow I need to go two pages deep and extract an image. 
     item['image'] = .... 

Come potrei fare?

(Nota: La mia domanda è simile a Using multiple spiders at in the project in Scrapy ma sono sicuri di come valori "di ritorno" dagli oggetti richiesta Scrapy.)

risposta

6

Nel Scrapy il metodo parse deve restituire una nuova richiesta se è necessario emettere più richieste (usare yield come scrapy funziona bene con i generatori). All'interno di questa richiesta è possibile impostare una richiamata alla funzione desiderata (per essere ricorsivi basta passare nuovamente parse). Questo è il modo per eseguire la scansione in pagine.

È possibile controllare this recursive crawler come esempio

Seguendo il tuo esempio, il cambiamento sarebbe qualcosa di simile:

def parse(self, response): 
    b_pages_links = getlinks(A) 
    for link in b_pages_links: 
     yield Request(link, callback = self.visit_b_page) 

def visit_b_page(self, response): 
    url_of_c_page = ... 
    yield Request(url_of_c_page, callback = self.visit_c_page) 

def visit_c_page(self, response): 
    url_of_image = ... 
    yield Request(url_of_image, callback = self.get_image) 

def get_image(self, response): 
    item = CustomItem() 
    item['name'] = ... # get image name 
    item['image'] = ... # get image data 
    yield item 

di controllare anche la scrapy documentation e these random code snippets. Possono aiutare molto :)

+0

Grazie, questo è fantastico. Se volessi creare il 'CustomItem' nel metodo' parse', lo passerei usando la meta proprietà? – sdasdadas

+0

Inoltre, voglio restituire una lista di elementi ('items = []'). Come dovrei usare quanto sopra e poi, al suo completamento, aggiungere l'articolo alla lista? – sdasdadas

+0

La funzione solo spider è di visitare una pagina, estrarre e restituire i dati (il 'item yield 'finale). Per aggregare i dati, come mettere tutti gli elementi in una lista, è necessario creare una funzione nel modulo 'pipelines' (questa è solo una convenzione). [Questo esempio di pipeline] (https://github.com/bcap/wikipedia-music/blob/master/crawler/crawler/pipelines.py) crea un file di punti basato su tutti i generi musicali che sono stati scansionati –

Problemi correlati