zxmh.net 的漫画下载
关于那个批量下载漫画的工具,最近还在继续完善,这些天有些进展,又有些失望。
最大的打击就是在网上找到了一个已经写的很好的同类工具了,叫MangaDowner(http://www.tortinita.org/),已经更新到5.2了,看来作者还是很努力的。
早知道有这个工具的话,我才不去自己写呢,试用了一下发现很好用。他的思路大概和我的差不多,都是先取得章节URL,然后获得/计算出图片URL列表。而且那位叫tortinita的仁兄多写了一个导出功能,这样就可以用成熟的下载工具来下载图片了。在此之前我一直还在为断线重传和多线程下载的不稳定而烦恼,想不到windows下面也有这么好的办法——虽然没有shell中的wget可以调用,但是flashget和迅雷都是可以导入下载列表的。不过这样也有一点不好,漫画每一话的目录需要自己建立(引用也需要自己填写),稍微麻烦了一点(这也暴露了windows下面工具结合不够好的弱点),我打算写一个调用wget下载的功能,这样,处理起来安逸些。
于是,偷懒的解决了大问题。^_^
这个MangaDowner似乎不提供源码,所以用的人也没办法自己添加可用网站。
逛了一下作者的blog,然后发现,对于www.zxmh.net这个网站的漫画,MangaDowner只能获取列表,而不能把图片地址正确的得到。而这个网站正是我最先想要处理的,由于当时没搞明白他是怎么做的,就拿了个别的HTML处理图片的网站来开刀。
断断续续看了好些时候,吃过晚饭后终于把问题初步解决了。下面是我对www.zxmh.net的分析过程。
首先打开html源码一看……哇,好干净,就几个table,外加些许js链接。
那些链接指向的js,都无法直接访问,没关系,ff中有缓存呐,访问过页面后,再打开一个标签填上地址,这样就能看到js的内容了。但是有好多个js,而javascripts是我第二讨厌的东西(第一是他叔叔java),看起来真是痛苦。更可气的是这个站点把好好的js切的四分五裂,中间还有个硕大无比的unicodetoansi表。
稍微动点鼠标获得了一张图片的地址,可是无法访问,用flashget试了一下居然不能下载,写了段python添加referer也没用(本来flashge就有这功能的),该死,难道用了什么YD的手段。我也算是做过一些web程序了,看到返回的值不是404,而是IIS的错误警告,很明显有防盗链的作用,这种站点不会用太高级的东西吧,于是又试了N个不同的referer,无用,甚至连那些js都无法获取。
无奈中看到url中有个带?p=xx的尾巴,该不会用了点server端脚本吧,检查了一下站点cookies,好家伙,一大把cookies。找了半天没发现这些东西中有什么玄机。ie的cookies也看了,没啥区别。
中途还陪爸妈玩了几小时牌,用一种很长条的牌玩的,我们这儿叫“乱错”。
然后把ff缓存中得到的js代码提了出来,凑了个html页面,倒是真的能从那些datas[n]="xxxx"中找出hostname和path来。可是就是无法访问,狗日的怎么搞的啊,再看了遍js代码,的确没什么高级玩意儿,就一个很弱的解码,然后操作了一下dom,最有技术含量的地方就是预处理了下一页的图片。
唉,只有抓包了,下了一个ethereal,抓了一下,包虽然不是很多,可是我这个版本的ethereal有个bug,不能导出txt文件(由此建议各位不要因为sourceforge速度不快就在什么xx软件园下东西),可把我给找坏了。在一大群qihoo,baidu和擦边球的漫画网站广告中找到了那几个js和图片的包,一看header,气得要吐血。龟儿子引用页面就是每一话的url,而我由于粗心把带?p=xx的填了进去而不能下(后来又随便试了几个更差得远的)。
好啦好啦,这下没问题了。(白费两小时啊)
然后把那段解码的js几乎是照着搬过来用python涂了一下,测试通过。为了偷懒还把unicode编码转换那部分省略了,反正我看这网站也没什么汉字URL。
如果明天后天没有同学会的话,就把这个网站的下载写好。
贴一下我的编码代码:
最大的打击就是在网上找到了一个已经写的很好的同类工具了,叫MangaDowner(http://www.tortinita.org/),已经更新到5.2了,看来作者还是很努力的。
早知道有这个工具的话,我才不去自己写呢,试用了一下发现很好用。他的思路大概和我的差不多,都是先取得章节URL,然后获得/计算出图片URL列表。而且那位叫tortinita的仁兄多写了一个导出功能,这样就可以用成熟的下载工具来下载图片了。在此之前我一直还在为断线重传和多线程下载的不稳定而烦恼,想不到windows下面也有这么好的办法——虽然没有shell中的wget可以调用,但是flashget和迅雷都是可以导入下载列表的。不过这样也有一点不好,漫画每一话的目录需要自己建立(引用也需要自己填写),稍微麻烦了一点(这也暴露了windows下面工具结合不够好的弱点),我打算写一个调用wget下载的功能,这样,处理起来安逸些。
于是,偷懒的解决了大问题。^_^
这个MangaDowner似乎不提供源码,所以用的人也没办法自己添加可用网站。
逛了一下作者的blog,然后发现,对于www.zxmh.net这个网站的漫画,MangaDowner只能获取列表,而不能把图片地址正确的得到。而这个网站正是我最先想要处理的,由于当时没搞明白他是怎么做的,就拿了个别的HTML处理图片的网站来开刀。
断断续续看了好些时候,吃过晚饭后终于把问题初步解决了。下面是我对www.zxmh.net的分析过程。
首先打开html源码一看……哇,好干净,就几个table,外加些许js链接。
那些链接指向的js,都无法直接访问,没关系,ff中有缓存呐,访问过页面后,再打开一个标签填上地址,这样就能看到js的内容了。但是有好多个js,而javascripts是我第二讨厌的东西(第一是他叔叔java),看起来真是痛苦。更可气的是这个站点把好好的js切的四分五裂,中间还有个硕大无比的unicodetoansi表。
稍微动点鼠标获得了一张图片的地址,可是无法访问,用flashget试了一下居然不能下载,写了段python添加referer也没用(本来flashge就有这功能的),该死,难道用了什么YD的手段。我也算是做过一些web程序了,看到返回的值不是404,而是IIS的错误警告,很明显有防盗链的作用,这种站点不会用太高级的东西吧,于是又试了N个不同的referer,无用,甚至连那些js都无法获取。
无奈中看到url中有个带?p=xx的尾巴,该不会用了点server端脚本吧,检查了一下站点cookies,好家伙,一大把cookies。找了半天没发现这些东西中有什么玄机。ie的cookies也看了,没啥区别。
中途还陪爸妈玩了几小时牌,用一种很长条的牌玩的,我们这儿叫“乱错”。
然后把ff缓存中得到的js代码提了出来,凑了个html页面,倒是真的能从那些datas[n]="xxxx"中找出hostname和path来。可是就是无法访问,狗日的怎么搞的啊,再看了遍js代码,的确没什么高级玩意儿,就一个很弱的解码,然后操作了一下dom,最有技术含量的地方就是预处理了下一页的图片。
唉,只有抓包了,下了一个ethereal,抓了一下,包虽然不是很多,可是我这个版本的ethereal有个bug,不能导出txt文件(由此建议各位不要因为sourceforge速度不快就在什么xx软件园下东西),可把我给找坏了。在一大群qihoo,baidu和擦边球的漫画网站广告中找到了那几个js和图片的包,一看header,气得要吐血。龟儿子引用页面就是每一话的url,而我由于粗心把带?p=xx的填了进去而不能下(后来又随便试了几个更差得远的)。
好啦好啦,这下没问题了。(白费两小时啊)
然后把那段解码的js几乎是照着搬过来用python涂了一下,测试通过。为了偷懒还把unicode编码转换那部分省略了,反正我看这网站也没什么汉字URL。
如果明天后天没有同学会的话,就把这个网站的下载写好。
贴一下我的编码代码:
# -*- coding: cp936 -*-
datas = ['']*200
datas[1] = 'L
94c3kvMDc
DAx
.';
# 省略N多
datas[192] = '..YzgwNi9..DcvMTkx
mpw
==';
# 图片地址(实际上为图片服务器hostname)
pic_path = 'aHR
.xOC4
yND
..0Oj![](/Images/dot.gif)
.';
# 处理过程
message = '在线漫画www.zxmh.net';
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
def decode64(input):
output = ''
chr1, chr2, chr3 = '','',''
enc1, enc2, enc3, enc4 = '','','',''
i = 0
while i < len(input):
enc1 = keyStr.index(input[i])
i += 1
enc2 = keyStr.index(input[i])
i += 1
enc3 = keyStr.index(input[i])
i += 1
enc4 = keyStr.index(input[i])
i += 1
chr1 = (enc1 << 2) | (enc2 >> 4)
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
chr3 = ((enc3 & 3) << 6) | enc4
output += chr(chr1)
if enc3 != 64:
output += chr(chr2)
if enc4 != 64:
output += chr(chr3)
chr1, chr2, chr3 = '','',''
enc1, enc2, enc3, enc4 = '','','',''
return output
hostname = decode64(pic_path)
for i in range(1,len(datas)):
print hostname + decode64(datas[i])
datas = ['']*200
datas[1] = 'L
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
# 省略N多
datas[192] = '..YzgwNi9..DcvMTkx
![](/Images/dot.gif)
![](/Images/dot.gif)
# 图片地址(实际上为图片服务器hostname)
pic_path = 'aHR
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
![](/Images/dot.gif)
# 处理过程
message = '在线漫画www.zxmh.net';
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
def decode64(input):
output = ''
chr1, chr2, chr3 = '','',''
enc1, enc2, enc3, enc4 = '','','',''
i = 0
while i < len(input):
enc1 = keyStr.index(input[i])
i += 1
enc2 = keyStr.index(input[i])
i += 1
enc3 = keyStr.index(input[i])
i += 1
enc4 = keyStr.index(input[i])
i += 1
chr1 = (enc1 << 2) | (enc2 >> 4)
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
chr3 = ((enc3 & 3) << 6) | enc4
output += chr(chr1)
if enc3 != 64:
output += chr(chr2)
if enc4 != 64:
output += chr(chr3)
chr1, chr2, chr3 = '','',''
enc1, enc2, enc3, enc4 = '','','',''
return output
hostname = decode64(pic_path)
for i in range(1,len(datas)):
print hostname + decode64(datas[i])