“我稍后再读”:脱机收集网页的艰难命运

有些类型的软件无法使某些人无法生存,而有些人甚至无法想象这样的事情存在,而有人则根本需要它。 对我来说,多年以来, Macropool WebResearch就是这样的程序,它使可以将网页保存,读取和组织到一种离线库中。 我确信,许多读者都可以使用链接集合或浏览器和包含一组已保存文档的文件夹的组合来正常工作。 我希望至少能够将文档标记为“已读”或“收藏夹”,快速从一种文本切换为另一种文本,而不依赖于Internet或特定站点的可用性。 碰巧有时间在没有Internet的情况下(例如,在路上)准确地阅读,但是不幸的是,链接常常是短暂的。


显然,WebResearch的作者指望这些人。 该程序具有多种功能:按节和标记分类,编辑注释,各种导出/导入等。 但是,到2013年左右,该项目停止更新,然后开发人员的站点也不再存在。 几年来,我一直可以骑这匹马,但是首先浏览器插件(仅适用于当时的IE和FireFox版本)掉线了,然后基于旧的IE引擎,现代站点停止在查看器中正常显示。



WebResearch的主窗口, PC Week / RE No. 17(575)


失望之路


一旦确定无法避免更换,我便着手在后台寻找合适的替代产品。 在我看来,这没有什么特别的困难,因为我的愿望极其谦虚。 我准备与一小部分WebResearch工具相处,包括:


  • 使用扩展名从浏览器保存HTML页面;
  • 至少最少的编目工具(重新命名,组织目录,标签);
  • (最好)支持PDF文档;
  • 将集合与其他设备同步的任何体面方式。

令我惊讶的是,尽管我诚实地向上和向下攀爬了互联网并仔细研究了数十种合适的注释程序(Evernote除外,其中类似的描述功能仅可通过订阅获得),但我找不到类似的东西。 迄今为止,除了TagSpacesmyBase项目之外,它们至少以某种方式满足了我的愿望。 一般来说,他们的研究具有一定的文化意义。


TagSpaces是Electron上的“时尚,时尚,青年”组织者,拥有漂亮的网站,自适应的布局,当然还有一个黑暗的主题,而没有它。 同时,带有时尚的圆形图标的作品集命运多table的目录占据了屏幕的一半,最多同时容纳二十个,而基本的作品(如支持热键或渲染正在查看的文档)则根据剩余原理编写。 结果,文档歪斜地显示,并且使用该集合进行工作变成了用鼠标进行的无聊且耗时的练习集。


它的对立myBase来自90年代后期:在这里,除了纯功能接口之外,我们还有非常丰富的设置和功能集。 但是,这里的查看器仍然是基于旧IE的相同浏览器(这已经使阅读变得困难),并且所有文档都存储在一个整体数据库中。 例如,如果将其放在Dropbox文件夹中(仍然没有其他方法可以与其他设备同步),则在集合中进行最小的更改后,您必须等待数百兆的信息下载到服务器。


转折点


注释的进一步内容可能对读者来说似乎显而易见:现在,我们将提供我们自己的自行车,当然,它比任何现有的类似产品都便宜。 好像是,但不是真的。 我真的无法忍受myBase和TagSpaces的考验,并草绘了我自己的文档管理器,我将链接到结尾。 但是,这个满足个人需要的小项目本身不值得单独写一篇文章。 我写更多是因为我发现分享工作中获得的经验很有趣,还有一些我无法指望的令人不愉快的惊喜。


目的和目的


首先,我现在生活比较紧张,根本没有时间进行全面的业余爱好项目。 因此,从一开始,我就决定准备将要使用的所有组件雕刻成工具,以加快开发速度。 此外,目前我仅尝试实现绝对必要的最低功能,而这是不可或缺的。


数据格式和保存页面


如何将网页存储在磁盘上? 考虑到先前提出的要求,在我看来,选择的范围很小:“完整网页”保存格式(即具有相关资源的主HTML文件和文件夹)或MHTML格式。 第一种选择对我而言似乎立即变得不那么理想:从一堆文件中在磁盘上进行垃圾转储并不是一件好事,您需要从这些文件中提取有意义的文档,在搜索时过滤掉多余的文件并在复制时监视完整性。 当我尝试使用TagSpaces时,我不得不重新保存所有文档,以便资源文件夹的名称以点开头:然后系统将它们识别为“隐藏”,并且不显示它。


因为所有内容都存储在数据库中,所以这个问题在myBase中是看不到的,但是在我看来,简单性原则占了上风:我真的想将所有内容以普通文件的形式存储在磁盘上,这样我就不必处理诸如复制,重命名,删除和同步之类的常规操作的实现了。 。


MHTML格式正在经历艰难时期。 今年夏天Chrome放弃了一种保存MHTML的简单方法,我什至不知道现在应该存储什么页面? 很明显,机会尚未消失,有第三方扩展,但是总的来说,这是一种不好的信号。 此外, Chromium Embedded Framework不支持以MHTML格式保存,这也不会增加乐观情绪。


同时,我开始寻找一种简单的方法来将页面从浏览器保存到指定的文件夹。 结果,我用一点点的努力解决了这两个问题:我遇到了一个很棒的SingleFile项目,该项目可以将网页的内容保存在单独的独立HTML文件中。 这是通过将所有相关资源转换为base64格式并将其直接嵌入HTML来完成的。 当然,这样会增加文件的大小,并且内容看起来有些垃圾,但是总的来说,这种方法对我来说似乎可靠且简单,因此我选择了这种方法。


SingleFile作为浏览器扩展或命令行应用程序提供。 现在,我只使用扩展名:它非常方便,除了您需要手动选择要保存的目标文件夹。 将来,我可能会尝试完成该应用程序以简化此过程。 要从Chrome调用第三方应用程序,您可以使用“ 外部应用程序按钮”扩展程序-这是我的另一个有用发现。 顺便说一句,该应用程序已经受益:在它的帮助下,我将TagSpaces中的文件夹和文件集合转换为一组独立的HTML文档。


GUI和浏览器的麻烦


在我看来,Python非常适合于使用文件和字符串进行的各种简单操作,并且由于wxWidgets用于我的一个工作项目中,因此选择wxPython作为主要框架看起来是合乎逻辑的。


此外,在查看了其他程序中的页面显示后,我自己得出结论,处理这些问题的唯一可靠方法是将基于现代浏览器(即Chrome或Firefox)的可视化程序引入该程序中。


我必须承认,大约15年前我最后一次不得不做类似的事情,而且我没想到会有任何肮脏的把戏。 事实证明,“仅将浏览器拍打到表单上”是不可能的:以某种方式,人类未能可靠,普遍地应对这一任务。 表单上的任何列表框或按钮都可以放在任何GUI框架中,甚至可以生成跨平台代码,在我看来,2019年HTML的显示也应该是一个普遍解决的问题。


事实证明,在wxWidgets中,例如,标准的“浏览器”组件是跨系统的“浏览器”的跨平台包装,例如,对于Windows,这意味着Internet Explorer 7 ,Windows窗体中的情况也没有改善,并且提供了比IE9更为新的版本。仅在非平凡的注册表操作的帮助下。 如您所见,在过去的15年中,我不是唯一从事其他事务的人-在这里,也没有任何事情发生。


接下来,我有一个选择:更改框架或为浏览器寻找替代组件。 犹豫之后,我决定先尝试第二种方法,然后迅速遇到了一个Python CEF项目:Chromium Embedded Framework的Python绑定,该绑定专门用于将Chromium嵌入Python应用程序中的任务。


评估情况:Python是世界上最流行的编程语言之一,Chrome本质上是浏览器市场的垄断者。 同时,CEF Python实际上得到一个人的精力,力量和健康的支持。 有人真的需要吗?


但是,CEF Python最终并没有帮助我:尽管即使从项目存储库中与wxWidgets集成的基本示例显然也是有问题的,但我还是试图对其进行更长时间的修改,但无法解决所有出现的问题。 我什至不会深入探讨这个主题,它不太值得。


