2016-03-21 12 views
6

私はScrapyを使ってウェブサイトからpdfファイルを引き出すことになっています。私はPythonには新しくないが、Scrapyは非常に新しいものだ。私は、コンソールといくつかの初歩的なクモを試しています。私が発見し、このコードを変更した:Scrapyを使ってウェブサイトからpdfファイルを見つけてダウンロードする

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) 

私は

scrapy crawl mySpider 

と、コマンドラインでこのコードを実行すると、私は戻って何を取得します。私は、ファイルをダウンロードして、メタデータをダウンロードしないため、治療アイテムを作成しませんでした。私はこれについて何か助けていただければ幸いです。

+0

ログを共有することができますか? – eLRuLL

答えて

11

スパイダーロジックが正しくないようです。例えば、特定の記事のためのWebページ

  • 最初のページを

    1. http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html:私はあなたのウェブサイトを簡単に見ていた、とページのいくつかの種類があるようです

      ページ番号1からナビゲートできるhttp://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html

    2. 実際のPDFの位置。その後、#2ページを取得し、最初の#1のページを取得し、我々はそれらの#3ページをダウンロードできます。ページ#2

    からナビゲートすることができhttp://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc-precertification-period-extended-to-june-29.pdfは、このように正しいロジックは次のようになります。
    しかし、あなたのスパイダーは#1ページから#3ページへのリンクを直接抽出しようとします。

    編集:

    私はあなたのコードを更新しており、ここでは実際に動作する何か:

    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

    ありがとうございました。 – Murface

    +0

    ちょっとここで何が起こっているのか分かりますが、これはあなたのロジックに従っています。ここでは再帰はありません – Murface

    +0

    はい、「再帰」はありません(Scrapyはイベント駆動型フレームワークです。編集したコードではコールバックのみですが、元のコードではどちらも呼び出されません)。 :)あなたの問題を解決すると思われる場合は、この回答を受け入れてください。 – starrify

    関連する問題