2016-02-19 37 views
0

我想爬这是使用pdf.js Example爬行使用CasperJS

的问题是一些DOM元素都出现在Firebug但不是在页面的源代码做了一个PDF文件的内容的PDF文件,所以每当我尝试抓取时,我都会看到空白的pdf页面。

我用NightWatchJs试过同样的东西,但它的工作,但为了一些特定的目的,我想坚持CasperJS。

这里是我的代码

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'debug', 
    userAgent: 'Mozilla/5.0 poi poi poi (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22', 
    contentType: 'application/pdf', 
    viewportSize: { 
     width:2000, 
     height:1000 
    }, 
    pageSettings: { 
     javascriptEnabled: true, 
     loadImages: true, 
     loadPlugins: true 
    } 
}); 

var fs = require('fs'); 

casper.start('https://mozilla.github.io/pdf.js/web/viewer.html', function() { 

    this.waitForSelector("#pageContainer1", function check() { 
      var pdfContent = this.getPageContent(); 
      fs.write('/var/www/caspersJS/pdf_check.html', pdfContent, 'w+'); 

      this.capture('/var/www/caspersJS/pdf_check.png', { 
       top:0, 
       left:0, 
       height:2368, 
       width:2024, 
       format: 'png', 
       quality: 100 
      }); 
    }, function then() { 
      var pdfContent = this.getPageContent(); 
      fs.write('/var/www/caspersJS/pdf_then.html', pdfContent, 'w+'); 

      this.capture('/var/www/caspersJS/pdf_then.png', { 
       top:0, 
       left:0, 
       height:2368, 
       width:2024, 
       format: 'png', 
       quality: 100 
      }); 
    }, 60000); 
}); 
casper.run(); 
+0

Hi Artjom B. 如果您打开[link](https://mozilla.github.io/pdf.js/web/viewer.html),您将看到pdf内容为“基于跟踪的Just-in-时间类型专业化动态“。我想抓取该内容。 – Khwab

+0

如果您只需要文本内容,则不必使用casper或phantom,只需使用API​​即可获取文本内容。见https://github.com/mozilla/pdf.js/blob/master/examples/node/getinfo.js – async5

+0

嗨Artjom ..如果你看到我的脚本,我等待60秒,该id被加载,但问题是pdf不是只加载。我通过捕获屏幕证实了这一点。 – Khwab

回答

-2

你还没有完全等到页面(和PDF)被加载。 #pageContainer1是第一页的容器,但容器可能存在,但其内容尚未创建。

casper.waitForSelector(selector, then, onTimeout, timeout)将等到selector在DOM中可用,然后执行then回调。如果在timeout毫秒之后没有找到selector等待,它将执行onTimeout

您可以想出一个更好的选择,可以显示你的页面是否被加载,或者你可以等待的时间静态量:

this.waitForSelector("#pageContainer1") 
    .wait(5000, function() { 
     var pdfContent = this.getPageContent(); 
     fs.write('pdf_check.html', pdfContent, 'w+'); 

     this.capture('pdf_check.png'); 
    }); 
+0

仍然没有运气。我甚至尝试将等待时间改为20000,但仍然出现跟随错误。 [info] [phantom]第_step 3/4步:在2506ms完成。 [警告] [幻影] Casper.waitFor()超时 [error] [phantom]等待超时5000ms过期,退出。 超过5000ms的等待超时退出。 – Khwab

+0

PhantomJS 2.1.1适用于我。您使用哪个PhantomJS版本?请注册到'resource.error','page.error','remote.message'和'casper.page.onResourceTimeout'事件([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file -2_caspererrors-JS))。也许有错误。 –

+0

我的Phantomjs版本是1.9.0 我尝试添加“remote.message”,“page.error”,“resource.error”,“page.initialized”,但仍然没有运气。我会升级phantomjs并重试。 – Khwab

0

刚刚发现这个帖子的时候我在做研究有关类似问题。你可能已经转向别的东西了。但我只想为正在研究这些问题的人添加一点点。

据我所知,在pdf.js中查看的每个页面内容仅在您滚动到/靠近其位置时加载。所以如果你想要的不仅仅是第1页的信息,那么一定要把脚本添加到你的脚本中。如果你期望获得整个文件。您可以使用PDFView.download()下载它。这是pdf.js中提供的函数,只要您可以查看整个pdf。