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

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

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

Может есть подходящие инструменты для этой задачи выкачки? Модули ноды или питон, можно и какой-то Гуи на крайняк.
  • Вопрос задан
  • 1208 просмотров
Решения вопроса 4
Andrew_Pinkerton
@Andrew_Pinkerton
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
Ответ написан
MvcBox
@MvcBox
Back-end developer
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, вроде, умеет запускать несколько экземпляров одного приложения. Дальше - всё ограничено скоростью интернета и вашего диска.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
pusherSharapov2
@pusherSharapov2
Только через мультикурл библиотеку на PHP в цикле и то смотря что там получится
Ответ написан
@htr
Зачем писать велосипед - скачиватель файлов? если уже есть список файлов? этих утилит под любую ОС много) по таймингу все от канала зависит, я бы не считал шт/сек, а в Мб/сек... и фото бывают разные по 10Кб или 25Мб.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Spice IT Recruitment Москва
До 200 000 руб.
TeamJet Москва
До 100 000 руб.
Fundraise Up Санкт-Петербург
от 140 000 до 200 000 руб.
17 окт. 2019, в 22:21
250000 руб./за проект
17 окт. 2019, в 19:04
300 руб./в час
17 окт. 2019, в 19:01
500 руб./в час