下载百度排行榜音乐的程序(Perl)

这是一个使用Perl编写的脚本,用于下载百度音乐排行榜上的歌曲。脚本从配置文件中读取任务列表,包括top100和top500榜单,并通过多线程方式下载音乐文件到指定路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载百度排行榜音乐的程序(Perl)

#!/usr/bin/perl
use FindBin '$Bin';
use URI::Escape;
use lib $Bin;
use lib "$Bin/../conf/";
use Conf;

my %g_conf = 
(
 task => 
 {

 top100 => 
 {
 list => "/data/share/code/trunk/perl/get_baidu_mp3/conf/top100_xml.txt",
 store_path => "/data/share/code/trunk/perl/get_baidu_mp3/music/top100/",
 },

 top500 => 
 {
 list => "/data/share/code/trunk/perl/get_baidu_mp3/conf/top500_xml.txt",
 store_path => "/data/share/code/trunk/perl/get_baidu_mp3/music/top500/",
 },

 },

 download_thread_cnt => 20,
 );

sub init {
	foreach my $key (keys %{$g_conf{'task'}})
	{ 
		my $store_path = $g_conf{'task'}{$key}{'store_path'};
		`mkdir -p $store_path`;
	}
}

sub main {
	init();	
	foreach my $key (keys %{$g_conf{'task'}})
	{ 
#step 1: get list
		my $html = $g_conf{'task'}{$key}{'list'};
		open FV,$html;
		my @line_arr = <FV>;
		my $contents = join ("\n", @line_arr);
		my @idx;
		my $title;
		while ($contents =~ /\<data\>\<id\>(\d+)\<\/id\>\<name\>(\S+)\<\/name\>/g ) 
		{
			push @idx, $1;
			push @title, $2;
		}

#step 2: download
		my $download_thread_cnt = $g_conf{'download_thread_cnt'};
		my @download_cmd = ();
		foreach my $i (1 .. scalar(@idx))
		{
			my $index = $idx[$i];
			my $title = $title[$i];
			my $down_url;
			my $down_name;
			my ($song,$art);
			if ($title =~ /(\S+)\$\$(\S+)\$\$\$\$/) {
				$song = $1;
				$art = $2;
			}
			$down_name = $g_conf{'task'}{$key}{'store_path'} . $art . "_" . $song . ".mp3";
			my $url = "http://box.zhangmen.baidu.com/x?op=12&count=1&mtype=1&title=$song\\\$\\\$$art\\\$\\\$\\\$\\\$&url=";
			my $xml = `curl "$url"`;
			if ($xml =~ /\<p2p\><hash>(\w+)<\/hash\>\<url\>\<\!\[CDATA\[(\S+)\]\]\>/) {
				$down_url = $2;
				if (length($down_url) < 10) {
					next;
				}
				#print "$download_cmd\n";
				push @download_cmd, "wget -nv  \"$down_url\" -O \"$down_name\"";
			}
			if ($i % $download_thread_cnt == 0 or $i == scalar(@idx)) {
				my $real_proc_cnt = scalar(@download_cmd);
				foreach my $do_key (@download_cmd) {
					my $pid = fork();
					if ($pid == 0)
					{
						system($do_key);
						#print $do_key, "\n";
						exit 0;
					}
				} 
				while ($real_proc_cnt >0) 
				{
					wait();
					$real_proc_cnt --;
				}
				@download_cmd = ();
			}
		}
	}

}

main();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值