如何自动下载生成的PDF

时间:2018-05-24 15:25:52

标签: screen-scraping

方案:
我们需要每天将数据输入欧洲国家的政府数据库。我们突然需要检索一些数据。但他们允许的唯一格式是从数据生成的PDF - 数百个。我们希望避免在链接后坐在网页浏览器点击链接前面。

生成的链接看起来像

<a href='javascript:viajeros("174814255")'>
  <img src="img/pdf.png">
</a>

我几乎没有使用Javascript的经验,所以我不知道我是否可以安装例程作为书签来循环访问DOM,查找所有链接,并调用该函数。如果可能的话,也不会如何写它。

无法预测ID号,因此我无法编写其他页面或curl / wget脚本来执行此操作。 (如果可以的话,它仍然会失败,如下所述。)

&#39; viajeros&#39;功能很简单:

function viajeros(id){
  var idm = document.forms[0].idioma.value;
  window.open("parteViajeros.do?lang="+idm+"&id_fichero=" + id);
}

但是将该URI提供给curl或wget会失败。显然他们检查cookie或REFERER并生成错误。

此外,由于每个链接都将PDF放在浏览器选项卡而不是下载目录中,我们仍然需要进行两次点击(制表符和保存)数百次。

我该怎么办?

对于它的价值,这是在MacOS 10.13.4上。我通常使用Safari,但我也有Opera和Firefox。我可以安装Chrome,但这是最后的选择。不,那是倒数第二:我们还有一台(颤抖)Windows 10笔记本电脑。这是最后的手段。

(注意:我查看了四个看似有希望的重复建议,但每个都没有答案或指示提问者修改生成PDF的代码。)

2 个答案:

答案 0 :(得分:1)

document.querySelectorAll("img[src=\"img/pdf.png\"]")
    .forEach((el, i) => {
      let id = el.parentElement.href.split("\"")[1];
      let url =
          "parteViajeros.do?lang=" + document.forms[0].idioma.value +
          "&id_fichero=" + id;
      setTimeout(() => {
        downloadURI(url, id);
      }, 1500 * i)
    });

这将获取PDF图标的所有图像,然后查看其父级的链接目标。此href已提取其ID,并传递给字符串构造,使得要下载文件的路径类似于“viajeros”但没有window.open。然后将此URL传递给执行下载的downloadURI

这使用another Stack Overflow answer中的downloadURI函数。您可以通过在链接上设置下载属性,然后单击它来下载URL,这是实现的。这仅在Chrome中进行了测试。

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}

打开包含链接的页面并打开控制台。首先粘贴downloadURI函数,然后粘贴上面的代码以下载所有链接。

答案 1 :(得分:0)

我有类似的情况,我必须下载在一天或一周内生成的所有(发票)pdf。

经过一些研究后,我能够使用 PhantomJS 进行抓取,之后我发现了 casperjs ,这使我的工作变得轻松。< / p>

phantomJs和casperjs是无头浏览器。

由于您对JS和JS的经验较少 如果您是C#家伙,那么 CefSharp 可能对您有帮助。

一些有用的链接:

开始使用幻像,casper和cefSharp

PhantomJs

CasperJs

CefSharp

尝试阅读下载文件的文档。