惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
GbyAI
GbyAI
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
P
Proofpoint News Feed
The Cloudflare Blog
H
Help Net Security
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
量子位
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
月光博客
月光博客

山月

在VS Code配置Obsidian風格Markdown編輯環境 – 山月 在Windows通过LM Studio使用Zotero MCP – 山月 禁用WordPress中Jetpack的AI助手按钮 – 山月 WordPress/MCP Adapter安装与维护指南 – 山月 WordPress服务器权限与所有权配置详解 – 山月 在Windows上為GnuCash啟用線上報價 (Finance::Quote) – 山月 Gitea Docker /var/empty 权限问题除错总结 – 山月 Bookwyrm由0.7.5升级至Production(e217a17)完整过程及疑难解答 – 山月 用正则表达式修改ruby标签 – 山月 为WordPress Syndication Links插件添加新的站点与图标的实现方法 – 山月 进入不断重启的Docker容器的命令行之方法 – 山月 自建Bookwyrm无法查询远端用户?——开启数据库扩展 – 山月 BookWyrm无法增添书本、作者、阅读进度……?——解决数据库自增序列问题 – 山月 俾Docker容器中的应用访问宿主机上的数据库服务 – 山月 QNAP NAS使用者注意!千万莫对MariaDB做这件事…… – 山月 解决Wikibase手动导入数据后无法新建实体之问题 – 山月 辰年再訪神保町 – 山月 PHP-FPM站点池配置调优以解决WordPress过度占用系统资源之问题 – 山月 如果Linux软件包常规升级失败——以python3-update-manager为例 – 山月 解决站点526报错:SSL证书配置错误 – 山月 風挾着陽光來 – 山月 和A.N.R.GHG插件说bye-bye – 山月 WordPress页面链接末尾出现“?swcfpc=1”后缀,是怎么回事? – 山月 安装、维护Monica PRM的一些笔记 – 山月 清理服务器空间的着手点 – 山月 关于Joplin Server文件上传大小上限 – 山月 如何优化PHP文件上传大小:完整指南 – 山月 WordPress站点部分地出现“严重错误”的一些可能的解法 – 山月 批量更改WordPress媒体URL – 山月 自托管WordPress编辑文章出现问题的排查法 – 山月
批量处理ArchiveBox所有未成功抓取的链接 – 山月
2024-07-13 · via 山月

使用archivebox update --status unarchived命令,可以批量处理所有未成功抓取的链接。

工序

  1. 进入Docker容器
docker exec -it archivebox /bin/bash
  1. 切换到数据目录
cd /data

切换到非管理员操作:

su archivebox

否则会有安全性报错:

[!] ArchiveBox should never be run as root!
    For more information, see the security overview documentation:
        https://github.com/ArchiveBox/ArchiveBox/wiki/Security-Overview#do-not-run-as-root
  1. 执行命令

使用以下命令重新抓取所有未成功抓取的链接:

archivebox update --status unarchived
  1. 退出容器
exit

示例

以下是能在终端中看到的示例输出:

root@b4444bfff46f:~# cd /data
root@b4444bfff46f:/data# archivebox update --status unarchived
[i] [2024-06-23 08:00:00] ArchiveBox v0.6.2: archivebox update --status unarchived
    > /data
[i] [2024-06-23 08:00:00] Updating all snapshots with status: unarchived...
[i] [2024-06-23 08:00:01] Snapshot URL: http://example.com (1/1)
[i] [2024-06-23 08:00:02] Archiving snapshot using wget...
...

其他选项

  • 指定时间段:可以使用--before--after选项来指定一个时间段,例如:
archivebox update --status unarchived --after "2023-01-01"
  • 特定的抓取工具:可以使用--extract选项来指定特定的抓取工具,例如:
archivebox update --status unarchived --extract wget

这些选项可以根据需求进行组合使用。

补充:倘遇到TypeError

有时执行本文所介绍之命令,会遇到中断的情况,并返回日志如下(以鄙站为例):

