批量下载 PDF

批量下载 PDF

如果有的话,在 Python 中使用 bash happy 获取建议可能/可能不可能。

但我想从以下链接下载所有 PDF/ePub

https://mises.org/library/books

您可以通过选择“PDF”然后选择“全部”执行以下操作来选择可用的 PDF。您将看到他们所拥有的 PDF 文档列表。

问题是,当您向上浏览列表时,URL 似乎没有改变,如果您选择 EPUB,然后选择全部,也会出现相同的链接。

因此,如果我使用 wget curl ,似乎没有办法区分 PDF 和 EPUB。

然后我将使用 Calibre 将它们转换为 PDF/EPub 并上传到我的 Kindle 帐户,这样我就可以在管道上阅读一堆它们。

提前致谢..

答案1

(一开始只是一些提示,最后变成了一个相当大的答案。(再次:]))

我无法回答网站上是否有任何禁止批量下载的政策,但作为一个开始。

尽管这是特定于站点的,但相同的过程应该适用于类似的站点,因此答案可能对其他人有用。更像是一个例子。


那样我会仔细查看该网站的页面,而不是简单地尝试将其作为一个整体进行爬行。其一,既有免费内容,也有付费内容。第二;仅仅下载一大堆文件可能会变得有些混乱,特别是考虑到有多少文档。

隔离索引页

  1. 无论您位于哪个部分,该页面都会显示相同的 URL。但是可以通过查看源代码或简单地胡佛林您将看到的其中一个部分至少有两个可能有趣的目标:

    PDF : https://mises.org/library/books?book_type=539
    EPUB: https://mises.org/library/books?book_type=537
    
  2. 结果分为 10 和 10 个命中。例如:PDF展示显示第 1 - 10 条,共 535 条胡佛林数字在底部,我们找到下一条有趣的信息:&page=1&page=2

由于有 535 个点击,我们必须下载535 / 10 = 54页面。因为page=0实际的最后一页是page=53

这为我们提供了有关下载什么内容以开始使用的提示。 PDF:

https://mises.org/library/books?book_type=539&page=0
https://mises.org/library/books?book_type=539&page=1
...
https://mises.org/library/books?book_type=539&page=53

作为自由的PDF 似乎包含免费的 EPUB,因此可能不需要对EPUB标签。

在这种情况下,人们最终可能会这样做:

mkdir mises.org
cd mises.org

在终端中执行或添加到脚本文件中:

for i in {0..53}
do
    curl -o ./"$(printf "pdfl-%03d.html" $i)" "https://mises.org/library/books?book_type=539&page=$i"
done

我们已经有了一个很好的有序结构可以使用。

提取相关数据

完成此操作后,下一步是仔细查看其中一个子页面。例如pdfl-000.html

经过快速检查,我们发现每个包含在:

  <div class="panel-body">
     ... book data ...
  </div>

现在,一切都取决于您想要从这里提取路径的内容是要么去文件名+文件地址,或者还包括元数据和其他例如作者、主题、图像等。对于后者,您可以使用 Python、Perl 等中的 HTML 解析器。对于前者,也可以使用 - 但也可以使用更简单的文本处理工具,例如sedgrep

在这种情况下,(为了简单起见),我选择前者。

现在人们经常说应该永远不要用正则表达式解析 HTML等等,但在这种情况下我们不是解析文档但仅仅是提取相关数据。因此,特别是因为它不是一个随机的可能恶意的网站,也不是疯狂标记的黑客飞溅 - 但简洁且格式良好 - 使用sed等是可以的(恕我直言)。

进一步查看,pdfl-000.html我们发现标题包含在<h2 class="element-invisible">以 结尾的内容中.pdf。该文档的链接<atype="application/pdf

以此为基础,我们可以快速提取所有标题和目标,例如sed.结果sed给了我们标题统一资源标识符在交替线上,我们可以将结果通过管道传输到paste - -.

由于对项目进行编号会很好,我们进一步通过管道将其awk添加到一些更改后的文档名称。如果两个文档具有相同的标题,这也可能会节省我们的时间。

在这个粗略的例子中,我们假设没有名字有tabnewline或者"作为它的一部分。

sed -n -e 's#.*<h2 class="element-invisible"><a [^>]*>\([^<]*\.pdf\)</a>.*</h2>#\1#p' \
    -e 's#.*<a[^>]* href="\([^"]*\)"[^<]*type="application/pdf;.*#"https://mises.org\1"#p' \
    pdfl-* | \
    paste - - | \
    awk -F'\t' '{ printf "curl -o \"%03d-%s\" %s\n",NR,$1,$2 }' > curl.txt

下载

那么只需要做:

mkdir pdf
cd pdf
. ../curl.txt

并等待它下载。最终得到类似的结果:

001-A Spontaneous Order.pdf
002-Science Technology and Government.pdf
003-Science Technology and Government—Chinese.pdf
004-The Next Generation of Austrian Economics Essays in Honor of Joseph T. Salerno.pdf
005-A Short History of Man — Progress and Decline.pdf
...

边注

  • pdfl-NNN.html如果您想从文件中提取更多信息,请保留这些文件。

  • 使用 URL 值对所有 PDF 进行快速求和,lenghth=NNN显示总共需要下载 7401933553 字节或 6.89 GiB :P

相关内容