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

6
我正在尝试使用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(该页面内也没有链接到它)。

通过查看真实浏览器中的标头(使用Firefox中的LiveHTTPHeaders扩展),我知道会发出许多HTTP请求,最终返回PDF(并在浏览器中显示)。我想拦截它并下载它。具体而言,我会得到一系列302和304响应,最终导致PDF。

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

似乎如果我执行嵌入在href属性中的JavaScript,则最终可以到达PDF文档本身。我已尝试过selenium,但有点困惑-阅读其文档后我不太确定如何使用它。有人能建议一种方法(通过我尚未尝试过的模块或通过我尝试过的模块),以便我可以做到这一点吗?

非常感谢任何帮助。

附注:如果您想查看我正在尝试复制的内容,我正在尝试访问以下页面中提到的PDF链接(具有PDF图标): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356


你能使用正则表达式来提取URI吗? - max
我也尝试过这样做,从JavaScript函数调用中提取URI,然后尝试使用mechanize和urllib2访问它,但到目前为止没有成功 - 它只是返回包含HTML页面的内容:-/ 从查看标头来看,似乎使用此URI进行了大量请求,包括一些重定向。有没有办法获取所有这些响应?也许这也可以解决问题。顺便说一句,谢谢你的回复。 - spanport
更新:最终我通过找到最接近PDF文件的URL结构,然后从那些URL进行重定向的方式解决了这个特定网站的问题。谢谢! - spanport
1个回答

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://bibliotecadigitalhispanica.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”中。

我看到3种可能性:

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

我建议学习更多关于Selenium的知识,它似乎是最容易的。


+1 给 Selenium,这可能是最明智(最省力)的解决方案。另外再 +1 给“询问管理员”。 - Li-aung Yip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接