【问题标题】:Executing JavaScript in href of links with Python使用 Python 在链接的 href 中执行 JavaScript
【发布时间】:2012-03-16 09:55:00
【问题描述】:

我正在尝试使用 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,但它有点令人困惑——我不太确定在阅读它的文档时如何使用它。有人可以建议一种方法(通过我没有尝试过的模块或通过我拥有的模块)我可以做到这一点吗?

非常感谢您对此提供的任何帮助。

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

【问题讨论】:

  • 你能用正则表达式来提取uri吗?
  • 我也试过这样做,从 JavaScript 函数调用中提取 URI,然后尝试使用 mechanize 和 urllib2 访问它,但到目前为止没有运气 - 它只是让我返回包含html 页面 :-/ 从查看标头来看,似乎有很多请求是用这个 URI 发出的,包括一些重定向。有没有办法抓住所有这些反应?也许这也可以解决问题。顺便说一句,谢谢您的回复。
  • 更新:我最终通过找到最接近 PDF 文件的 URL 结构然后从这些 URL 重定向,在这个特定站点上找到了解决方法。干杯!

标签: javascript python mechanize urllib web-crawler


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

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

【讨论】:

  • Selenium 的 +1,这可能是最理智(最少工作)的解决方案。另一个 +1 用于“询问管理员”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2021-12-20
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多