从标准输入中使用wget或curl

19
我想要从stdin提供URL并下载网页。基本上,一个进程会不断地将URL输出到stdout或文件中,我希望将它们通过管道传递给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即可。

4个回答

11

你需要使用xargs。例如:

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

使用 xargswget 将 URL 作为参数接收,因此您不再需要 -i -tail -f 1.log | xargs -n1 wget -O - -q - pabouk - Ukraine stay strong
这将为每个URL启动一个新的wget进程。 - Neil McGuigan
如果此程序在共享机器上运行,您可能需要知道任何其他用户都可以使用“ps”命令读取您的参数,因此不要将密码等信息放在URL中。如果这可能是一个问题,请使用不涉及将stdin转换为参数的解决方案之一(当然,具有对该机器的root访问权限的管理员仍然可以检查您正在获取哪些URL,但是您可能相信管理员比随机其他用户更可靠)。 - Silas S. Brown

1

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

tail 1.log | xargs -L 1 wget

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

0

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

这将使curl(好吧,你可能想要使用命令行curl,而我正在从Python一行代码中调用它作为库,但它仍然是curl)立即获取每个URL,同时仍然利用保持套接字与服务器打开的优势,如果您按顺序请求同一服务器的多个URL。但它并不完全健壮:如果您的某个URL有问题,则整个命令将失败(您可能需要将其制作成一个适当的Python脚本,并添加try/except来处理此问题),还有一个小细节,即它会在EOF上抛出EOFError(但我假设如果您使用tail -f,那么这并不重要)。


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接