将多个 URL 目标保存到文本文件

dov*_*vah 4 wget

我有一个 URL 列表,我想将它们的每个目标保存在一个单独的文本文件中。

以下是包含 URL 的输入文件的示例:

~$: head -3 url.txt 
http://www.uniprot.org/uniprot/P32234.txt
http://www.uniprot.org/uniprot/P05552.txt 
http://www.uniprot.org/uniprot/P07701.txt
Run Code Online (Sandbox Code Playgroud)

我目前正在使用 Python 自定义函数来完成此任务。它可以工作,但主要的不便在于:用户必须手动复制粘贴 URL(没有直接的文件输入),并且输出在每行的开头(?二进制)包含一些“b”字符。

~$: head -3 P32234.txt
b' ID   128UP_DROME             Reviewed;         368 AA.
'b' AC   P32234; Q9V648;
'b' DT   01-OCT-1993, integrated into UniProtKB/Swiss-Prot.
Run Code Online (Sandbox Code Playgroud)

这是 Python 代码:

def html_to_txt(): 
    import urllib.request 
    url = str(input('Enter URL: ')) 
    page = urllib.request.urlopen(url) 
    with open(str(input('Enter filename: ')), "w") as f: 
        for x in page: 
            f.write(str(x).replace('\\n','\n')) 
    s= 'Done' 
    return s
Run Code Online (Sandbox Code Playgroud)

是否有使用某些 Unix 实用程序更简洁的方法?

cuo*_*glm 6

使用-i选项:

wget -i ./url.txt
Run Code Online (Sandbox Code Playgroud)

来自man wget

-i 文件

--输入文件=文件

从本地或外部文件读取 URL。如果 - 指定为文件,则从标准输入读取 URL。(使用 ./- 从字面上命名为 - 的文件中读取。)如果使用此函数,则命令行上不需要出现 URL。如果命令行和输入文件中都有 URL,则命令行上的 URL 将首先被检索。如果未指定 --force-html,则文件应包含一系列 URL,每行一个。

但是,如果指定--force-html,则文档将被视为html。在这种情况下,您可能会遇到相关链接的问题,您可以通过在文档中添加 "" 或在命令行上指定 --base=url 来解决。

如果文件是外部文件,则如果 Content-Type 与 text/html 匹配,该文件将自动被视为 html。此外,如果没有指定,文件的位置将被隐式用作基本 href。


Mic*_*mer 5

wget 有一个选项可以做到这一点:

wget --input-file url.txt
Run Code Online (Sandbox Code Playgroud)

将每行读取一个 URLurl.txt并按顺序将它们下载到当前目录中。

更一般地,您可以将xargs这种事情与wgetor结合使用curl

xargs wget < url.txt
xargs curl -O < url.txt
Run Code Online (Sandbox Code Playgroud)

xargs读取其输入的每一行,并将其作为参数提供给您给它的命令。这里的命令是wgetor curl -O,两者都下载一个 URL 并将其保存到当前目录中。< url.txt提供 的内容url.txt作为xargs命令的输入。


您的 Python 代码的问题在于,您从 urllib 中得到的是字节数据,然后您将这些数据直接打印到文件中,该文件将字节字符串化为b'abc\00\0a...'(这就是您编写字节文字的方式)。

  • @MichaelHomer:`xargs` 解决方案很糟糕,因为它什么时候会为许多 url 调用一些 `wget` 进程。使用 `-i` 选项调用一个 wget 进程。 (2认同)