Вопрос

У меня есть скрипт, который получает GeoIP-местоположения различных ips, он запускается ежедневно, и я собираюсь ожидать около 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, а сервер возвращает объект с данными о них. Не должно быть слишком медленным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top