我正在尝试使用 Python 在站点 ( http://bibliotecadigitalhispanica.bne.es ) 上自动下载一些 PDF。
我试过使用 urllib/urllib2/mechanize 模块(我一直在其他站点使用这些模块:这包括 urlopen、urlretrieve 等标准函数),但是在这里,链接的 href 中嵌入了 JavaScript进行一些处理并打开 PDF 的属性,这些模块似乎无法处理这些模块,至少从我在这里阅读的内容来看是这样。例如,当我执行以下操作时:
request = mechanize.Request('the example url below')
response = mechanize.urlopen(request)
它只是返回包含的 HTML 页面 - 我似乎无法提取 PDF(该页面内也没有指向它的链接)。
通过在真实浏览器中查看 header (使用 Firefox 中的 LiveHTTPHeaders 扩展),我知道发出了很多 HTTP 请求并最终返回了 PDF(并显示在浏览器中)。我希望能够拦截并下载它。具体来说,我收到了一系列 302 和 304 响应,最终生成了 PDF。
这是我正在抓取的链接属性的示例: href='javascript:open_window_delivery("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess ");'
看来,如果我执行这个嵌入在 href 属性中的 JavaScript,我最终可以到达 PDF 文档本身。我试过使用 selenium,但它有点令人困惑——我不太确定在阅读它的文档后如何使用它。有人可以建议我可以做到这一点的方法(通过我没有尝试过的模块或通过我拥有的模块)吗?
非常感谢您对此的任何帮助。
P.S.:如果您想查看我正在尝试复制的内容,我正在尝试访问下一页上提到的 PDF 链接(带有 PDF 图标的链接):: http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356
最佳答案
javascript:open_window_delivery("http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3&owner=resourcediscovery&custom_att_2=simple_viewer&forebear_coll=1333&user=GUEST&pds_handle=&pid=1673416&con_lng=SPA&bird_pansession=。 bne.es:80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416");
该 URL 指向 302 页面。如果您按照它进行操作,您最终会到达一个框架页面,其中底部框架是内容页面。
(lib)curl 可以跟踪 302 个页面。
到目前为止,Javascript 不是问题所在。然后您位于 single_viewer_toolbar2.jsp,其中函数 setLabelMetadataStream 将 pdf 的 url 放在一起,然后将其提交到其 iframe“sendRequestIFrame”。
我看到了 3 种可能性:
- javascript 执行方法:复杂度高,需要编写大量代码,可能很脆弱
- 基于浏览器的东西:Selenium 可能不错。我知道 elinks2 支持 javascript,根据它的维基百科页面,它可以用“Perl、Ruby、Lua 和 GNU Guile”编写脚本。
- 向网络管理员寻求帮助。无论如何,您都应该这样做以了解他们对机器人的政策/态度。也许他们可以为您(和其他人)提供接口(interface)/API。
我建议学习更多有关 Selenium 的知识,这似乎是最简单的。
关于javascript - 使用 Python 在链接的 href 中执行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9735074/