2012-03-16 95 views
6

我想使用Python在网站上自动下载一些PDF(http://bibliotecadigitalhispanica.bne.es)。我试过使用urllib/urllib2 /机械化模块(我一直在使用其他网站:这包括像urlopen,urlretrieve等标准功能),但在这里,链接的JavaScript嵌入其中href属性进行一些处理并打开PDF,这些模块似乎无法处理,至少从我在这里阅读的内容中可以看出。例如,当我做到以下几点:使用Python执行JavaScript链接href中的链接

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文档本身。我尝试过使用硒,但它有点混乱 - 我不太清楚在阅读文档时如何使用它。有人可以提出一种方法(通过我没有尝试过的模块或通过我拥有的模块),我可以做到这一点吗?

非常感谢您对此有任何帮助。

PS:如果你想看到什么,我试图复制,我试图访问以下网页上面提到的PDF链接(与PDF图标的):): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

你能用正则表达式来提取uri吗? – max 2012-03-16 13:25:10

+0

我也试过这样做,从JavaScript函数调用中提取URI,然后尝试访问机械和urllib2,但目前为止没有运气 - 它只是让我回到包含HTML页面: - /从查看头部,它看起来好像有很多请求都是使用这个URI进行的,包括一些重定向。有没有办法抓住所有这些回应?也许这也可能解决这个问题。顺便谢谢你的回复。 – spanport 2012-03-17 00:14:08

+0

更新:通过查找最接近PDF文件的URL的结构,然后从这些文件进行重定向,我最终在该特定网站上找到了解决方法。干杯! – spanport 2012-03-17 13:41:57

回答

1

的javascript:open_window_delivery(“http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 &所有者= resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 &用户=来宾& pds_handle = & PID = 1673416 & con_lng = SPA & rd_session = ht TP://bibliotecadigitalhispanica.bne.es:80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416" );

该URL导致302页面。如果你遵循它,你最终会出现在一个框架页面,其中底部框架是内容页面。

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

(LIB)卷曲可以按照302页。

JavaScript是不是问题到目前为止。然后你在single_viewer_toolbar2.jsp中,在将函数提交给它的iframe“sendRequestIFrame”之前,函数setLabelMetadataStream将pdf的url放在一起。

我看到3种可能性:

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

我推荐学习更多关于硒的知识,看起来最简单。

+0

Selenium的+1,这可能是最理智的(最少工作)解决方案。另一个为“询问管理员”+1。 – 2012-03-19 04:09:12

+0

得到它的工作。谢谢! – spanport 2012-04-01 21:24:31