понедельник, 21 сентября 2009 г.

Качаем картинки с галерей на движке Danbooru пачками.

Актуальная версия скрипта доступна тут.

Часто наблюдаю в Интернете галереи на движке Danbooru
Смотреть картинки хорошо, но хочется взять и скачать всю подборку по определенному тегу.
С галереями типа http://moe.imouto.org всё просто, потому что на страницах уже есть ссылки на исходные изображения.
Можно использовать менеджер закачки и обрабатывать каждую страничку отдельно, а можно и воспользоваться простым скриптом. Для его работы необходимо поставить библиотеку libpcre, в состав которой входит программа pcregrep, и wget.
Сам скрипт:
#! /bin/bash
for ((i=1; i<=$1; i++))
do
echo ==== Page $i ==== >>get.imouto.txt
wget "http://moe.imouto.org/post?page=$i&tags=$2" -O - |pcregrep -o -e 'href[^ ]+\.[^ ^ico]{4}'|sed -e 's/href\=\"//g' -e 's/\"//g'|uniq|grep imouto >>get.imouto.txt
done;
wget -nc -i get.imouto.txt
Это вариант для http://moe.imouto.org.
Запускается так: get.imouto.sh количество_страниц набор_тегов
Теги соединяются с помощью знака "+".

Скрипт легко переделывается для работы с http://konachan.com:
#! /bin/bash
for ((i=1; i<=$1; i++))
do
echo ==== Page $i ==== >>get.konachan.txt
wget "http://konachan.com/post/index?page=$i&tags=$2" -O - |pcregrep -o -e 'href[^ ]+\.[^ ^ico]{4}'|sed -e 's/href\=\"//g' -e 's/\"//g'|grep Konachan >>get.konachan.txt
done;
wget -nc -i get.konachan.txt
Запускается так же.

С галереями типа http://danbooru.donmai.us сложнее, потому что там прямых ссылок на картинки нет.
Познаний в bash хватило на такой скрипт:
#! /bin/bash

# получаем ссылки на изображения и снабжаем файл разделителями на страницы
for ((i=1; i<=$1; i++))
do
echo ==== page $i === >>get2.donboru.txt
wget "http://danbooru.donmai.us/post?page=$i&tags=$2" --load-cookies="c.txt" -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)" -O - |pcregrep -o -e 'src[^ ]+preview[^ ]+'|sed -e 's/src\=\"//g' -e 's/\"//g' -e 's/\%20/ /g' -e 's/preview\///g'  >>get2.donboru.txt
done;

# скачиваем всё, что качается
wget -nc -t 0 -i get2.donboru.txt  -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"

# очищаем и сортируем список ссылок
cat get2.donboru.txt|pcregrep -o -e 'http.+'|sort > get2.donboru.jpg.txt

a=1
for name in `cat get2.donboru.jpg.txt|sed 's/\.jpg//'`;
do
echo $a $name
let "a=a+1"
if [ ! -f `basename $name.jpg` ]
     # если нет jpg, то качаем png
     then wget -nc -t 0 $name.png -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
          if [ ! -f `basename $name.png` ]
          # если нет png, то качаем gif
          then wget -nc -t 0 $name.gif -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
               if [ ! -f `basename $name.gif` ]
               # если нет gif, то качаем jpeg
               then wget -nc -t 0 $name.jpeg -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                    if [ ! -f `basename $name.jpeg` ]
                    # если нет jpg, то качаем JPG
                    then wget -nc -t 0 $name.JPG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                         if [ ! -f `basename $name.JPG` ]
                         # если нет JPG, то качаем PNG
                         then wget -nc -t 0 $name.PNG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                              if [ ! -f `basename $name.PNG` ]
                              # если нет PNG, то качаем GIF
                              then wget -nc -t 0 $name.GIF -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                                   if [ ! -f `basename $name.GIF` ]
                                   # если нет GIF, то качаем JPEG
                                   then wget -nc -t 0 $name.JPEG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                                        if [ ! -f `basename $name.JPEG` ]
                                        then echo $name >> not-found.txt
                                   fi # Not found
                              fi #JPEG
                         fi #GIF
                    fi #PNG
               fi #JPG
          fi #jpeg
     fi #gif
