我在尝试自建一套浏览记录保存和搜索的方案,有人愿意一起搞吗

2023-03-03 20:08:37 +08:00
 FrankAdler

前几天发过一个帖子,https://www.v2ex.com/t/919776 征集到了一些工具和已有的在线服务,折腾下来都不满意,但是意外的发现了有专门做主要内容提取的前端库,比如 mozilla 的 readability 。

我首先排除了手动保存、异步抓去(登录态动态加载的会失败),然后排除本地方案,因为有多台设备

我的现状是:

  1. 使用 singlefile 插件保存 html 到手搓的 webdav 服务
  2. webdav 服务会保存 html 到本地文件,同时提供一个类似 nginx 文件列表的界面查看文件,点击可以直接打开
  3. webdav 服务服务调用 readability 库提取 singlefile 生成 html 的主要内容、标题、原地址、文件路径提交到全文索引,这样能保证需要登录的和动态加载的也能提取到内容
  4. 全文索引使用 zincsearch ,一个 Go 开发的,类似 es 的轻量级索引,自带一个简易 webui 手动搜索找到文件路径和原地址

想做的是:

  1. webdav 保存文件+提交索引这块优化下,犹豫要不要使用数据库( sqlite 、mysql 等)记录状态,方便重建索引等
  2. readability 库是用 nodejs 写的,很多年没写 node 了,感觉现在写的代码不够好
  3. 尝试 readability 以外的内容提取库,比如 https://github.com/postlight/parser
  4. 基于 zincsearch 的数据提供一个类似搜索引擎的界面,功能需要:
    • 产品化的搜索界面,类似 https://demo.historio.us/search/ Google 这样,只是内容是私有的
    • 搜索后当前页面弹出预览,使用 readability 提取的内容(可能需要截断)
    • 搜索后跳转打开网页原地址
    • 搜索后跳转打开保存的 singlefile 生成的 html 文件(可能原地址失效了)
  5. 可能需要给 singlefile 提交一些功能 pr ,比如保存到 webdav 的时候提供更多的信息

所以需要支持的是:

  1. 前端&node:搜索界面开发,内容提取库开发或封装
  2. 熟悉 Go:相关接口开发,这块我自己就可以,帮忙 review 或者偶尔分担下
  3. 熟悉搜索:可能的话想基于 bluge 或 bleve 直接构建索引部分,减少一个组件
  4. 熟悉 chrome 扩展:singlefile webdav 部分功能定制(可能)或者直接向上游提 pr
  5. 其他:多提建议、试用

我会新建一个 github 组,用来放新写的代码,我也会把我已有的成果:webdav 、readability 封装开源出来,这些代码大概率需要重写。

做这些的初衷,就是想把浏览过的网页保存下来,方便以后万一需要再看(所以全文索引很重要),防止原地址失效,或者失去查看的权限和条件等。

希望不会被吐槽白嫖,以及需要征集项目和组名称。

5832 次点击
所在节点    程序员
58 条回复
woyaojizhu8
2023-03-04 13:57:37 +08:00
@iX8NEGGn 所以我的建议是用 recoll 来索引搜索,webscrapbook 仅保存
iX8NEGGn
2023-03-04 14:07:58 +08:00
@woyaojizhu8 仅保存的话 SingleFile 也能满足,但是多个不相干的软件配合使用,有割裂感。

而且还要整合管理功能才行,比如自动删除问题、重复页面问题,搜索到结果后点一下能直接看到带有 CSS 的原始页面,而不需要手动点击打开 Html 文件。
woyaojizhu8
2023-03-04 15:13:28 +08:00
@iX8NEGGn 不太可能有刚好符合你要求的软件,功能对于你的需求来说不多不少刚刚好,除非这软件是你自己写的。但是如果对于自己的各种需求都自己造轮子,那这工作量也太大了,所以用各种软件来组合是最好的,即使它们多出一些用不到的功能,甚至用不到的功能比用得到的功能还多,我觉得也不是啥大问题。而 recoll 跟 webscrapbook 配合,使用割裂感我感觉是比较弱的,或者说恰好在联系比较弱的两个功能模块(搜索跟保存)之间进行了割裂,分给了两个软件。
woyaojizhu8
2023-03-04 15:13:55 +08:00
@iX8NEGGn >搜索到结果后点一下能直接看到带有 CSS 的原始页面,而不需要手动点击打开 Html 文件。
没看懂,这是什么意思?这两者之间有什么区别?
FrankAdler
2023-03-04 19:48:31 +08:00
@woyaojizhu8 暂不考虑本地、单机的方案
FrankAdler
2023-03-04 20:00:31 +08:00
>搜索到结果后点一下能直接看到带有 CSS 的原始页面,而不需要手动点击打开 Html 文件。
没看懂,这是什么意思?这两者之间有什么区别?

