2015-03-02 16 views
5

Sto provando a eliminare un sito Web di e-commerce e lo sto facendo in 2 passaggi.Scrapy: Ottimizzazione Spider

Questo sito ha una struttura come questa:

  • La homepage presenta i link alle-oggetti di famiglia e sottofamiglia-articoli pagine
  • Ogni famiglia & pagina sottofamiglia ha una lista di prodotti impaginato

In questo momento ho 2 ragni:

  • GeneralSpider per ottenere i link homepage e memorizzarli
  • ItemSpider per ottenere gli elementi da ogni pagina

Sono completamente nuovo per Scrapy, sto seguendo alcuni tutorial per raggiungere questo obiettivo. Mi chiedo quanto possano essere complesse le funzioni di analisi e come funzionano le regole. I miei ragni in questo momento appare come:

GeneralSpider:

class GeneralSpider(CrawlSpider): 

    name = 'domain' 
    allowed_domains = ['domain.org'] 
    start_urls = ['http://www.domain.org/home'] 

    def parse(self, response): 
     links = LinksItem() 
     links['content'] = response.xpath("//div[@id='h45F23']").extract() 
     return links 

ItemSpider:

class GeneralSpider(CrawlSpider): 

    name = 'domain' 
    allowed_domains = ['domain.org'] 
    f = open("urls.txt") 
    start_urls = [url.strip() for url in f.readlines()] 
    # Each URL in the file has pagination if it has more than 30 elements 
    # I don't know how to paginate over each URL 
    f.close() 

    def parse(self, response): 
     item = ShopItem() 
     item['name'] = response.xpath("//h1[@id='u_name']").extract() 
     item['description'] = response.xpath("//h3[@id='desc_item']").extract() 
     item['prize'] = response.xpath("//div[@id='price_eur']").extract() 
     return item 
  • Quale è il modo migliore per rendere il ragno seguire l'impaginazione di un URL?
  • Se l'impaginazione è JQuery, significa che non c'è GET variabile nell'URL, sarebbe possibile seguire l'impaginazione?

  • Posso avere diverse "regole" nello stesso ragno per abolire diverse parti della pagina? o è meglio avere lo spider specializzato, ogni spider focalizzato su una cosa?

Ho anche su Google alla ricerca di qualsiasi libro in relazione con Scrapy, ma sembra non c'è alcun libro finito ancora, o almeno io non potrebbe trovare uno.

  • Qualcuno sa se qualche Scrapy libro che uscirà a breve?

Edit:

si inserisce questo 2 di URL per questo esempio. Nella pagina Eroski Home è possibile ottenere l'URL alla pagina dei prodotti.

Nella pagina dei prodotti si dispone di un elenco di elementi impaginato (Eroski Articoli):

In la pagina Eroski Fruits, l'impaginazione degli articoli sembra essere JQuery/AJAX, perché più elementi vengono mostrati quando si scorre verso il basso, c'è un modo per ottenere tutti questi elementi con Scrapy?

+0

Condividere il collegamento a un sito Web effettivo renderebbe più semplice la risposta. Grazie. – alecxe

+0

@alecxe Ho aggiunto una modifica, controllo entrambi gli url –

+0

Non ho mai usato scrapy, quindi non posso rispondere in modo specifico. Potresti trovare altri esempi di scraping che utilizzano librerie standard come 'httplib',' urllib', 'urllib2' per inviare query e' BeautifulSoup' per analizzare il contenuto delle pagine web ottenute. Guardando velocemente la tua pagina Fruit, vedo che sono in grado di ottenere ulteriori articoli aggiungendo 'page = 2' nell'url, ad es. 'http: //www.compraonline.grupoeroski.com/supermercado/ajax/listProducts.jsp? page = 2 & categoria = 2059698 & grupo = 2059699 & familia = 2059701' in modo da poter eseguire il loop fino a ottenere una pagina vuota (è il caso di 3 qui) – etna

risposta

3

Qual è il modo migliore per far sì che il ragno segua l'impaginazione di un url?

Questo è molto specifico del sito e dipende da come viene implementata l'impaginazione.

Se l'impaginazione è JQuery, ovvero non c'è alcuna variabile GET nell'URL, sarebbe possibile seguire l'impaginazione?

Questo è esattamente il tuo caso d'uso: l'impaginazione viene effettuata tramite chiamate AJAX aggiuntive che puoi simulare all'interno del tuo ragno Scrapy.

Posso avere "regole" diverse nello stesso spider per racimolare parti diverse della pagina? o è meglio avere gli spider specializzati, ogni ragno focalizzato su una cosa?

Sì, il meccanismo di "regole" che un CrawlSpider fornisce è un potente pezzo di tecnologia - è altamente configurabile - è possibile avere più regole, alcuni di loro avrebbero seguire i link specifici che corrispondono a criteri specifici, o situati in una sezione specifica di una pagina. Avere un singolo spider con più regole dovrebbe essere preferito rispetto al fatto di avere più spider.

Parlando vostro uso specifico caso, qui è l'idea:

  • fare una rule da seguire categorie e sottocategorie nel menu di navigazione della home page - questo è lì restrict_xpaths aiuterebbe
  • in la richiamata, per ogni categoria o sottocategoria yield un Request che imitare la richiesta AJAX inviata dal browser quando si apre una pagina di categoria
  • nel gestore risposta AJAX (callback) analizzare gli elementi disponibili e yield un un altro Request per la stessa categoria/sottocategoria ma aumentando il parametro page GET (ottenendo pagina seguente)

esempio di implementazione di lavoro:

import re 
import urllib 

import scrapy 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 


class ProductItem(scrapy.Item): 
    description = scrapy.Field() 
    price = scrapy.Field() 


class GrupoeroskiSpider(CrawlSpider): 
    name = 'grupoeroski' 
    allowed_domains = ['compraonline.grupoeroski.com'] 
    start_urls = ['http://www.compraonline.grupoeroski.com/supermercado/home.jsp'] 

    rules = [ 
     Rule(LinkExtractor(restrict_xpaths='//div[@class="navmenu"]'), callback='parse_categories') 
    ] 

    def parse_categories(self, response): 
     pattern = re.compile(r'/(\d+)\-\w+') 
     groups = pattern.findall(response.url) 
     params = {'page': 1, 'categoria': groups.pop(0)} 

     if groups: 
      params['grupo'] = groups.pop(0) 
     if groups: 
      params['familia'] = groups.pop(0) 

     url = 'http://www.compraonline.grupoeroski.com/supermercado/ajax/listProducts.jsp?' + urllib.urlencode(params) 
     yield scrapy.Request(url, 
          meta={'params': params}, 
          callback=self.parse_products, 
          headers={'X-Requested-With': 'XMLHttpRequest'}) 

    def parse_products(self, response): 
     for product in response.xpath('//div[@class="product_element"]'): 
      item = ProductItem() 
      item['description'] = product.xpath('.//span[@class="description_1"]/text()').extract()[0] 
      item['price'] = product.xpath('.//div[@class="precio_line"]/p/text()').extract()[0] 
      yield item 

     params = response.meta['params'] 
     params['page'] += 1 

     url = 'http://www.compraonline.grupoeroski.com/supermercado/ajax/listProducts.jsp?' + urllib.urlencode(params) 
     yield scrapy.Request(url, 
          meta={'params': params}, 
          callback=self.parse_products, 
          headers={'X-Requested-With': 'XMLHttpRequest'}) 

Spero che questo è un buon punto di partenza per voi.


Qualcuno sa se qualche libro Scrapy che verrà rilasciato presto?

Nulla di specifico che possa ricordare.

Anche se ho sentito che alcuni editori hanno in programma di pubblicare un libro sul web-scraping, ma non dovrei dirlo.

+0

Grazie! Questa è una risposta molto utile –

+0

Dopo aver letto tutto in dettaglio, sono molto grato, mi hai risparmiato un sacco di ore a scavare informazioni. La tua spiegazione è fantastica! Ti devo un grande! –

Problemi correlati