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

标签 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)

它只是返回包含的 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 页面。如果您按照它进行操作,您最终会到达一个框架页面,其中底部框架是内容页面。

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. 向网络管理员寻求帮助。无论如何,您都应该这样做以了解他们对机器人的政策/态度。也许他们可以为您(和其他人)提供接口(interface)/API。

我建议学习更多有关 Selenium 的知识,这似乎是最简单的。

关于javascript - 使用 Python 在链接的 href 中执行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9735074/

相关文章:

javascript - 如何删除特定按钮?

javascript - 将 1 的 JSON 数组转换为对象

python - 如何抓取多个网站的缩略图截图?

python - 在装饰 ABCMeta 子类中的所有方法时强制执行抽象方法行为

python - 使用 mechanize 和 pythonanywhere 获取 "error Tunnel connection failed: 403 Forbidden"

打开网站时Python Mechanize Value错误

javascript - 通过 findIndex 方法比较 'id'

javascript - 扩展 JavaScript 通用模块(UMD 文件)中定义的类的正确方法是什么

python - 更改字典中的列表会更改所有列表

perl - WWW::Scripter 的身份验证问题