使用 readability 这类库,可以提取页面的主页内容,隐藏其他的信息,比如对于现在这个帖子,导航、右侧、评论、底部注脚都可以剔除,只保留帖子内容这块,而且还有不太简陋的样式,适合预览
FrankAdler
2023-03-04 20:10:37 +08:00
@woyaojizhu8 临时
新建了一个空项目,https://b64s.uk/.1N-MUXfbIS0dIN6Mz9obYSpeXJvZ29uM2iqd3SwdoluAX5obX5m
在有人参与讨论前,我先不动手编码,暂且继续保持自己的方案
xitler
2023-03-04 22:47:06 +08:00
听起来很有意思,前端和 chrome 插件或许可以帮忙
woyaojizhu8
2023-03-05 00:19:53 +08:00
@FrankAdler # 25 recoll 可以实现多机。recoll 装一台 Linux 机子上,其他机子只装 recoll 浏览器扩展,通过 recoll webui 访问搜索
FrankAdler
2023-03-05 10:16:31 +08:00
@xitler 留个联系方式吧,或者加我 tg
FrankAdler
2023-03-07 18:43:33 +08:00
目前跟一个前端小伙伴一起,打算先开始了,希望后续还有人加入进来
FrankAdler
2023-03-09 13:11:02 +08:00
已经有两个前端的小伙伴了 😄 后端目前只有我自己
dannylin
2023-03-28 00:11:50 +08:00
我是網頁剪貼簿( WebScrapBook ,WSB )的開發者,最近碰巧看到這個帖,也說點想法。

樓主提到的功能 WebScrapBook + PyWebScrapBook 應該足以解決,因為二者本來就是集擷取、管理、加註、檢索、跨裝置存取的方案:
- 網頁擷取:有
- 儲存到遠端伺服器:有
- 多點存取:可以。能安裝 WSB 的瀏覽器都可以存取;不能安裝的也可以透過靜態索引頁面存取,或透過動態 Web 界面做有限度的編輯。
- 全文檢索:可以。而且支援的檢索條件相當豐富,比如在任意一或多本剪貼簿中檢索、限定在任意多個節點下檢索、RegExp 匹配檢索等等。

如果手上都是 SingleFile 擷取的網頁,PyWSB 也提供命令列工具匯入到 WSB 。(參見:wsb convert file2wsb -h )

