2016-03-21 15 views
6

Scrapy'yi kullanan web sitelerinden pdf dosyalarını çekmekle görevlendirildim. Python için yeni değilim, ama Scrapy benim için çok yeni. Konsol ve birkaç ilkel örümcek deniyorum. Ben buldum ve bu kodu değiştirdik:Bir web sitesinden pdf dosyalarını bulmak ve indirmek için Scrapy'yi kullanma

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) 

Ben

scrapy crawl mySpider 

ile komut satırına bu kodu çalıştırmak ve geri hiçbir şey olsun. Bir terapi öğesi oluşturmadım çünkü dosyayı taramak ve indirmek istiyorum, meta veri yok. Bunun için herhangi bir yardım isterim.

+0

günlükleri paylaşabilirim? – eLRuLL

cevap

11

Örümcek mantığı yanlış görünüyor.

Web siteniz hızlıca bir göz vardı ve sayfaların çeşitli türleri vardır görünüyor: özgü ürünlerin örneğin için

  1. http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html ilk sayfa
  2. Web sayfaları Sayfadan erişilebilen http://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html sayfadan erişilebilen sayfalar. Daha sonra 2. sayfaları olsun, ilk 1. sayfa olsun ve biz bu 3. sayfalarını indirmek olabilir: Sayfa # 2

ayrılana olabilir http://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc-precertification-period-extended-to-june-29.pdf Böylece doğru mantık gibi görünüyor.
Ancak, örümcekiniz # 1 sayfadan # 3 sayfaya doğrudan bağlantılar oluşturmaya çalışır.

EDITED:

Ben kodunuzu güncelledik ve burada gerçekten çalışıyor şey:

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

Teşekkürler Starrify. – Murface

+0

Sadece burada neler olup bittiğini anlamak için, yukarıdaki mantığınızı yukarıdan izliyoruz, burada bir özyineleme yok – Murface

+0

Evet, "özyineleme" diye bir şey yok (burada Scrapy olay odaklı bir çerçeve olduğundan tam olarak bu kelime olmayabilir): düzenlenmiş kodda, ancak orijinal kodunuzda değil. :) Ayrıca, sorununuzu çözdüğünü düşünüyorsanız lütfen bu cevabı kabul edin. – starrify

İlgili konular