我使用以下命令将浏览器的响应从 URL 列表附加到相应的输出文件中:
wget -i /Applications/MAMP/htdocs/data/urls.txt -O -
>> /Applications/MAMP/htdocs/data/export.txt
这工作正常,完成后说:
Total wall clock time: 1h 49m 32s
Downloaded: 9999 files, 3.5M in 0.3s (28.5 MB/s)
为了加快速度,我使用了:
cat /Applications/MAMP/htdocs/data/urls.txt |
tr -d 'r' |
xargs -P 10 $(which wget) -i - -O -
>> /Applications/MAMP/htdocs/data/export.txt
这会打开同时连接,使其更快一些:
Total wall clock time: 1h 40m 10s
Downloaded: 3943 files, 8.5M in 0.3s (28.5 MB/s)
如您所见,它以某种方式省略了一半以上的文件,并且需要大约相同的时间才能完成。我猜不出为什么。我在这里要做的是使用xargs
一次下载 10 个文件(并行处理(,并在‘STDOUT’
完成后跳转到下一个 URL。我错过了什么还是可以这样做?
另一方面,有人可以告诉我可以设置的连接限制是什么吗?了解我的处理器可以处理多少连接而不会减慢我的系统速度,甚至避免某种类型的系统故障,这将非常有帮助。
我的API 速率限制如下:
每分钟请求数100
单个请求中的映射作业数100
每分钟的映射作业总数10,000
你试过GNU Parallel吗?它将是这样的:
parallel -a /Applications/MAMP/htdocs/data/urls.txt wget -O - > result.txt
您可以使用它来查看它将做什么而无需实际执行任何操作:
parallel --dry-run ...
其中任何一个都可以看到进展:
parallel --progress ...
parallel --bar ...
由于您的输入文件似乎有点混乱,您可以像这样剥离回车符:
tr -d 'r' < /Applications/MAMP/htdocs/data/urls.txt | parallel wget {} -O - > result.txt
几件事:
- 我认为您不需要
tr
,除非您的输入文件有些奇怪。xargs
期望每行一个项目。 man xargs
建议您"将-n
选项与-P
一起使用;否则 很可能只有一个高管会被完成。- 您正在使用
wget -i -
告诉wget
从标准输入读取URL。但是xargs
将提供URL作为参数提供给wget
。 - 若要调试,请将
echo
替换为wget
,并检查它如何批处理参数
所以这应该有效:
cat urls.txt |
xargs --max-procs=10 --max-args=100 wget --output-document=-
(我更喜欢长参数 ---max-procs
是-P
.--max-args
是-n
(
请参阅具有多个同时连接的wget下载,了解执行相同操作的替代方法,包括GNUparallel
和一些专用的多线程HTTP客户端。
但是,在大多数情况下,我不希望并行化显着提高您的下载速率。
在典型用例中,瓶颈可能是您到服务器的网络链接。在单线程下载期间,您希望使该路由中最慢的链接饱和。使用两个线程可能会获得非常轻微的收益,因为一个线程可以下载,而另一个线程正在发送请求。但这将是一个边际收益。
因此,只有当您从多个服务器获取数据,并且到某些服务器的路由中最慢的链接不在客户端时,这种方法才可能是有价值的。