检索页面中所有外部对象的URL。动态加载

时间:2015-02-28 22:13:31

标签: python url web-scraping

我知道我可以使用许多方法从网页中检索所有网址,例如' mechanise',BeautifulSoup等等。

然而,问题是,某些页面可能包含由Javascript加密的URL或从.js文件中加载的URL。

在Firefox中,有一个名为" Live http header"的插件,当您打开此插件并访问网页时,该插件将为您提供已加载到其中的所有网址网页。

我想在python中做同样的事情,有什么想法吗?

PS:我设法通过PhantomJS和python webproxy完成,然后解析python代理输出。

#!/usr/bin/env python
from selenium import webdriver
service_args = [
    '--proxy=127.0.0.1:8899',
    '--proxy-type=http',
    ]
driver = webdriver.PhantomJS(service_args=service_args)
driver.get("http://example.com")
print driver.current_url
driver.quit

有更好/更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

分析AdBlock + Firefox扩展的来源表明DOM没有提供这样的功能(only some limited collections,如images)。 唯一的框架是jQuery Mobile - 显然,仅适用于通过该框架发出的请求。

相反,浏览器引擎提供与发出外部请求相关的事件(这可以解释为什么需要重新加载页面以查看FireBug中的请求)。 AdBlock +挂钩它们并将其自定义属性(包括URL和相关的过滤器引用)附加到浏览器的对象模型的适当节点。

所以,你需要

  • 编写一个将该信息反映到页面中的插件,或
  • 将浏览器引擎嵌入到您的应用中并“从另一方”接收事件,或
  • 使用UI查询工具(例如Firefox支持MSAA)通过浏览器的UI从现有插件/内置功能中检索该信息。

或者,您可以在网络级别执行此操作 - 使用嗅探器或代理。然后你将无法处理HTTPS:

  • 用嗅探器,
    • 解密流量需要服务器的私钥
  • 代理需要
    • 解密响应以读取URL
    • 之后使用自己的证书对其进行重新加密(可能会在浏览器中产生安全警告)

答案 1 :(得分:0)

你可以使用Selenium。您应该以标准Selenium的方式打开页面,然后执行与The best way to inspect HTTP response headers with Selenium

相同的操作

答案 2 :(得分:0)

要捕获可能由JavaScript生成的所有可能的URL,您可能必须有效地运行无头浏览器。一种可能性是使用Webkit库。谷歌搜索" python webkit"找到一些可能性。

相关问题