【问题标题】:How to run tampermonkey script that loads multiple pages and waits for their content?如何运行加载多个页面并等待其内容的 tampermonkey 脚本?
【发布时间】:2022-11-20 01:40:23
【问题描述】:

我想创建一个在一页上注册的 tampermonkey 脚本(称之为 A)。从这个页面(它是一个概览页面),它提取了一系列链接(比如[B, C, D])。到目前为止,这是有效的。

现在,我想做以下事情:

  1. 导航到位置B
  2. 等待 DOM 准备就绪,这样我就可以提取更多信息
  3. 从页面解析一些信息并将它们存储在一些对象/数组中。
  4. 使用 URL CD 重复步骤 1 到 3
  5. 返回地址A
  6. out的内容复制到剪贴板

    我可以通过window.openwindow.location 完成的任务 1。但我目前在第 2 步和第 3 步失败了。

    这可能吗?我不确定等待另一个页面是否会终止并卸载当前脚本。

    你能指出正确的方向来解决这个问题吗?

    如果您有任何更好的想法,我愿意听取他们的意见。我使用带有 tampermonkey 的浏览器的原因是页面使用某种 CSRF 保护意味着不允许我使用例如curl 提取相关数据。

    我见过this answer。据我了解,这将在每次调用时启动一个新脚本,我必须手动使用 URL 参数传递所有信息。这可能是可行的(除非服务器弄乱了参数)但似乎需要一些努力。有更简单的解决方案吗?

【问题讨论】:

    标签: javascript web-scraping tampermonkey


    【解决方案1】:

    要传输信息,有几个选项。

    • URL 参数,如您所提到的 - 但这可能会变得混乱
    • 将值和标志保存在 Tampermonkey 的共享存储using GM_setValue
    • 如果您使用window.open 打开要抓取的窗口,您可以让子窗口调用.postMessage,同时父窗口侦听消息(包括来自其他域的消息)。 (BroadcastChannel is a nice flexible option,但这里可能有点矫枉过正)

    听起来您的用户脚本需要能够在任意页面上运行,因此您可能需要 // @match *://*/*,以及一种向脚本指示自动导航到的页面是要抓取的页面的方法。

    当你想开始抓取时,用window.open打开目标页面。 (iframe 对用户更友好,但有时会因目标站点的安全限制而失败。)当页面打开时,您的用户脚本可以让目标页面检查 window.opener 是否存在,或者是否有 URL 参数 (像scrape=true),以表明它是一个要被抓取的页面。抓取信息,然后使用.postMessage将其发回给家长。然后父母可以为其他链接重复该过程。 (您甚至可以并行处理所有链接,如果它们位于不同的域中并且不会使您的浏览器超载。)

    等待 DOM 准备就绪应该是微不足道的。如果页面在 HTML 解析结束时完全填充,那么您的脚本只需要不是@run-at document-start,它会在加载 HTML 后运行。如果在 HTML 解析结束时页面未完全填充,您需要等待其他内容,只需have a timeout loop until the element you need exists

    保护意味着不允许我使用例如curl 提取相关数据。

    而不是用户脚本,在您自己的服务器上运行它会更可靠并且更容易管理,如果它是可能的.考虑检查一些更复杂的 curl 是否可以工作——例如,puppeteer,它可以模拟一个完整的浏览器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多