






















使用archivebox update --status unarchived命令,可以批量处理所有未成功抓取的链接。
docker exec -it archivebox /bin/bash
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
使用以下命令重新抓取所有未成功抓取的链接:
archivebox update --status unarchived
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.,笔者推荐这条)。
跳过特定链接(如果只影响少数链接):
目前ArchiveBox没有直接的“跳过”特定URL的功能。但可以尝试在更新时排除这个链接。不过,对于update --status unarchived这种全局操作,这不太可行。
暂时禁用 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)的链接。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。