順便說下儲存格式,在 WSB 的文件就有[分析過]( https://github.com/danny0838/webscrapbook/wiki/FAQ-(zh_TW)#%E5%A6%82%E4%BD%95%E9%81%B8%E6%93%87%E6%93%B7%E5%8F%96%E7%B6%B2%E9%A0%81%E7%9A%84%E5%84%B2%E5%AD%98%E6%A0%BC%E5%BC%8F)。我個人使用上幾乎都是擷取為資料夾包 HTML+資源檔,只在極少數情況使用單一 HTML 或 MAFF 等壓縮格式,主要理由是:
1. 資料放在伺服器上透過瀏覽器瀏覽時,這種形式效能最好。加註、編輯、回存、或全文檢索時也是如此。(比如全文索引器只要爬 HTML 檔就好,單一 HTML 檔案卻得連無關的肥大 base64 資料一起爬過)
2. 最容易與版控系統整合。我可以不定時把資料丟進 Git 版控,隨時比對差異或復原毀損資料。單一 HTML 內嵌太多可能是重複的 base64 ,會讓資料庫變肥,也不利差異比對。
3. 單一 HTML 先天就無法記錄多個互相連結的網頁,所以像深層擷取、合併擷取都是只有 WSB 才支援的功能。
dannylin
2023-03-28 00:16:39 +08:00
至於 @iX8NEGGn 提到的幾點:


1. 關於全文檢索:

如前所述,全文檢索本來就有提供,為了支援靜態頁面等相容性考量,目前是做成客戶端檢索,也就是要先下載所有全文快取再開始檢索。

至於資料量很大的情況,要看網路和機器。如果後端架在本地,一般不會有太太問題;如果架在遠端,以目前的網路條件,下載數十 MB 的全文快取也不是太大問題。

作為參考,我個人的一個主要剪貼簿有約 27 年的資料,總計約 3 千個項目,10 萬個檔案,2.0GB ,全文快取 54MB 。伺服器架在遠端的情況下,電腦檢索並不會有太大的延遲( nginx 傳送全文快取資料會自動壓縮,大概只剩 26MB 左右),手機會稍微慢些,不過問題應該不在網速,而在手機處理器的性能。

如果擔心下載全文快取吃光流量,WSB 套件有提供限制快取大小的功能,行動端可以拒絕載入太大的全文快取(仍可以用標題、時間等其他條件檢索)。

PyWSB 支援多剪貼簿,每個剪貼簿都有獨立的快取。可以把常用資料集中在幾本剪貼簿,不常用的放到其他幾本,平時只在前者檢索,就可以極小化載入不必要的快取的效能問題。

未來可能會考慮實做伺服端的全文檢索,這樣客戶端就不必下載整個全文快取了。

如果還有餘裕,或許可能會實做支援 js 以外的全文索引格式,以應付不同需求。


2. 關於自動擷取與書籤整合:

我個人很少用自動擷取,因為無差別擷取瀏覽的頁面作用不大,絕大多數資料都不會用到,徒然影響效能和空間;而 Web 應用如 SNS ,也很難用自動擷取抓到想要的內容。但如果要用,可以設定擷取到獨立的剪貼簿,和常用資料分開,把干擾減到最小。

與書籤整合也是。就我個人的使用方式而言,書籤通常是用於記錄某些常去的「網站」,而剪貼簿則是記錄「網頁」,兩者本質上就不同,也就不會發生既要加書籤又擷取的情況。而對於想暫時記著的「網頁」,WSB 也有擷取成書籤項目的功能。

我個人無法理解為什麼要既加書籤又自動擷取,還要書籤刪除後同步刪除擷取?那和直接擷取並用特定剪貼簿/資料夾分類有何區別?

無法理解的需求,我大概也不會不會考慮實做。如果真的想做,可以考慮寫成另一個瀏覽器套件,以便提供瀏覽器書籤整合,也可以透過 external message 接入 WSB 套件和 PyWSB 做到自動擷取。

至於像自動刪除過時資料之類的功能,可以另寫套件接入 PyWSB 處理。或者也可以考慮寫成 cron job 。

未來 PyWSB 可能會實做剪貼簿 CRUD 的 Python 模組、命令列、及 web API 接口。到時寫第三方工具應該會更方便。


說是這樣說,但現在還有太多工作,實做那些可能是很久以後了。如有高手感興趣,倒是歡迎加入開發行列。😊
FrankAdler
2023-03-28 00:25:31 +08:00
@dannylin 我会深入调研下 WebScrapBook 这个项目,6 年+的项目了还在维护,佩服
FrankAdler
2023-03-28 00:39:03 +08:00
@dannylin 感觉我想做的和你说的不太一样,我其实是想放弃书签,然后无差别的记录(会个别性的排除某些域名,singlefile 有这个功能,虽然不太好用),等以后想起来需要的时候,直接用关键词搜索,我看了下现有的数据,每天大概 200-300 个左右的 html 文件产生,差不多每个月 5G 左右的数据量,每个文件在 1M 以下,个别因为有图片会比较大,可能需要将来想办法处理掉。
然后搜索,我是寄希望于类似 ES ,甚至 Google 、Baidu 这样的完整的搜索引擎,数据在远端,本地像浏览网页一样的,搜到相关内容,点击查看原始网页(内容可能更新或失效了)或者查看当时保存下来的单体 html
iX8NEGGn
2023-03-28 03:29:08 +08:00
@dannylin “我個人無法理解為什麼要既加書籤又自動擷取,還要書籤刪除後同步刪除擷取?那和直接擷取並用特定剪貼簿/資料夾分類有何區別?”

之所以有这样的需求,是因为网页是我主要学习来源,我学习一个东西一般要学透,可能会打开几百甚至几千个网页,而且一开打就是几周甚至几个月,直到我学透并把所有的知识消化整理成我的笔记。

但有时,我不得不放下当前的学习去做其他的事情,因此我会一键收藏所有打开的页面到书签,可能会很长时间后我才能重新回来,但常常发现书签中的链接 404 了,这非常的难受,因为有些知识是我已经消化过了的,只是没来得及做笔记。

如果浏览的时候自動擷取了,一键收藏所有打开的页面到书签时就不会有太大的压力,而且浏览时擷取的成功比较高,那些自動擷取的网页经过一段时间后如果没有被收藏到书签,那么就应该把它们删除。当我把知识整理成我的笔记后,书签就没有用了,删除书签时应该把擷取的网页也删除。
dannylin
2023-03-28 08:20:32 +08:00
@iX8NEGGn 原來如此,你的想法相當於實做特定連動關係,這個的確是我們不太可能去為個別需求實做的。

如果要用比較符合目前框架下的做法,你可以考慮這樣做:
1. 設定自動擷取的頁面統一儲存到特定剪貼簿 X 。
2. 把「一鍵收藏到書籤」改成「一鍵擷取為 WebScrapBook 書籤」,假設擷取到特定剪貼簿 Y 。
3. 寫一個 cron tab 腳本,以一定頻率(例如每天)執行:
(1) 鎖定所有剪貼簿
(2) 檢查 X 內的每筆資料,若建立時間超過 n 天,且在 X 以外的剪貼簿中沒有相同來源網址的項目,就刪除。
(3) 解鎖

cron tab 腳本建議用 Python 寫,可以一定程度上調用 PyWSB 現有的 API 。
iX8NEGGn
2023-03-28 11:07:32 +08:00
@dannylin 保存书签时自动擷取,我简单修改 WebScrapBook 很容易就做到了,只需监听 bookmark create 事件,然后调用已有函数。

至于删除,PyWSB 比较复杂,我无从下手,我非常暴力的直接读取谷歌浏览器书签文件和 PyWSB 生成的 js 文件进行对比,然后删除网页文件以及重新生成 js 内容。

经过这两步操作,几乎满足了我的所有需求,还有一个没满足就是:“相同的 url ,间隔一定的天数才重新保存”,好像 WebScrapBook 在检查规则的 duplicate 时 PyWSB 没有返回创建时间相关信息,所以我无法做到,您是否考虑添加这个功能?或者能否告诉我后端该修改哪里?

最后感谢大佬开源了这么优秀的项目,同时期待 PyWSB 后端做全文搜索以及提供 CRUD 的 API 的那一天。
dannylin
2023-03-28 22:20:43 +08:00
@iX8NEGGn 魔改套件是你的權利,不過自製套件在安裝使用上可能會遇到簽署、上架之類的麻煩;而官方套件更新後要同步跟進也會比較麻煩。一般還是會比較推薦兩種模式:(1)推動官方實做;(2)另外做一個自製套件介接。當然,後兩者可能也會需要不少討論和妥協,最後還是看你的意願。如果你願意,或許可以把程式碼也開源出來及到我們的 issue tracker 發議題討論,這樣我們在考慮是否增加新功能或提供更多套件間介接用 API 也會比較有東西可以參考。

關於「相同 URL 若間隔一段時間後允許重複擷取」,目前沒有實做。當初設計自動擷取功能是參考舊版 ScrapBook AutoSave Add-on ,並沒有考慮更多可能的觸發條件,要把這些考慮進去,不做一番魔改看起來不太可能。其實當初我們就很猶豫是否要內建自動擷取,也許最終還是提供更多 API ,然後像舊版 ScrapBook 一樣把自動擷取功能整個獨立成另一個套件比較合適吧。XD

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920931

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX