我有一个脚本可以获取各种 ips 的 GeoIP 位置,它每天运行,我预计大约有 50,000 个 ips 可以查找。
我设置了一个 GeoIP 系统——我只是想消除每个报告运行 wget 50,000 次的麻烦。
我在想的是,必须有某种方法让 wget 打开与 url 的连接 - 然后传递 ips,这样它就不必重新建立连接。
任何帮助都感激不尽。
如果您wget
一次提供多个地址,连续的地址属于同一 HTTP/1.1 ( Connection: keep-alive
) 支持服务器,wget
将重新使用已经建立的连接。
如果在命令行上列出的地址太多,您可以将它们写入文件并使用-i
/--input-file=
选项(并且,根据 UNIX 传统,-i-
/--input-file=-
读取标准输入)。
但是,没有办法在不同的wget
调用之间保持连接。
您还可以编写一个线程化的 Ruby 脚本来同时在多个输入文件上运行 wget 以加快处理速度。因此,如果您有 5 个文件,每个文件包含 10,000 个地址,则可以使用以下脚本:
#!/usr/bin/ruby
threads = []
for file in ARGV
threads << Thread.new(file) do |filename|
system("wget -i #{filename}")
end
end
threads.each { |thrd| thrd.join }
这些线程中的每一个都将使用一个连接来下载文件中的所有地址。下面的命令意味着只有 5 个连接到服务器来下载所有 50,000 个文件。
./fetch.rb "list1.txt" "list2.txt" "list3.txt" "list4.txt" "list5.txt"
您还可以编写一个小程序(用 Java 或 C 或其他语言),将文件列表作为 POST 请求发送,服务器返回一个包含有关它们的数据的对象。也不应该太慢。