Добавить комментарий

Дамп музыки сообщества ВК VK

Есть много прог/плагинов, которые позволяют качать свои аудизаписи с ВК. Но что делать, если нужно скачать все аудио с паблика?

Самый простой вариант - это парсинг html. Изобретать велосипед не стал - скролил страницу кнопкой End до первого поста. Думаю, можно было бы заюзать фугкцию wall.showMore(10), но было лень.
В общем, готовый файл весил 25 метров.
Скрипт написан на скорую руку, лишь бы работало!
Да, использую библиотеку CDom. https://github.com/amal/CDom . Лень было писать свой парсер.

 

 require_once __DIR__ . '/CDom-master/CDom.php';
 
$matches = array();
$myfile = fopen("links.txt", "w");
 
$i = 100;
$link = '';
$handle = fopen(__DIR__ . '/8bit_full.html', "r");
if ($handle) {
  while (($line = fgets($handle)) !== false) {
 
    if (strpos($line,'<input id="audio_info')>0){
      $dom  = CDom::fromString($line);          
      $inp = $dom->find('input');
      list($url,$querystring) = explode('?', $inp->value, 2);
    }   
      
    if (strpos($line, 'title_wrap fl_l')){
      $dom  = CDom::fromString($line);
      $link .= $url . ' ';
      $artist = $dom->find('.title_wrap a');
      $title = $dom->find('span.title');
      $link .= $artist->text() . '/' . $artist->text().' - '.$title->text().'.mp3';
      fwrite($myfile, $link . "\n");
      $link = '';
    }
  }
  fclose($handle);
}
 
fwrite($myfile, '');
fclose($myfile);

 

Скрипт читает сохраненный html и сохраняет пару url file в файл.

Дальше решил сделать с помощью bash

 

#!/bin/sh

while read url file; do
 while [[ "$(pgrep -fc wget)" -gt 9 && $c -gt 10 ]]; do sleep 1; done; 
 ((c++));  
 echo "Launching $url ($c)";
 mkdir -p "${file%/*}"
 wget -c -O "$file" "$url" >/dev/null 2>&1 && echo "$c finsihed" & 
 #wget --post-data="$post" $url >/dev/null 2>&1 && echo "$c finsihed" & 
done < links.txt

 

В этом скрипте я параллельно запускаю по 10 закачек. Распарареливание с помощью wget  в действии!!
Итого с сообщества 8битной музыки https://vk.com/e_music_8bit было сграблено 3437 треков.

Решение кастомной и не претендует на универсальность. Писал же для себя)