用Flex实现网页自动登录和文件抓取

Posted on June 6, 2012

六维空间是个下载电影的好地方。各种外面无法下载到的新的旧的电影都能下载到,并且还都用MiniSD这种高性价比的压缩格式封装的。非常适合收藏。但是必须要有IPV6网络和六维的账号才能下载。好了,不帮他们打广告了,下面进入正题。六维电影板块有几个索引贴,收集了评分最高的几百部电影,比如IMDB Top250,豆瓣Top250,历届奥斯卡最佳影片等,里面链接到每个电影的对应帖页面。要下载全的话,就必须要一个个页面点进去下载种子,这显然不符合程序员一切都要偷懒的原则。所以我决定花一点时间写个种子批量抓取工具:自动登录六维,分析索引页面,提取所有电影页面链接,再分析每个电影页面,下载种子到本地。

要想抓取网页,首先就必须要保持登录状态才行。否则你去请求对应的电影页面,返回的都是请你登录的页面,什么都抓取不到。网站一般都是通过浏览器的Cookie来保持登录状态的。而在AIR中,正好有独立的Cookie栈,跟浏览器的一致。同样可以保持登录状态。所以只要考虑怎么登录就行了。一旦登录成功了,在程序未关闭前,AIR的Cookie都会让你保持着登录状态。登录的过程就是发起一个http的post请求,把你的账号和密码发送到它的指定接口。一般网站还需要其他参数,来做验证用的。参数列表,和登录接口url都可以用FireFox的HTTPFox插件抓包来查看到。比较简单就不说了。获取到参数列表后发现,除了用户名和密码还有一些参数是跟Cookie有关的,不知道服务器端是怎么计算生成的,不过没关系,既然是从登录界面发送出去的参数,那在登录界面的表单里就一定写好了这些参数的值,先抓取下登录界面,提取参数值,再结合自己的用户名密码构造一个合法的参数列表就行了。按照这个思路测试了一遍,登录成功。

一般抓取网页都用PHP,Python之类的服务器脚本语言,其实用Flex也可以的。原理相同,用HTTPService或URLLoader发起一个HTTP请求,返回HTML网页的源代码。然后通过字符串匹配的方式,分析源代码,提取需要用到的连接。写起来都很简单,主要是要预先在网页里分析好要提取的链接的规律。尽可能找到最简单的规律。比如索引页面里,有部分电影都不止链接了一个页面,分别有1080P和MiniSD的版本,但我们只要MiniSD的版本。观察下就发现了,每部电影的MiniSD版本的超链接文字上一定都会含有关键字MiniSD,那就循环查找这个关键字的位置,并在它附近查找节点,页面链接地址就提出出来了。接着就是用获取的电影页面链接列表,一个个去请求html源码,继续分析单个页面。还是找关键字那个办法,每个页面里种子下载的超链接文字必然含有”.torrent”关键字。直接查找这个关键字的位置,获取下载地址即可。最后就得到了所有种子的下载地址了。写个队列下载的类,用二进制方式把他们都download到本地,搞定!

下面上图:

六维电影合集种子批量抓取工具

安装程序和工程代码也共享一下吧:

下载地址