【问题标题】:wget or curl from stdin来自标准输入的 wget 或 curl
【发布时间】:2012-02-15 23:35:02
【问题描述】:

我想下载一个网页,同时提供来自标准输入的 URL。本质上,一个进程不断产生到 stdout/file 的 URL,我想将它们通过管道传输到 wget 或 curl。 (如果您愿意,可以将其视为简单的网络爬虫)。

这似乎工作正常:

tail 1.log | wget -i - -O - -q 

但是当我使用 'tail -f' 并且它不再起作用时(缓冲或 wget 正在等待 EOF?):

tail -f 1.log | wget -i - -O - -q

谁能提供使用 wget、curl 或任何其他标准 Unix 工具的解决方案?理想情况下,我不想在循环中重新启动 wget,只要让它运行下载 URL 就可以了。

【问题讨论】:

    标签: unix curl wget stdin xargs


    【解决方案1】:

    使用xargs 将标准输入转换为参数。

    tail 1.log | xargs -L 1 wget
    

    【讨论】:

    • 正如我对另一个答案的评论:如果这是在共享机器上运行,您可能想知道任何其他用户都可以使用“ps”命令读取您的参数,所以不要放您的网址中的密码等。如果这可能是一个问题,请使用不涉及将 stdin 转换为参数的解决方案之一(对机器具有 root 访问权限的管理员当然仍然可以检查您正在获取的 URL,但可能您更信任管理员而不是信任随机其他用户)。
    【解决方案2】:

    你需要使用的是xargs。例如

    tail -f 1.log | xargs -n1 wget -O - -q
    

    【讨论】:

    • 使用xargs wget 接收URL 作为参数,因此您不再需要-i -tail -f 1.log | xargs -n1 wget -O - -q
    • 这将为每个 URL 启动一个新的 wget 进程
    • 如果它在共享机器上运行,您可能想知道任何其他用户都可以使用“ps”命令读取您的参数,因此不要在您的 URL 中输入密码等。如果这可能是一个问题,请使用不涉及将 stdin 转换为参数的解决方案之一(对机器具有 root 访问权限的管理员当然仍然可以检查您正在获取的 URL,但可能您更信任管理员而不是信任随机其他用户)。
    【解决方案3】:

    尝试将tail -f 传递到python -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

    这会立即获取每个 URL(好吧,您可能是指命令行 curl,我将其称为 Python 单线的库,但它仍然是 curl)立即获取每个 URL,同时仍然利用保留如果您按顺序从同一服务器请求多个 URL,则打开服务器的套接字。但它并不完全可靠:如果您的 URL 之一是 duff,则整个命令将失败(您可能希望使其成为适当的 Python 脚本并添加 try / except 来处理此问题),还有一些小细节它将在 EOF 上抛出 EOFError(但我假设如果您使用的是 tail -f,这并不重要)。

    【讨论】:

      【解决方案4】:

      如果在同一Web服务器上下载文件,则有效的方法是避免使用xargs。

      wget -q -N -i - << EOF
      http://sitename/dir1/file1
      http://sitename/dir2/file2
      http://sitename/dir3/file3
      EOF
      

      【讨论】:

        猜你喜欢
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多