2016-03-21 15 views
6

Sono stato incaricato di estrarre file PDF da siti Web che utilizzano Scrapy. Non sono nuovo a Python, ma Scrapy è una novità per me. Ho fatto esperimenti con la console e alcuni ragni rudimentali. Ho trovato e modificato questo codice:Utilizzo di Scrapy per trovare e scaricare file PDF da un sito Web

import urlparse 
import scrapy 

from scrapy.http import Request 

class pwc_tax(scrapy.Spider): 
    name = "pwc_tax" 

    allowed_domains = ["www.pwc.com"] 
    start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"] 

    def parse(self, response): 
     base_url = "http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html" 
     for a in response.xpath('//a[@href]/@href'): 
      link = a.extract() 
      if link.endswith('.pdf'): 
       link = urlparse.urljoin(base_url, link) 
       yield Request(link, callback=self.save_pdf) 

    def save_pdf(self, response): 
     path = response.url.split('/')[-1] 
     with open(path, 'wb') as f: 
      f.write(response.body) 

ho eseguito questo codice alla riga di comando con

scrapy crawl mySpider 

e non ottengo niente di nuovo. Non ho creato un elemento rottame perché voglio eseguire la scansione e il download del file, senza metadati. Apprezzerei qualsiasi aiuto su questo.

+0

è possibile condividere i registri? – eLRuLL

risposta

11

La logica del ragno sembra errata.

ho avuto una rapida occhiata al tuo sito web, e sembra che ci siano diversi tipi di pagine:

  1. http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html pagina iniziale
  2. pagine web per gli articoli specifici, per esempio http://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html che potrebbe essere navigato dalla pagina n. 1
  3. Posizioni PDF effettive, ad es. http://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc-precertification-period-extended-to-june-29.pdf che potrebbe essere navigato da pagina # 2

Così la logica corretta assomiglia: ottenere la pagina # 1 primo, ottenere # 2 pagine, allora, e abbiamo potuto scaricare questi 3 pagine #.
Tuttavia, il tuo ragno cerca di estrarre i link alle pagine 3 direttamente dalla pagina 1.

Modificato:

Ho aggiornato il codice, e qui c'è qualcosa che funziona davvero:

import urlparse 
import scrapy 

from scrapy.http import Request 

class pwc_tax(scrapy.Spider): 
    name = "pwc_tax" 

    allowed_domains = ["www.pwc.com"] 
    start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"] 

    def parse(self, response): 
     for href in response.css('div#all_results h3 a::attr(href)').extract(): 
      yield Request(
       url=response.urljoin(href), 
       callback=self.parse_article 
      ) 

    def parse_article(self, response): 
     for href in response.css('div.download_wrapper a[href$=".pdf"]::attr(href)').extract(): 
      yield Request(
       url=response.urljoin(href), 
       callback=self.save_pdf 
      ) 

    def save_pdf(self, response): 
     path = response.url.split('/')[-1] 
     self.logger.info('Saving PDF %s', path) 
     with open(path, 'wb') as f: 
      f.write(response.body) 
+0

Grazie Starrify. – Murface

+0

Solo per capire cosa sta succedendo qui un po 'meglio, questo segue la tua logica dall'alto, non c'è ricorsione qui – Murface

+0

Sì non c'è "ricorsione" (potrebbe non essere la parola esatta qui come Scrapy è un framework basato su eventi: lì è solo callback) nel codice modificato, ma nemmeno nel codice originale. :) Inoltre, ti preghiamo di accettare questa risposta se pensi che risolva il tuo problema. – starrify

Problemi correlati