免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3696 | 回复: 8

一个带cookie 的下载 请求问题 [复制链接]

论坛徽章:
0
发表于 2010-06-19 21:30 |显示全部楼层
初学者的疑问
我想用perl 来批量下载和讯音乐,音乐的url已经得到。不过和讯的音乐下载必须要在get请求中带有cookie。看了perl&lwp 的相关内容,于是照着写了下。可是cookie并没有提交成功啊。望高人给点拨一下。
  1. use LWP::UserAgent;
  2. use HTTP::Cookies::Netscape;
  3. my $url=$ARGV[0];
  4. open(FH,">c:/a.mp3");
  5. $cookie=HTTP::Cookies::Netscape->new('file'=>'C:/Documents and Settings/Administrator/Cookies/administrator@hexun[1].txt');
  6. my $browser=LWP::UserAgent->new;
  7. $browser->agent("mozilla/4.76");
  8. $browser->cookie_jar($cookie);
  9. my $ua=$browser->get($url);
  10. my $resp=$ua->content;
  11. print FH $resp;
  12. close($file);
复制代码

论坛徽章:
0
发表于 2010-07-03 22:23 |显示全部楼层
经过分析和讯的网页信息,和讯是通过COOKIE防止非法外链,而真正影响音乐文件下载的COOLIE是由SetPlayState.js脚本生成的,原代码如下:
  1. //设置播放状态Cookie值。
  2. function SetPlayState()
  3. {
  4.         var cookieName = "HEXUN_COM_MEDIA_PLAYSTATE";
  5.         var curCookie = cookieName + "=1;path=/;domain=hexun.com";
  6.         document.cookie = curCookie;
  7. }
  8. SetPlayState();
复制代码
那么在下载音乐文件的时候,需要在HTTP请求中加入这个COOKIE。

以ID号为5692541音乐为例:
它的播放网页为:
http://fangchuanqian.music.hexun.com/M5692541.html

经分析网页代码,它的网页播放器链接为:
http://music.hexun.com/PlayMedia ... 692541&FileUrl=

再分析能发现,真正生成MP3实际下载地址的链接为:
http://homemusic.tool.hexun.com/ ... 692541&FileUrl=

向“http://homemusic.tool.hexun.com/ ... 692541&FileUrl=”发送请求,并在请求中加入COOKIE信息,即可正常下载音乐文件。

写了一个简单的按音乐的ID号下载的代码:
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use LWP::UserAgent;
  5. use LWP::ConnCache;
  6. local $| =1;

  7. my @mp3_ID = ('5692541','5597643');

  8. my $ua = LWP::UserAgent->new;
  9. my $conncache = new LWP::ConnCache;
  10. $ua->conn_cache($conncache);
  11. my @head = ('Cookie'=>'HEXUN_COM_MEDIA_PLAYSTATE=1'); #将COOLIE加入GET请求头

  12. print "\n Download begin ...\n\n";
  13. foreach my $id (@mp3_ID) {
  14.         my $res1 = $ua->get("http://homemusic.tool.hexun.com/PM.aspx?CID=1&MID=$id&FileUrl=");
  15.         my $html = $res1->as_string;
  16.         if ($html =~ /欢迎访问.*?和讯音乐个人门户/) {
  17.                 print "ID $id is error!\n";
  18.         }
  19.         else {
  20.                  my ($mp3_url) = ($html =~ /A HREF="(.*?)"/i);
  21.                  print " Downloading $id.mp3 ... ";
  22.                  my $res2 = $ua->get($mp3_url,@head);
  23.                  if ($res2->is_success) {
  24.                           open(my $fp, ">:raw", "$id.mp3");
  25.                           print $fp $res2->content;
  26.                           close $fp;
  27.                           print "OK\n";
  28.                  }
  29.                  else { print "Failed!\n"; }
  30.         }
  31. }
  32. print "\n All downloaded!\7";
  33. <STDIN>;
复制代码
可以通过从和讯的网页中批量提取音乐ID,加入@mp3_ID中,以实现批量下载。

论坛徽章:
0
发表于 2010-07-04 00:14 |显示全部楼层
回复 2# iamlimeng


    学习,感觉楼上对网页抓取很有经验~

论坛徽章:
0
发表于 2010-07-04 09:33 |显示全部楼层
回复 3# x9x9


    以前经常写CGI,所以比较熟悉。

论坛徽章:
0
发表于 2010-07-04 13:03 |显示全部楼层
遇到高人了, 学习经验了。

论坛徽章:
0
发表于 2010-07-04 19:33 |显示全部楼层
回复 2# iamlimeng


    非常感谢啊,刚用perl不久,之前用来批量抓取页面提取音乐ID的时候,也不知道用个LWP::conncache。5000多个URL,用来一个多小时,而且失败的情况也占四分之一。

论坛徽章:
0
发表于 2010-07-04 19:36 |显示全部楼层
回复 2# iamlimeng


    还有一个问题,我下载音乐的时候,可以使用什么办法来同时下载多个音乐呢,用Threads模块可以实现么?

论坛徽章:
0
发表于 2010-07-04 23:30 |显示全部楼层

论坛徽章:
0
发表于 2010-07-06 20:03 |显示全部楼层
回复 8# iamlimeng


    再次感谢iamlimeng 的帮助,音乐可以全部下载了,正在downlloading,目前已经2个多G了,呵呵。有喜欢轻音乐和怀旧影视配乐的可以找我要啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP