【问题标题】: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])。到目前为止,这是有效的。
现在,我想做以下事情:
- 导航到位置
B。
- 等待 DOM 准备就绪,这样我就可以提取更多信息
- 从页面解析一些信息并将它们存储在一些对象/数组中。
- 使用 URL
C 和 D 重复步骤 1 到 3
- 返回地址
A
- 将
out的内容复制到剪贴板
我可以通过window.open 或window.location 完成的任务 1。但我目前在第 2 步和第 3 步失败了。
这可能吗?我不确定等待另一个页面是否会终止并卸载当前脚本。
你能指出正确的方向来解决这个问题吗?
如果您有任何更好的想法,我愿意听取他们的意见。我使用带有 tampermonkey 的浏览器的原因是页面使用某种 CSRF 保护意味着不允许我使用例如curl 提取相关数据。
我见过this answer。据我了解,这将在每次调用时启动一个新脚本,我必须手动使用 URL 参数传递所有信息。这可能是可行的(除非服务器弄乱了参数)但似乎需要一些努力。有更简单的解决方案吗?
【问题讨论】:
标签:
javascript
web-scraping
tampermonkey
【解决方案1】:
要传输信息,有几个选项。
听起来您的用户脚本需要能够在任意页面上运行,因此您可能需要 // @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,它可以模拟一个完整的浏览器。