[+] [2025-07-06 04:31:51] "sanguok.com"
(中略)
archive_methods.save_readability(Link(url=https://sanguok.com))

Traceback (most recent call last):
  File "/app/archivebox/extractors/__init__.py", line 114, in archive_link
    log_archive_method_finished(result)
  File "/app/archivebox/logging_util.py", line 435, in log_archive_method_finished
    hints = hints if isinstance(hints, (list, tuple)) else hints.split('\n')
TypeError: a bytes-like object is required, not 'str'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/archivebox", line 33, in <module>
    sys.exit(load_entry_point('archivebox', 'console_scripts', 'archivebox')())
  File "/app/archivebox/cli/__init__.py", line 140, in main
    run_subcommand(
  File "/app/archivebox/cli/__init__.py", line 80, in run_subcommand
    module.main(args=subcommand_args, stdin=stdin, pwd=pwd)    # type: ignore
  File "/app/archivebox/cli/archivebox_update.py", line 119, in main
    update(
  File "/app/archivebox/util.py", line 114, in typechecked_function
    return func(*args, **kwargs)
  File "/app/archivebox/main.py", line 783, in update
    archive_links(to_archive, overwrite=overwrite, **archive_kwargs)
  File "/app/archivebox/util.py", line 114, in typechecked_function
    return func(*args, **kwargs)
  File "/app/archivebox/extractors/__init__.py", line 181, in archive_links
    archive_link(to_archive, overwrite=overwrite, methods=methods, out_dir=Path(link.link_dir))
  File "/app/archivebox/util.py", line 114, in typechecked_function
    return func(*args, **kwargs)
  File "/app/archivebox/extractors/__init__.py", line 130, in archive_link
    raise Exception('Exception in archive_methods.save_{}(Link(url={}))'.format(
Exception: Exception in archive_methods.save_readability(Link(url=https://sanguok.com))

笔者是在ArchiveBox v0.6.2遇到的此情况。这个错误信息TypeError: a bytes-like object is required, not 'str'表明在archivebox/logging_util.py文件的log_archive_method_finished函数中,有一个预期的字节类型对象被传递了一个字符串类型对象。

这个错误通常发生在Python 3环境中处理字节和字符串混合的情况。ArchiveBox在尝试记录归档方法的完成状态时,可能某个内部函数或外部工具返回了字符串,而它期望的是字节数据,或者反之。从堆栈跟踪来看,错误发生在archive_methods.save_readability(Link(url=https://sanguok.com))这一行,这暗示问题可能与readability提取器在处理特定链接时有关。readability提取器负责将网页内容转换为更易读的格式。

为此,一个值得期待的解决方案是更新至新版本,看看该bug有无被解决掉。抑或者就是跳过有问题的链接(下述方法1.)或提取器(下述方法2.,笔者推荐这条)。

  1. 跳过特定链接(如果只影响少数链接): 目前ArchiveBox没有直接的“跳过”特定URL的功能。但可以尝试在更新时排除这个链接。不过,对于update --status unarchived这种全局操作,这不太可行。

  2. 暂时禁用 readability 提取器: 那么,可以尝试在update命令中排除readability提取器,看看是否能绕过这个问题。 首先,需要知道当前启用了哪些提取器。可以在ArchiveBox的配置中查看,或者查看默认启用的提取器列表。假设默认启用了wget, readability, dom, screenshot, git, media, favicon,可以尝试这样:

    archivebox update --status unarchived --extract wget,dom,screenshot,git,media,favicon
    

    这将指示ArchiveBox在归档时跳过readability模块。

辨析

还有一种俾ArichiveBox重新抓取的方法,是使用--resume参数;但这需要一个时间戳作为其值,指定从哪个时间点开始恢复。

倘是希望重新抓取所有未成功的链接,就可以使用本文介绍的--status unarchived选项,这个选项会处理所有未成功(即状态为unarchived)的链接。