使用 CasperJS 抓取 PDF 文件

Crawling PDF file using CasperJS

我正在尝试抓取使用 pdf.js 制作的 PDF 文件的内容 Example

问题是某些 DOM 元素显示在 FireBug 中,但未显示在页面源代码中,因此每当我尝试抓取时,我都会得到空白的 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();

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

casper.waitForSelector(selector, then, onTimeout, timeout) 将等待 DOM 中的 selector 可用,然后执行 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');
    });

刚刚在研究类似问题时发现了这个 post。你可能已经转向其他事情了。但我只想为正在研究这些问题的人们补充一点。

据我所知,在 pdf.js 中查看的每个页面内容仅在您滚动 to/near 其位置时加载。因此,如果您不仅想要第 1 页上的信息,请务必在您的脚本中添加卷轴。如果您希望获得整个文件。您实际上可以使用 PDFView.download(); 下载它这是pdf.js中提供的功能,只要您可以查看整个pdf。