0

我是 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 是一个非常糟糕的主意

所以有什么想法吗?

4

2 回答 2

3

如果您请求的所有 URL 都遵循一个简单的模式(例如所有从page1.htmlthrough编号的页面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'

有关URL 模式的更多信息,请参阅手册页中标记为“URL”的部分。

如果您有很多不遵循数字模式的 URL,您可以将所有 URL 放入一个文件中,使用-Kcurl 选项一次性下载它们。因此,使用您的示例,您要做的是修改文件以将用户名转换为前缀为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 管道。这样,它设置了一个 TCP 流,该流可重复用于多个请求,而不是需要为每个请求设置一个新的 TCP 流只是为了再次将其拆除,如果您在单独的进程中发出每个请求会发生这种情况.

但请注意,如此大的自动下载可能会违反网站的使用条款。在执行此类任务之前,您应该检查站点的robots.txt文件,并确保您没有超出他们的速率限制。

于 2013-08-22T01:10:48.043 回答
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.htmlhttp://www.tldp.org/LDP/abs/html/。这些是我最喜欢的用于找出 bash 内容的资源(当然,除了 StackOverflow)。

关于您的问题,“它快吗”,这取决于您对快的定义。我确信上述内容可以通过多种方式进行优化,而且我更确定如果您使用另一种语言进行优化,它可能会快得多。但它可能足够快,可以完成您实际尝试做的任何事情。

于 2013-08-22T01:04:21.450 回答