使用Python在链接的href中执行JavaScript

spa*_*ort 6 javascript python mechanize urllib web-crawler

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

它只是回到包含HTML页面 - 我似乎无法提取PDF(该页面内也没有链接).

我知道通过查看真实浏览器中的标题(使用Firefox中的LiveHTTPHeaders扩展名),可以发出大量HTTP请求并最终返回PDF(并在浏览器中显示).我希望能够拦截并下载它.具体来说,我得到一系列302和304响应,最终导致PDF.

以下是我正在抓取的链接属性示例:href ='javascript:open_window_delivery(" http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess ");'

似乎如果我执行嵌入在href属性中的这个JavaScript,我最终可以到达PDF文档本身.我尝试过使用硒,但这有点令人困惑 - 我不太确定如何在阅读其文档时使用它.有人可以建议一种方式(通过我没有尝试过的模块或我通过的模块),我可以这样做吗?

非常感谢您对此的任何帮助.

PS:如果你想看看我想要复制什么,我试图访问下面提到的PDF链接(带有PDF图标的那些):):http: //bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?FUNC =集合-结果&collection_id = 1356

j13*_*13r 1

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&rd_session=http://bibli otecadigitalhispanica.bne.es :80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416");

该 URL 会指向 302 页面。如果您遵循它,您最终会看到一个框架页面,其中底部框架是内容页面。

http://bibliotecadigitalhispanica.bne.es///exlibris/dtl/d3_1/apache_media/L2V4bGlicmlzL2R0bC9kM18xL2FwYWNoZV9tZWRpYS8xNjczNDE2.pdf

(lib)curl 可以跟随 302 页。

到目前为止,Javascript 还不是问题。然后您将进入 single_viewer_toolbar2.jsp,其中函数 setLabelMetadataStream 将 pdf 的 url 组合在一起,然后将其提交到其 iframe“sendRequestIFrame”。

我看到三种可能性:

  1. javascript 执行方法:复杂度高,需要编写大量代码,可能很脆弱
  2. 基于浏览器的东西:Selenium 可能不错。我知道 elinks2 有 javascript 支持,根据它的维基百科页面,它可以用“Perl、Ruby、Lua 和 GNU Guile”编写脚本。
  3. 向网络管理员寻求帮助。无论如何,您应该这样做以了解他们对机器人的政策/态度。也许他们可以为您(和其他人)提供接口/API。

我建议更多地了解 Selenium,它似乎是最简单的。