2016-03-21 4 views
6

मुझे स्केपर का उपयोग कर वेबसाइटों से पीडीएफ फ़ाइलों को खींचने के लिए काम सौंपा गया है। मैं पाइथन के लिए नया नहीं हूं, लेकिन स्केपर मेरे लिए बहुत नया है। मैं कंसोल और कुछ प्राथमिक मकड़ियों के साथ प्रयोग कर रहा हूं। मैंने पाया है और इस कोड को संशोधित किया गया है:किसी वेबसाइट से पीडीएफ फ़ाइलों को खोजने और डाउनलोड करने के लिए स्केपर का उपयोग

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

स्पाइडर तर्क गलत लगता है।

मैं अपनी वेबसाइट पर एक नज़र था, और लगता है कि पृष्ठों के कई प्रकार हैं: विशेष लेख, उदा

  1. http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html प्रारंभिक पृष्ठ
  2. गए वेबपृष्ठ http://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html जिसे पृष्ठ # 1
  3. वास्तविक पीडीएफ स्थानों, आदि से नेविगेट किया जा सकता है। http://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc-precertification-period-extended-to-june-29.pdf जो पेज # 2

से नेविगेट किया जा सकता है इस प्रकार सही तर्क की तरह दिखता है: पहला # 1 पृष्ठ मिलता है, तो # 2 पृष्ठ मिलता है, और हम उन # 3 पृष्ठों डाउनलोड कर सकते हैं।
हालांकि आपका मकड़ी सीधे # 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

धन्यवाद Starrify। – Murface

+0

बस यह समझने के लिए कि यहां क्या हो रहा है, यह थोड़ा बेहतर है, यह ऊपर से आपके तर्क का पालन करता है, – Murface

+0

पर कोई रिकर्सन नहीं है हां, कोई "रिकर्सन" नहीं है (यह शायद सटीक शब्द नहीं हो सकता है क्योंकि स्केपर एक घटना-संचालित ढांचा है: वहां केवल कॉलबैक है) संपादित कोड में, लेकिन न तो आपके मूल कोड में। :) इसके अलावा, अगर आपको लगता है कि यह आपकी समस्या हल करता है तो कृपया इस उत्तर को स्वीकार करें। – starrify

संबंधित मुद्दे