提问人:JAM 提问时间:8/9/2023 更新时间:10/27/2023 访问量:44
使用 MV3 Chrome 扩展程序自动化 (Angular?) 网站页面抓取/分析工作流程
Automating (Angular?) website page scraping/analysis workflow with MV3 Chrome Extension
问:
我的上下文:
我正在参与这个个人项目,通过在 MV3 下开发一个 Chrome 扩展程序,在两个不同且独立的“第三方服务”网站上自动化一个相对复杂且相互关联的工作流程;这包括网站交互,以及Dropbox和GoogleSheets读写交互。
简而言之,我的 Chrome MV3 扩展:
- 监控个人 Dropbox 文件夹;
- 根据Dropbox中检测到的新文件触发对FIRST网站的新请求;
- 在FIRST网站上监控和检测这些请求的变化;
- 触发相关的新请求并跟踪整个 SECOND 网站的相应更改,直到完全完成;
我的扩展程序在 Google 表格中维护所有这些交互和当前请求状态的日志。
在这两个网站中,监控请求的变化需要导航到特定的“历史”区域(可能包含多个页面),在每个请求的基础上“抓取”信息,将此新信息与我的 Google 表格中维护的先前信息进行比较和更新。
我首先设计了“历史抓取和分析”工作,让 Chrome 浏览器导航和浏览历史页面;我得到了这个工作,尽管我不喜欢这种方法,因为我觉得多个页面的视觉“轻拂”并没有提供最佳的用户体验。
因此,为了提供更流畅的用户体验,我决定通过以下方式直观地向用户隐藏“历史抓取和分析”工作:
- “fetching”(使用新的 XMLHttpRequest())将每个历史记录页面放入后台的“DOM”变量中
- 从包含 DOM 的变量中执行 DOM 抓取
- 只是通知用户消息发生了什么(例如“分析第 1 页的请求”、“分析第 2 页的请求”等)
这在我的第一个网站上完美运行。
我的问题:
SECOND网站的设计肯定是不同的。
根据我的研究,我认为第二个网站可能是用 Angular 构建的,但我对此没有任何确定性或知识。
请注意:我无法提供对该网站的直接访问,因为它受用户/密码保护,所以我附上了相关的屏幕截图
当我让 Chrome 物理导航到“历史区域”并浏览页面时,它们确实在浏览器中“完全”呈现;
具体来说,我需要报废的信息似乎在自定义标签下;无论如何,这些内容都可以通过“开发人员工具”控制台看到,并且可以通过脚本中的标准“document.getElement(s).*”命令访问,以便我可以抓取我需要的所有信息。
然而:
当我将脚本中的网站页面“提取”到一个变量中时(使用新的 XMLHttpRequest()),尽管 DOM 文档确实存储在变量中,但 DOM 内容显示标签 - 我认为所有历史内容都应该是 - 为空,所以我无法抓取任何东西。
然后我还意识到,即使我在 Chrome 浏览器中物理导航到实际的历史页面(如我的问题的详细信息中所述),我在 PAGE SOURCE 中看到的内容 - 可通过 View->Developer->View Source 获得,也不会在自定义标签内显示任何内容,该标签是空的
所以我知道浏览器显示的内容和实际的页面源(这也是在“获取”脚本操作中检索到的内容)之间似乎存在差异,但我不知道如何访问浏览器显示的实际内容。
我的问题::
- 我能做些什么来强制那些包含在“fetch”调用中并存储在我的脚本变量中的“历史”内容?
- 我是否需要/是否可以触发页面中的任何这些脚本以将它们馈送到变量中?如果是这样,您能指出是哪个脚本吗?
- 还是我唯一能像最初那样在 Chrome 浏览器中物理“轻弹”页面的手段?
我只是一个 javascript 新手,从一个平庸的 python 开发人员那里走过来,所以请原谅我的无知
答:
首先,感谢wOxxOm的建议;经过长时间的自学和反复试验,我想出了一种方法,即使不是 100% 我想要的,它也足以满足我的目的。虽然从技术上讲,它不是基于wOxxOm的建议(“屏幕外文档”),但由于我没有看到如何将其应用于我的问题,因此我使用了“屏幕外文档”的“概念思想”本身。所以,对于任何带着类似问题来到这里的人来说,对我有用的是:
- 在我的内容脚本中:我打开第二个(非活动)选项卡,其中使用 chrome.tabs.create({url: targetURL, active: false}) 导航到需要抓取的页面。这就是我所说的“背景”或“辅助”选项卡,因此是“屏幕外文档”的相关概念
- 尽管该选项卡在物理上是可见的(新选项卡在同一浏览器窗口中打开),但它不会将用户从活动选项卡中移开,因此它非常接近用户所在位置其他地方发生的事情。
- 在我的后台脚本中:我的 chrome.tabs.onUpdated 侦听器会检测任何辅助选项卡何时完成(我在 URL 中使用正则表达式映射器,因为这些详细信息页面中的任何一个都遵循类似的结构化 URL),然后使用该辅助选项卡/页面上的 chrome.scripting.executeScript 在该 tabId 上运行抓取。抓取结果存储在本地存储中。我也在 wOxxOm 的另一个答案中看到了 chrome.scripting.executeScript 的这个想法。
- 回到我的内容脚本中,我从本地存储中检索抓取的内容,然后关闭“辅助”选项卡。
相当笨拙,但即使我需要抓取一系列 40+ 项目,它也能无缝地满足我的目的。无论如何,我所有的 javascript 都很笨拙,因为我还没有学会接受语言的本质,我发现自己在与它作斗争,而不是按照我期望的方式做事。 我把所有的功劳都归功于wOxxOm这个方向的指针,再次感谢!
评论