【问题标题】:Retrieve current chrome open page in html without saving it在 html 中检索当前的 chrome 打开页面而不保存它
【发布时间】:2019-02-26 01:22:54
【问题描述】:

我正在实现一个主要基于 pyautogui 的 python 脚本。该脚本所做的其中一件事是打开一个 chrome 网页。之后,我需要访问这个当前打开的网页的 DOM。 由于我没有用 selenium 打开浏览器,所以我不能用它来分析 DOM。 但是,我的问题是:这个当前打开的 chrome 页面是否可用/保存在硬盘驱动器的某个位置,以便我可以使用 selenium 访问它?像一个 .html 文件? 我在这里检查了许多其他问题,用户谈论 chrome 缓存,但那里没有 html 文件。 我只需要能够访问当前打开的页面,而不是缓存中的所有历史数据。 直接用 selenium 打开网络浏览器也不是一种选择,因为大多数被分析的网站都有验证码和蒸馏技术。 谢谢。

【问题讨论】:

  • 嗯...您到底需要什么?只是 DOM,作为 html?您可以使用webdriver.page_source 获取源代码,以便稍后保存。这将包含当前呈现的 html(基本上与您在任何浏览器中使用 CTRL-U 获得的相同),但不包含外部资源(没有 css/js/pic/whataver 文件,只是对它们的引用)
  • @skandigraun 我确实需要它们 DOM,但请记住我不使用 selenium 打开 chrome 浏览器。
  • 如果您不想使用硒,为什么这是一个硒问题。不,现代浏览器不会将当前页面保存在磁盘上。但由于不清楚您对浏览器有什么样的访问权限(除了不使用 selenium),因此不确定我们能否提供这么少的细节。
  • @skandiggraun 我想你有足够的线索。如果您创建一个答案,我将能够对其进行投票,并确保您因帮助而获得奖励。再次感谢
  • 哦,是的......甜蜜的互联网点,我来了:D

标签: selenium google-chrome selenium-chromedriver browser-cache pyautogui


【解决方案1】:

如果您使用 --remote-debugging-port=PORT_NR 参数启动原始 chrome,并从另一个浏览器访问 localhost:PORT_NR,您将可以访问浏览器的全部内容,包括开发控制台。

一旦你有了这个,你有多种方法可以去:

  1. 您可以使用任何其他浏览器(甚至使用相同的浏览器)访问http://localhost:PORT_NR,并且您应该可以完全访问原始 Chrome 的内容。使用 Selenium,您应该可以相对轻松地过日子。

  2. 您也可以使用 devtools api(文档......很好......还有改进的空间。搜索 chrome devtools protocol 会因缺少文档而感到惊讶)。例如,您可以访问 http://localhost:PORT_NR/json 以获取可用的调试 URI。获取相关的 websocket 端点 (webSocketDebuggerUrl)。打开一个 websocket 连接,然后发出一个命令,比如{"method": "DOM.getDocument", "id":12}。你可以在这里找到可用的 DOM 相关命令:https://chromedevtools.github.io/devtools-protocol/1-3/DOM

【讨论】:

    【解决方案2】:

    既然我不得不重新设计轮子,我可能会提供一些我在任何地方都找不到的额外信息:

    1. 在启用远程调试的情况下启动浏览器(参见以前的帖子)
    2. 连接到 localhost 上的给定端口并使用这些 HTTP-GET-Requests 对您的浏览器进行非常有限的控制: https://chromedevtools.github.io/devtools-protocol/#endpoints

    最重要的:

    • GET /json/new?{url}
    • GET /json/activate/{targetId}
    • GET /json/close/{targetId}
    • GET /json 或 /json/list

    要完全控制浏览器,您需要使用“websocket”连接。 GET /json 或 /json/list 中的每个对象都有自己的 ID。使用此 ID 与选项卡交互。顺便说一句:类型“页面”是普通标签,其他东西是扩展等等。一旦你知道你想影响哪个选项卡,得到它是“webSocketDebuggerUrl”。

    使用这个 URL 并连接到可以使用 Websocket 协议的东西。

    连接后,您必须通过以下结构制作一个有效的 Json:

    {
    "id":0,
    "method":"Page.navigate",
    "params":{url:http://google.com}}
    }
    

    注意事项: ID 是一个变大的简单计数器(int) - 不是选项卡的 ID(!) Method是文档中描述的方法params也在文档中。

    返回值始终为 JSON。

    从现在开始,您可以使用官方文档: https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-navigate

    不知道其他人是如何发现它的,但花了几个小时才让它工作。可能是因为每个人都只是使用 python 的 selenium 来做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2012-01-20
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多