我更详细地研究了基于Chromium嵌入式框架的组件,并最终决定尝试使用C#版本 。 由于我几乎所有时间都在使用Windows,因此放弃跨平台平台的前景通常不会打扰我。


在开始时不可避免地大惊小怪之后,事情进展得更快了:CefSharp和Windows Forms的结合被证明是成功的,而且我能够毫无问题地解决大多数技术问题。


关于未经测试


您可以尝试使用Geckofx组件在C#应用程序中实现FireFox,但是我对此一无所知。 称为QWebEngineView的标准Qt浏览器组件基于Chromium ,因此它的工作可能不会比CefSharp差。


Qt的粉丝可能会想发表评论:他们说,我接受Qt,我不会有任何问题。 可能是这样,但是在为Python或C ++应用程序选择GUI框架时,可以考虑使用wxWidgets,如果不是第一个,则可以考虑第二个选项。 以我的拙见,浏览器之类的东西应该嵌入或多或少开发的GUI框架中,而不用鼓铃鼓跳舞。


网络图书馆


但是,让我们返回工作名称为WebLibrary的应用程序。 今天看起来像(鼓):



除了简洁明了的界面外 ,此处仅实现最基本的功能:


  • 将系统中任何指定的目录显示为文档库。
  • 在浏览器窗口中查看文档。 以通常的方式浏览列表(光标键,PgUp,PgDn,Home,End),然后使用Space和Shift + Space键在浏览器中滚动。
  • 重命名文件。
  • 使用热键将文档标记为已读或已选择。
  • 按任何字段对文档进行排序。
  • 库文件夹中的所有更改都会更新应用程序窗口。
  • 在退出时保存窗口设置。

所有这些似乎都是微不足道的功能,但是,可以说,仍然不支持在TagSpaces中保存列大小-显然,作者有不同的优先级。


状态(已读/已选择)仅存储在文件名中(已读doc.html文件重命名为doc{R,S}.html )。 这样的同步并没有实现,但是我只是将库保存在Dropbox中-最后,它只是一个包含文件的文件夹。


计划完成一些简单的事情,例如移动和删除文件,以及使用任意标签实施标签。 如果有人想帮忙,我只会很高兴。


结论


最不同的。 正如我从一开始就说的那样,一个人的工具与另一个人的工具有多么不同是令人惊讶的。 使用WebResearch之类的工具对我来说是很自然的,并且由于缺少它,我感到几乎不舒服。 同时,显然,我的志趣相投的人很少,否则找到类似物就不会有问题。 另一方面,更多主流软件也会发生类似情况:例如,微软不会更新OneNote的桌面版本,因此我必须使用2016版本,而且迟早我也必须将其移出某个位置。


更令人惊讶的是,在当前的库和框架环境中导航非常困难。 由于提供了服务,我几乎不必从头到尾编写桌面应用程序,并且我假设实际上任何语言都可以使用适用于任何编程语言的任何工具(一个窗口,三个组件,琐碎的交互)。 我们将直接采取任何措施,并在几天之内完成。


事实证明,现实并不那么有利,您可能会突然遇到一个问题。 假设我有两个splitter,可用于扩展浏览器窗口。 因此,在将它们加载到wxWidgets中之后恢复它们的位置非常困难,因为在几乎所有可用的事件发生后,系统会将它们置于默认位置,并且您必须进行各种黑客攻击才能获得所需的东西。 谁会猜到?


另一方面,很明显,在Windows Forms中,所有内容都是针对“业务接口”量身定制的。 几乎所有需要的东西都可以从框中访问:保存/还原应用程序设置以及方便的组件接口(假设我不希望可以从根到任何子元素的字符串形式请求TreeView组件的完整路径),以及简单的工具例如用于更改文件夹内容的跟踪器。


无论如何,浪费时间都没有白费,结果可以说是令人满意的,那么人们还能从生活中得到什么呢?

Source: https://habr.com/ru/post/zh-CN475092/


All Articles