我是bash脚本的新手,所以请保持冷静与我^^
我想编写请求2000 cURL请求的bash脚本
快速和快速可能?
或者我应该为这种情况做些什么?
由于
修改
这是我从这里得到的脚本
#!/bin/bash
url=http://www.***.com/getaccount.php?username=
while read users
do
content=$(curl "{$url}${users}")
echo $users
echo $content >> output.txt
done < users.txt
其中users.txt有2000个用户名
问题是,它快吗?因为我必须每分钟用我的crontab调用那个脚本..所以这对我有好处吗?或者我应该像Perl一样使用其他语言。在我通过crontab执行2000请求之前,但将2000行添加到crontab是非常糟糕的
所以任何想法?
答案 0 :(得分:3)
如果您要求的所有网址都遵循简单模式(例如page1.html
到page2000.html
中的所有编号网页),那么curl本身可以在一个命令行中轻松下载:
# Downloads all of page1.html through page2000.html. Note the quotes to
# protect the URL pattern from shell expansion.
curl --remote-name-all 'http://www.example.com/page[1-2000].html'
有关网址格式的详情,请参阅manual page中标有“网址”的部分。
如果您有许多不遵循数字模式的网址,您可以将所有网址放入文件中,使用curl的-K
选项一次性下载所有网址。因此,使用您的示例,您要做的是修改文件以将用户名转换为前缀为url =
的URL。一种方法是使用sed(1)
实用程序
# Convert list of usernames into a curl options file
sed 's|^\(.*\)$|url = http://www.***.com/getaccount.php?username=\1|' users > curl.config
# Download all of the URLs from the config file
curl --remote-name-all -K curl.config
这比在单独的命令中下载单个文件要快得多,因为curl可以在单个进程中启用HTTP pipelining。这样,它就会设置一个TCP流,可以重复用于多个请求,而不需要为每个请求设置一个新的TCP流,只是为了再次将其拆除,这就是如果你在一个单独的进程中发出每个请求会发生什么
请注意,如此大规模的自动下载可能会违反网站的使用条款。在执行此类任务之前,您应该检查网站的robots.txt
文件,并确保不超过其速率限制。
答案 1 :(得分:0)
嗯,我认为你需要提供更多信息才能真正得到一个好的答案,但你可以很容易地在bash中循环:
for i in {1..2000}
do
echo "This is iteration number $i"
curl foo
done
上面的命令将按顺序执行每个循环,所有输出都将转到您的终端。您可能想要调查重定向stdout和stderr,以及背景您关心的部分。
我强烈推荐http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html和http://www.tldp.org/LDP/abs/html/。这些是我最喜欢的用于计算bash内容的资源(当然除了StackOverflow)。
关于你的问题,“它是否快”,这取决于你对快速的定义。我确信上面的内容可以通过多种方式进行优化,而且我更确定如果你用另一种语言进行优化,它可能要快得多。但它可能足够快,可以做任何你想要做的事情。