Topit专辑原图批量下载JavaScript脚本

CAUTION:本文要求代码阅读力18+,小白请出门右转看小白版 ( ̄︶ ̄)↗ http://hzx0910.github.io/TopitDownloader/

www.topit.me 非常喜欢的图片网站,自己帐号下面也搜集了很多喜欢的图片,但是想全部下载下来的话却挺麻烦,

有好多图片需要挨个点进去‘查看原图’才能下载到大图。

 

后来仔细观察了下,topit上的图片主要分为五种级别:STML O

S:缩略方式T:三列缩图 M:两列方式 L:单列方式   O:原图(不过不一定有)。

有两种存储方式:http://*.topitme.com/*s.jpg或http://*.topitme.com/s/*.jpg 不同大小级别只要替换链接中表示大小的字母s即可。

 

当然你可以把所有O级别的跟L级别的全部下载下来,然后再去手动删除重复的小图,不过这样还是不够方便直接。

根据上面的分析,比较简便的办法是首先获取专辑里面所有图片的链接,然后挨个分析链接:

第一步:把链接中所有表示级别的字符最's.'、'/s'、't.'、'/t'、等全部替换为最高级别'o.'、'/o';

第二步:尝试下载最高级别的链接成功则保存,不成功则把链接替换为L级别下载。

然而第二步的判断大图存在在js里却并不那么好实现,不过幸好html的<img>标签有一个onerror属性,完美的解决这个问题(ง •̀_•́)ง

把第一步的链接全部放到<img>标签里面,第二部大图不存在的话交给onerror处理,代码如下:

 

/*s 缩略 t 三列 m 两列 l 单列  o 原图(不一定有)*/
function nofind(img, osrc) {
    img.src = osrc.replace('/o', '/l').replace('o.', 'l.');
} 
(function() {
    /*page_max 加载的最大页码数 可修改为数字 by JerseyHo*/
    /*page_min 加载的最小页码数 可改为其他数 by JerseyHo*/
    var page_max = $('#page-next').prev().text() * 1 || 1;
    var page_min = 1;
    var body = '';
    var href = location.href.split('?')[0];
    function getpage(n) {
        if (n < page_min) {
            document.body.innerHTML = body;
            return;
        }
        $.get(href + '?p=' + n,
        function(data) {
            var str = '';
            $(data).find('#content img.img').each(function(i, v) {
                var osrc = ($(this).attr('src').indexOf('blank.gif') >= 0 ? $(this).attr('data-original') : $(this).attr('src'));
                osrc = osrc.replace('/s', '/o').replace('s.', 'o.').replace('/t', '/o').replace('t.', 'o.').replace('/m', '/o').replace('m.', 'o.').replace('/l', '/o').replace('l.', 'o.');
                body += "<img onerror='nofind(this,this.src)' src='" + osrc + "' /><br/>\r\n";
            });
            getpage(--n);
        })
    }
    getpage(page_max);
})();


在Topit任意页面往浏览器console(按F12)里面输入上面的代码执行,等一会网页切换,图片加载完以后再按Ctrl+S选择保存网页全部就把整个专辑的原图都拿到手了。

想要更方便一点的话在代码前面加上 javascript: 保存为浏览器书签,每次用的话点一下书签就好了。

另外,如果专辑实在太大,浏览器一次还是很难下载全,可以分几次下载,只需要每次修改上面代码里面page_max 和page_min修改为你需要的页码范围就行了

 

JavaScript 部分代码参考了 http://www.douban.com/group/topic/26040724/ 谢谢谢谢谢谢谢谢!!!!

 

 

 

 

运行环境 .NET Framework2.0 开发工具 Microsoft Visual Studio 2005 二. 部分代码说明(主要讲解异步分析和下载): 异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载下载成功的均在List框链接前面划上了√ ,未能下载的图片有可能是分析错误或者是下载异常。 1. 异步分析部分代码 /// /// 异步分析下载 /// private void AsyncAnalyzeAndDownload(string url, string savePath) { this.uriString = url; this.savePath = savePath; #region 分析计时开始 count = 0; count1 = 0; freq = 0; result = 0; QueryPerformanceFrequency(ref freq); QueryPerformanceCounter(ref count); #endregion using (WebClient wClient = new WebClient()) { AutoResetEvent waiter = new AutoResetEvent(false); wClient.Credentials = CredentialCache.DefaultCredentials; wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze); wClient.DownloadDataAsync(new Uri(uriString), waiter); //waiter.WaitOne(); //阻止当前线程,直到收到信号 } } /// /// 异步分析 /// protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e) { AutoResetEvent waiter = (AutoResetEvent)e.UserState; try { if (!e.Cancelled && e.Error == null) { string dnDir = string.Empty; string domainName = string.Empty; string uri = uriString; //获得域名 http://www.sina.com/ Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase domainName = match.Value; //获得域名最深层目录 http://www.sina.com/mail/ if (domainName.Equals(uri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值