Как скачать миллион картинок?

Есть миллион ссылок на картинки. Предположим, на сайте-доноре нету рейт лимита. Как наиболее быстро их скачать? Если качать поочередно, то допустим 1 картинка в 1 секунду это 11 дней выкачки без перерыва. Если поставить в 10 потоков, то за сутки. Но все равно то как-то долго (картинок вообще и 10 млн может быть)

Качать планировал скриптом на Ноде. Отсюда и вопрос еще один, как распараллелить в 10 потоков? Ну т.е. тупо циклом пройтись не получится, он так сразу тыщу запросов видимо сделает за миллисекунды. Т.е. надо как-то оптимизировать это.

Может есть подходящие инструменты для этой задачи выкачки? Модули ноды или питон, можно и какой-то Гуи на крайняк.
  • Вопрос задан
  • 1445 просмотров
Решения вопроса 4
deepblack
@deepblack
download_images_from_csv.sh (допилите под себя если нужно)
spoiler
#!/bin/bash
COLUMN=1 # csv column to extract
RENAME=false # if we should rename the file, note that is was really specific for my problem.
THREADS=16 # threads to use by parallel

#Set Script Name variable
SCRIPT=`basename ${BASH_SOURCE[0]}`

#Set fonts for Help.
NORM=`tput sgr0`
BOLD=`tput bold`
REV=`tput smso`

# Help function
function HELP {
  echo -e \\n"Help documentation for ${SCRIPT}."\\n
  echo -e "Basic usage: ./$SCRIPT"\\n
  echo "Command line switches are optional. The following switches are recognized."
  echo "-f csv file = required should be last argument"
  echo "-c column, default $COLUMN"
  echo "-t threads, default $THREADS"
  echo "-r renamd, should be renamed - work in progress here because this is really specific renaming"
  echo -e "-h --Displays this help message. No further functions are performed."\\n
  echo -e "Example: ./${BOLD}$SCRIPT -rc 2 -f file.csv"\\n
  exit 1
}


#Check the number of arguments. If none are passed, print help and exit.
NUMARGS=$#
if [ $NUMARGS -eq 0 ]; then
  HELP
  exit 1
fi

while getopts ::c::r:h:f FLAG; do
  case $FLAG in
    t)
        THREADS=$OPTARG
      ;;
    c)
        COLUMN=$OPTARG
      ;;
    r)
        RENAME=true
      ;;
    h)  #show help
      HELP
      ;;
    \?)
      echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed."
      HELP
      ;;
  esac
done

shift $((OPTIND-1))

FILE=$1
# shift ops, all optional args are now removed $1 will have to be the filename

if [ "$RENAME" = true ]; then
    mkdir -p images && cat $FILE | tail -n +2 | cut -d ',' -f$COLUMN | grep http | sed -e 's/^[ \t\r]*//' | \
        (cd images; parallel -j$THREADS -d'\r\n' --gnu 'wget {}; mv {/} `echo "{/}" | tr "." "_" | cut -d "_" -f1,3 | tr "_" "."`')
else
    mkdir -p images && cat $FILE | tail -n +2 | cut -d ',' -f$COLUMN | grep http | sed -e 's/^[ \t\r]*//' | \
        (cd images; parallel -j$THREADS -d'\r\n' --gnu 'wget {};')
fi
Ответ написан
Комментировать
xotkot
@xotkot
хорошо есть и хорошо весьма
curl --remote-name-all --parallel $(<urls.txt)
Ответ написан
Комментировать
MvcBox
@MvcBox
Software Developer [C/C++/JS(for Node.js)/etc]
urls - массив ссылок на картинки.
concurrency - во сколько потоков скачивать изображения. Можете поставить свое значение.
Важно!!! Ни в коем слуае не используйе Sync функции при скачивании и сохранении картинок.

'use strict';

const Promise = require('bluebird');

Promise.map(urls, async function (url, index) {
    try {
        // Здесь ваш код, который берет url и сохраняет изображение
        // Об async/await можно почитаь здесь - https://learn.javascript.ru/async-await 
    } catch (e) {
        console.error(e);
    }
}, { concurrency: 10 }).catch(console.error);
Ответ написан
Комментировать
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
Node.js - не многопоточный, а асинхронный язык.
А так - циклами и качаете. Приложение можно запустить будет хоть в 100 инстансах, если напишите соответвующий "лаунчер".

PM2, вроде, умеет запускать несколько экземпляров одного приложения. Дальше - всё ограничено скоростью интернета и вашего диска.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@htr
Зачем писать велосипед - скачиватель файлов? если уже есть список файлов? этих утилит под любую ОС много) по таймингу все от канала зависит, я бы не считал шт/сек, а в Мб/сек... и фото бывают разные по 10Кб или 25Мб.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы