抓取网页中的视频 url

196 views
Skip to first unread message

flyer

unread,
Mar 23, 2012, 6:03:43 AM3/23/12
to 西电开源社区邮件列表
有个朋友问如何从 html 文件中抓取所有的 url 地址,有些网页中有视频链接,但若直接从该网页的 html 文件中提取视频的 url ,好像不太可能。下面是她的问题,请大家帮忙指指方向:

视频地址并不会直接写在网页的html文件中,我想会不会需要解析html中的脚本文件才能得到这些动态url,或者仅仅解析脚本还不够,还需要与服务器交互?还有,怎样解析网页中的脚本呢?用SpiderMonkey吗(我现在用的是C语言)? 

--
宠辱不惊,闲看庭前花开花落;去留无意,漫随天边云卷云舒。


Sean Lee

unread,
Mar 23, 2012, 6:35:41 AM3/23/12
to xidian...@googlegroups.com
我也蛮好奇如何抓取, 不过可以看看youtube-dl的代码
--
您收到此邮件是因为您订阅了 “西电开源社区” 邮件列表。
要向此邮件列表发帖,请发送电子邮件至 xidian...@googlegroups.com
要取消订阅,请发送电子邮件至 xidian_linux...@googlegroups.com
请通过 https://groups.google.com/group/xidian_linux?hl=zh-CN 访问此网上论坛。
通过 教育网: http://xdlinux.info/ (ipv6 enabled)
教育网及外网:http://linux.xidian.edu.cn/ (ipv4)
手机:http://m.xdlinux.info/
访问西电开源社区。



--
Best regards,
Sean Lee

吕宗庭

unread,
Mar 23, 2012, 6:39:19 AM3/23/12
to xidian...@googlegroups.com
我过去的做法是   

用perl 里面的 Mechanize   里面有submit 这个工具 用这个工具跟网页进行交互 然后 get 结果最后 follow_link 解决重新定向问题。这个方法好像只能针对一个特定的网站,不是什么通用的方法。

但是好像他的问题更广泛一些。 

在 2012年3月23日星期五,flyer 写道:

吕宗庭

unread,
Mar 23, 2012, 6:42:28 AM3/23/12
to xidian...@googlegroups.com
好像我记得是这样的,youtube视频所在的地址和他的网址是相关的,通过对网址的解码就能得到视频的真正的地址。不需要执行网页中的脚本。

flyer

unread,
Mar 23, 2012, 9:35:31 AM3/23/12
to xidian...@googlegroups.com
刚才看了看优酷和土豆网页的 html 文件,没有直接的 视频 url,而是直接指向一个网页,不知视频是如何嵌入到网页的?如果知道视频是如何嵌入到网页中,那么应该知道怎么分析 html 文件中视频文件的标签。

2012/3/23 吕宗庭 <lvzon...@gmail.com>



--
宠辱不惊,闲看庭前花开花落;去留无意,漫随天边云卷云舒。


Justin Wong

unread,
Mar 23, 2012, 9:37:25 AM3/23/12
to xidian...@googlegroups.com
优酷和土豆都是用flash的,一个embed标签
Open Source,Open Mind

Blog:    http://bigeagle.me/
E-mail:  bige...@xdlinux.info

flyer

unread,
Mar 23, 2012, 9:44:42 AM3/23/12
to xidian...@googlegroups.com
嗯,刚才又看了下,不过在优酷中看的 html 文件中,是用 js 代码来引用视频文件。在下面是引用的其中一段与打开的视频相关的 js 代码。有没有方法可以从 html 文件中直接提取出该视频的 url 代码?

<script type="text/javascript">
// the Youku object
var Youku = (Youku || {});
// configurable variables
Youku._IsHtml5 = (Youku._IsHtml5 || false);
Youku._Player = "http://static.youku.com/v/swf/qplayer.swf";
Youku._LivePlayer = "http://static.youku.com/v/swf/livePlayer.swf";
Youku._ApiPlayer = "http://player.youku.com/player.php";
Youku._ExpressInstall = "http://events.youku.com/global/flashes/expressInstall.swf";
Youku._VideoThumb = "http://events.youku.com/global/api/video-thumb.php";
// load the Youku Player
Youku.loadLivePlayer = function(channel, divName, playerWidth, playerHeight) {
channel = (channel || "101");
divName = (divName || "live_player");
playerWidth = (playerWidth || 600);
playerHeight = (playerHeight || 450);
var flashPlayerDiv = "flash_live_player_" + String(Math.random()).substr(2, 5);
var hId = document.getElementById(divName);
//alert(hId.innerHTML);
hId.innerHTML=('<div id="' + flashPlayerDiv + '"></div>');
var flashParams = {"quality": "high", "allowScriptAccess": "always", "allowFullScreen": "true", "bgcolor": "#000000"};
var flashVars = {"reconnects": 3, "channel": channel, "autoplay": 1, "showfrontad": 0, "dragback": 0};
swfobject.embedSWF(Youku._LivePlayer, flashPlayerDiv, playerWidth, playerHeight, "9.0.0", Youku._ExpressInstall, flashVars, flashParams);
};
Youku.loadPlayer = function(videoId, divName, playerWidth, playerHeight, autoPlay, imgLogo, fullToolbar) {
videoId = (videoId || "");
divName = (divName || "youku_player");
playerWidth = (playerWidth || 400);
playerHeight = (playerHeight || 315);
autoPlay = (autoPlay ? "true" : "false");
imgLogo = (imgLogo || "");
fullToolbar = (fullToolbar ? true : true);
var flashPlayerDiv = "flash_youku_player_" + String(Math.random()).substr(2, 5);
var hId = document.getElementById(divName);
hId.innerHTML=('<div id="' + flashPlayerDiv + '"></div>');
var flashParams = {"quality": "high", "allowScriptAccess": "always", "allowFullScreen": "true", "bgcolor": "#FFFFFF", "wmode": "transparent"};
var flashVars = {"winType": "index", "isShowRelatedVideo": "false", "isAutoPlay": autoPlay, "isLoop": "false", "UserID": "0", "VideoIDS": videoId};
if (imgLogo != "") { flashVars.imglogo = imgLogo; }
if (fullToolbar) { flashVars.winType = "interior"; }
swfobject.embedSWF(Youku._Player, flashPlayerDiv, playerWidth, playerHeight, "9.0.0", Youku._ExpressInstall, flashVars, flashParams);
};
Youku.loadFullPlayer = function(videoId, divName, playerWidth, playerHeight, autoPlay, imgLogo) {
playerWidth = (playerWidth || 400);
playerHeight = (playerHeight || 340);
Youku.loadPlayer(videoId, divName, playerWidth, playerHeight, autoPlay, imgLogo, true);
};
if((/(iPhone|iPad|iPod)/i.test(navigator.userAgent))){
//var a = '<a href="http://v.youku.com/v_show/id_XMzY5NzcxOTI4.html" target="_blank"><img src="http://res.mfs.ykimg.com/051000004F61A5C097927308FA0D4E36.jpg" /></a>';
var a = '<a href="http://v.youku.com/v_show/id_XMzY5NzcxOTI4.html" target="_blank"><img src="http://res.mfs.ykimg.com/051000004F61A5C097927308FA0D4E36.jpg" /></a>';
var player = document.getElementById("player");
player.innerHTML=a;
}else{
Youku.loadPlayer ("XMzY5NzcxOTI4", "player", 580, 367, true);
}
</script>

2012/3/23 Justin Wong <bige...@xdlinux.info>

Justin Wong

unread,
Mar 23, 2012, 9:46:59 AM3/23/12
to xidian...@googlegroups.com
HTML里是没有任何视频信息的,只能模拟浏览器交互的过程,从缓存里截获

当然也可以破解视频网站的url编码,直接下载

Justin Wong

unread,
Mar 23, 2012, 9:47:35 AM3/23/12
to xidian...@googlegroups.com
抓包分析能搞出来

flyer

unread,
Mar 23, 2012, 9:54:11 AM3/23/12
to xidian...@googlegroups.com
我一会儿试试抓包分析下 :)

这个朋友的主要目的还是想把网页中的所有 url 抓取到,单分析 html 文件是不行,因为有些链接得触发脚本中的事件才行,我学习 web 开发还没接触到通过自己写的脚本来触发网页中的事件,请大家提供一个思路,通过脚本自动触发网页中的事件。
如果这样可以做到,那么可以在触发每个事件前后抓取 html 文件来抽取其中的 url 。

2012/3/23 Justin Wong <bige...@xdlinux.info>

吕宗庭

unread,
Mar 23, 2012, 10:01:39 AM3/23/12
to xidian...@googlegroups.com
刚才看了一下cookie里面有ysuid 和 playlisttag [{"videoid":"80381034","showid":"19944","vidEncoded":"XMzIxNTI0MTM2","stage":"6"},{"videoid":"73020987","sec":3895}]

  根据这里面 信息可以构造类访问地址  然后通过一个重定向 就得到视频片段了。好像是大小不一呀,有4M的还有12M左右的。

刚才说的那个perl 可以触发网页内的各种事件,你可以尝试一下。 



在 2012年3月23日星期五,flyer 写道:
--

flyer

unread,
Mar 23, 2012, 10:15:29 AM3/23/12
to xidian...@googlegroups.com
嗯。我先看下 C\C++、Python、PHP 中有没有类似的方法,工作中主要用这些,相对熟练些,找不到合适的方法后我学下 Perl,以后做个性化推荐,用 Perl 分析数据或许会有更大的帮助 :)

2012/3/23 吕宗庭 <lvzon...@gmail.com>

Justin Wong

unread,
Mar 23, 2012, 10:19:42 AM3/23/12
to xidian...@googlegroups.com
要做个性化推荐什么的话,http://somemory.com/myblog/ 这里会有很多你需要的东西

Sean Lee

unread,
Mar 23, 2012, 10:23:27 AM3/23/12
to xidian...@googlegroups.com
也有python的mechanize哦:)
Best regards,
Sean Lee

flyer

unread,
Mar 23, 2012, 10:26:00 AM3/23/12
to xidian...@googlegroups.com
B 哥真强!那个博客真棒,够学一阵子了。我试玩抓包后就试下小松找到的那个 ^_^


2012/3/23 Sean Lee <isea...@gmail.com>

南柯子

unread,
Mar 23, 2012, 10:44:44 AM3/23/12
to xidian...@googlegroups.com
上面优酷中的视频加密后的ID是XMzY5NzcxOTI4吧?wordpress有个插件lightview plus从youtube中向博客中插入视频貌似用就是截获视频加密后的ID。
--
   Best to you! Turing.

flyer

unread,
Mar 23, 2012, 11:15:31 AM3/23/12
to xidian...@googlegroups.com
Mechanize 有 python 和 ruby 版本的,从 github 上可以找到,而且源码中还有几个例子 :)

2012/3/23 南柯子 <mkzmkz...@gmail.com>

--
您收到此邮件是因为您订阅了 “西电开源社区” 邮件列表。
要向此邮件列表发帖,请发送电子邮件至 xidian...@googlegroups.com
要取消订阅,请发送电子邮件至 xidian_linux...@googlegroups.com
请通过 https://groups.google.com/group/xidian_linux?hl=zh-CN 访问此网上论坛。
通过 教育网: http://xdlinux.info/ (ipv6 enabled)
教育网及外网:http://linux.xidian.edu.cn/ (ipv4)
手机:http://m.xdlinux.info/
访问西电开源社区。

Li Yinfeng

unread,
Mar 23, 2012, 2:36:20 PM3/23/12
to xidian_linux
flyer,你好!
 
  最近由于讲课需要,下载视频比较多 特别是flv的
我的方法是人工的
1、用傲游浏览器的 工具菜单里面的网页嗅探器 可以轻松给出真实的视频下载地址
   非常有用 可以直接用傲游下载,如果傲游直接不能下载 把链接复制到 浏览器中直接用浏览器另存就可以
 
2、用http://www.flvxz.com/  分析flv的真实地址
 
3、用其他一些flv下载工具
 
   程序的方法我不会
   视频地址都是经过伪装 变换 的 分析HTML代码一般是看不到的。
 

        致
礼!

              Li Yinfeng
                          yf...@mail.xidian.edu.cn
                 2012-03-24
 
======== 2012-03-23 18:04:07 你在来信中写道: ========
 
--
您收到此邮件是因为您订阅了 “西电开源社区” 邮件列表。
要向此邮件列表发帖,请发送电子邮件至 xidian...@googlegroups.com
要取消订阅,请发送电子邮件至 xidian_linux...@googlegroups.com
请通过 https://groups.google.com/group/xidian_linux?hl=zh-CN 访问此网上论坛。
通过 教育网: http://xdlinux.info/ (ipv6 enabled)
教育网及外网:http://linux.xidian.edu.cn/ (ipv4)
手机:http://m.xdlinux.info/
访问西电开源社区。

= = = = = = = = = = = = = = = = = = = = = =

Justin Wong

unread,
Mar 23, 2012, 6:51:53 PM3/23/12
to xidian...@googlegroups.com

话说一直挺想知道傲游浏览器是怎么搞定flv的

send from android

闫林

unread,
Mar 23, 2012, 9:06:42 PM3/23/12
to xidian...@googlegroups.com
火狐的flashgot也很好用。

Justin Wong

unread,
Mar 23, 2012, 9:34:08 PM3/23/12
to xidian...@googlegroups.com

down them all 也可以

跑题了跑题了 楼主想问的是原理啊

send from android

flyer

unread,
Mar 24, 2012, 2:26:19 AM3/24/12
to xidian...@googlegroups.com
嗯,谢谢!这样下载的话得手动进行,现在是想自动化分析处理,人工的话有些不太不便于连续处理……

2012/3/24 Justin Wong <bige...@xdlinux.info>



--
宠辱不惊,闲看庭前花开花落;去留无意,漫随天边云卷云舒。


Li Yinfeng

unread,
Mar 24, 2012, 2:40:25 PM3/24/12
to xidian_linux
Justin Wong,你好!
 
  可能是分析了数据包 发送的HTTP请求 带 .flv的 URL吧  嗅探都是分析数据包了 比较底层了。
 
 

        致
礼!

              Li Yinfeng
                          yf...@mail.xidian.edu.cn
                 2012-03-25
 
======== 2012-03-24 06:52:19 你在来信中写道: ========

王锐

unread,
Mar 25, 2012, 4:09:39 AM3/25/12
to xidian...@googlegroups.com
查看网页源代码会看到一个大约100来k的swf文件,那个就是内嵌的播放器,如果要下载视频的话,ff可以装一个netvideohunter,很好用。

Zombie

unread,
Mar 27, 2012, 7:23:42 AM3/27/12
to xidian...@googlegroups.com
flvxz.com +1
我也是一直用这个网站,现在Youku和土豆的视频有的还有好几种分辨率,输入一个地址在flxz.com上就可以得到所有分辨率的视频地址,基本上可以确定简单的通过分析html获得视频地址的可能性不大。。。以前最常用的就是直接拷缓存,在 X:\Users\USER_NAME\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\里能找到,感觉维棠FLV下载器基本上就是这样,先下载再合并。
另外,在Chrome的缓存里直接发现了这个:
http://f.youku.com/player/getFlvPath/sid/133284604637113718303_00/st/mp4/fileid/03000801004F70A3411ADC009500885571FCCB-54EA-039F-D698-D3BCFEF98B66?K=3636a0a1a4bb58bc28278b9d&hd=1&myp=0&ts=105
HTTP/1.1 302 Found
Expires: -1
Cache-Control: private, max-age=0
Pragma: no-cache
Location: http://61.158.246.49/youku/6976B548EE0388235D9B344835/03000801004F70A3411ADC009500885571FCCB-54EA-039F-D698-D3BCFEF98B66.mp4
Content-type: text/html
Content-Length: 0
Date: Tue, 27 Mar 2012 11:00:40 GMT
Server: F_LIGHTY_TJ6

00000000:  7a  01  00  00  02  08  00  00  f7  01  b2  af  cd  1a  2e  00  z...............
00000010:  af  8a  b2  af  cd  1a  2e  00  3d  01  00  00  48  54  54  50  ........=...HTTP
00000020:  2f  31  2e  31  20  33  30  32  20  46  6f  75  6e  64  00  45  /1.1 302 Found.E
00000030:  78  70  69  72  65  73  3a  20  2d  31  00  43  61  63  68  65  xpires: -1.Cache
00000040:  2d  43  6f  6e  74  72  6f  6c  3a  20  70  72  69  76  61  74  -Control: privat
00000050:  65  2c  20  6d  61  78  2d  61  67  65  3d  30  00  50  72  61  e, max-age=0.Pra
00000060:  67  6d  61  3a  20  6e  6f  2d  63  61  63  68  65  00  4c  6f  gma: no-cache.Lo
00000070:  63  61  74  69  6f  6e  3a  20  68  74  74  70  3a  2f  2f  36  cation: http://6
00000080:  31  2e  31  35  38  2e  32  34  36  2e  34  39  2f  79  6f  75  1.158.246.49/you
00000090:  6b  75  2f  36  39  37  36  42  35  34  38  45  45  30  33  38  ku/6976B548EE038
000000a0:  38  32  33  35  44  39  42  33  34  34  38  33  35  2f  30  33  8235D9B344835/03
000000b0:  30  30  30  38  30  31  30  30  34  46  37  30  41  33  34  31  000801004F70A341
000000c0:  31  41  44  43  30  30  39  35  30  30  38  38  35  35  37  31  1ADC009500885571
000000d0:  46  43  43  42  2d  35  34  45  41  2d  30  33  39  46  2d  44  FCCB-54EA-039F-D
000000e0:  36  39  38  2d  44  33  42  43  46  45  46  39  38  42  36  36  698-D3BCFEF98B66
000000f0:  2e  6d  70  34  00  43  6f  6e  74  65  6e  74  2d  74  79  70  .mp4.Content-typ
00000100:  65  3a  20  74  65  78  74  2f  68  74  6d  6c  00  43  6f  6e  e: text/html.Con
00000110:  74  65  6e  74  2d  4c  65  6e  67  74  68  3a  20  30  00  44  tent-Length: 0.D
00000120:  61  74  65  3a  20  54  75  65  2c  20  32  37  20  4d  61  72  ate: Tue, 27 Mar
00000130:  20  32  30  31  32  20  31  31  3a  30  30  3a  34  30  20  47   2012 11:00:40 G
00000140:  4d  54  00  53  65  72  76  65  72  3a  20  46  5f  4c  49  47  MT.Server: F_LIG
00000150:  48  54  59  5f  54  4a  36  00  00  00  00  00  6a  0f  c7  a5  HTY_TJ6.....j...
00000160:  4c  46  9f  d5  1b  3d  cb  a1  c9  25  b7  75  0c  00  00  00  LF...=...%.u....
00000170:  36  30  2e  32  38  2e  31  32  36  2e  33  36  50  00          60.28.126.36P.


直接给出了视频地址,也就是说视频连接以后可以在缓存里找到下载地址,这算不算一种思路?干脆分析一下视频网站发来的数据,找到含有视频地址的文件?
让大家见笑了。。。不要太批评小弟啊。。。

flyer

unread,
Mar 27, 2012, 10:31:57 AM3/27/12
to xidian...@googlegroups.com
看到你贴出的缓存,直接从 HTTP 应答中可以获得视频的 url,那么也就可以构造某种格式的 HTTP 请求来获得这样的应答。
一个问题是,从哪里找到那个 HTTP 应答文件?我在我的系统上找不到。我的是 Slackware Linux,chrome 的缓存位置是 ~/.config/google-chrome/Default ,但这里的文件基本上都是保存在 sqlite 中的数据,找不到如你贴出来 HTTP 应答信息……

On Tue, Mar 27, 2012 at 7:23 PM, Zombie <cnz...@gmail.com> wrote:
flvxz.com +1
我也是一直用这个网站,现在Youku和土豆的视频有的还有好几种分辨率,输入一个地址在flxz.com上就可以得到所有分辨率的视频地址,基本上可以确定简单的通过分析html获得视频地址的可能性不大。。。以前最常用的就是直接拷缓存,在 X:\Users\USER_NAME\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\里能找到,感觉维棠FLV下载器基本上就是这样,先下载再合并。
另外,在Chrome的缓存里直接发现了这个:

Sean Lee

unread,
Mar 27, 2012, 9:50:09 PM3/27/12
to xidian...@googlegroups.com
没人研究youtube-dl吗 - -有时间我想看看
Best regards,
Sean Lee

Zombie

unread,
Mar 28, 2012, 11:26:14 AM3/28/12
to xidian...@googlegroups.com
由于Chrome的Sandbox设计,我们是没有办法直接从文件系统得到Chrome的缓存的。Chrome提供了一种办法,就是使用chrome://cache查看缓存。

Zombie

unread,
Mar 28, 2012, 11:29:18 AM3/28/12
to xidian...@googlegroups.com
4721 lines 。。。给跪。。。

flyer

unread,
Mar 28, 2012, 11:34:34 AM3/28/12
to xidian...@googlegroups.com
  从 chrome cache 中获得很多信息,试试如何编程来实现从中提取 :)
328.png

Sean Lee

unread,
Mar 29, 2012, 1:20:34 AM3/29/12
to xidian...@googlegroups.com
好像这么长是因为他还写了很多subclass来支持其他视频网站?

On Wed, Mar 28, 2012 at 11:29 PM, Zombie <cnz...@gmail.com> wrote:

Zombie

unread,
Mar 30, 2012, 1:01:55 AM3/30/12
to xidian...@googlegroups.com
貌似真的是啊
Reply all
Reply to author
Forward
0 new messages