fi #png
done;

# делаем батник для переименования файлов
echo -n Creating rename.bat;a=1;for i in `cat get2.donboru.txt|grep ^http | pcregrep -o -e '\/data\/[a-f0-9]+'|sed 's/\/data\///g'`; do echo move `dir $i*` `printf %06d $a`.`dir $i*`>>rename.bat;echo -n .; let "a=a+1"; done;echo Done!

# прибираемся за собой
#rm -f get*.txt *.htm*
Для правильной работы скрипта надо зарегистрироваться на сайте и сохранить куки в файл c.txt и положить его в папку, в которую будт производиться закачка.
Запуск осуществляется так же.

Скрипт можно переделать для http://chan.sankakucomplex.com, для него куки не нужны.
Скрипт:
#! /bin/bash

# получаем ссылки на изображения и снабжаем файл разделителями на страницы
for ((i=1; i<=$1; i++))
do
echo ==== page $i === >>get2.sankaku.txt
wget "http://chan.sankakucomplex.com/post?page=$i&tags=$2" -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)" -O - |pcregrep -o -e 'src[^ ]+preview[^ ]+'|sed -e 's/src\=\"//g' -e 's/\"//g' -e 's/\%20/ /g' -e 's/preview\///g'  >>get2.sankaku.txt
done;

# скачиваем всё, что качается
wget -nc -t 0 -i get2.sankaku.txt

# очищаем и сортируем список ссылок
cat get2.sankaku.txt|grep ^http|sort > get2.jpg.sankaku.txt

a=1
for name in `cat get2.jpg.sankaku.txt|sed 's/\.jpg//'`;
do
echo $a $name
let "a=a+1"
if [ ! -f `basename $name.jpg` ]
     # если нет jpg, то качаем png
     then wget -nc -t 0 $name.png -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
          if [ ! -f `basename $name.png` ]
          # если нет png, то качаем gif
          then wget -nc -t 0 $name.gif -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
               if [ ! -f `basename $name.gif` ]
               # если нет gif, то качаем jpeg
               then wget -nc -t 0 $name.jpeg -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                    if [ ! -f `basename $name.jpeg` ]
                    # если нет jpg, то качаем JPG
                    then wget -nc -t 0 $name.JPG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                         if [ ! -f `basename $name.JPG` ]
                         # если нет JPG, то качаем PNG
                         then wget -nc -t 0 $name.PNG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                              if [ ! -f `basename $name.PNG` ]
                              # если нет PNG, то качаем GIF
                              then wget -nc -t 0 $name.GIF -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                                   if [ ! -f `basename $name.GIF` ]
                                   # если нет GIF, то качаем JPEG
                                   then wget -nc -t 0 $name.JPEG -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
                                        if [ ! -f `basename $name.JPEG` ]
                                        then echo $name >> not-found.sankaku.txt
                                   fi # Not found
                              fi #JPEG
                         fi #GIF
                    fi #PNG
               fi #JPG
          fi #jpeg
     fi #gif
fi #png
done;

# делаем батник для переименования файлов
echo -n Creating rename.bat;a=1;for i in `cat get2.sankaku.txt|grep ^http | pcregrep -o -e '[a-f0-9]+\.'|sed 's/\.//'`; do echo move `dir $i*` `printf %06d $a`.`dir $i*`>>rename.bat;echo -n .; let "a=a+1"; done;echo Done!

# убираем за собой
#rm -f get*.sankaku.txt *.htm*
Последнюю  строчку можно раскомментировать, чтобы скрипт удалил за собой все следи своей работы.
Последние два скрипта создают файл "rename.bat", в котором содержатся команды для переименования файлов в том порядке, в котором они идут в галерее. В файле "not-found.txt" сохраняются URL картинок, которые не удалось скачать с сервера.

На http://danbooru.donmai.us с 14:00 до 14:25 MSK ежедневно проводится обслуживание. В этот промежуток времени он возвращает страницу с текстом об этом на любой запрос.

Буду благодарен. если кто-то оптимизирует мои поделки.