![有什么快速的方法可以下载大量小网页吗?](https://linux22.com/image/1456385/%E6%9C%89%E4%BB%80%E4%B9%88%E5%BF%AB%E9%80%9F%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E4%B8%8B%E8%BD%BD%E5%A4%A7%E9%87%8F%E5%B0%8F%E7%BD%91%E9%A1%B5%E5%90%97%EF%BC%9F.png)
我需要尽可能快地下载大量小页面。一页的平均大小为 3kb。有数百万个页面。首先,我尝试了,curl
但速度太慢了,可能是因为它在等待服务器响应请求,然后对下一页执行相同的过程。
curl -O "http://website.com/pages/[0000001-1000000].html"
编辑:经过一些测试,我观察到了这些结果。我随时愿意接受更多建议。我希望进一步提高速度。
比较 1:(DNS 与无 DNS)
慢点:
curl -O "http://website.com/pages/[1-1000].html" -s -S
快点:
curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S
下载大量小页面时,DNS延迟至关重要。
比较 2:(使用 curl 序列与“seq”)
慢点:
curl -O "http://90.111.123.222/pages/{1}.html" -s -S ::: $(seq 1 1000)
快点:
curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S
比较3:(并行执行)
慢点:
time parallel -j 5 curl -O \'"http://90.111.123.222/pages/{1}.html"\'
-S -s ::: $(seq 1 1000)
快点:
( time curl -O "http://90.111.123.222/pages/[1-200].html" -s -S &
time curl -O "http://90.111.123.222/pages/[201-400].html" -s -S &
time curl -O "http://90.111.123.222/pages/[401-600].html" -s -S &
time curl -O "http://90.111.123.222/pages/[601-800].html" -s -S &
time curl -O "http://90.111.123.222/pages/[801-1000].html" -s -S & )
顺便说一句,显然运行更多的实例会在某种程度上提高这两种方法的速度。
答案1
您可以通过将操作分成几个较小的操作来加快速度。例如,您可以创建 10 个 curl 进程并将它们置于后台:
curl -O "http://website.com/pages/0[000000-999999].html" &
curl -O "http://website.com/pages/1[000000-999999].html" &
curl -O "http://website.com/pages/2[000000-999999].html" &
...
等等。
然而,更智能、更灵活的解决方案可能希望使用GNU并行因此可以并行下载多个文件,并并行处理任务分配。
使用你选择的包管理器进行安装,然后它会很简单
parallel -j 10 curl -O "http://website.com/pages/{1}" ::: $(seq -w 1000000)
这更优雅
答案2
下载并学习使用 GNU Parallel
https://www.gnu.org/software/parallel/
使用单行命令,您很快就能并行运行所有操作,而不仅仅是网页下载。