24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 2121  |  回复: 12
当前主题已经存档。

neweroica

木虫 (著名写手)

[交流] [原创] NetLibrary电子书批量下载秘诀 (请求加精)

原文地址见我的博客:
http://blog.csdn.net/neweroica/archive/2006/08/04/1016345.aspx

NetLibrary电子书批量下载秘诀
2006-8-3

学校早就买了NetLibrary,上面提供了许多很棒的英文原版书,可惜只能在浏览器中一页一页地看。虽然可以使用“保存”按钮一页一页地保存成pdf文件,但想要保存一本完整的数百页的书,可得有足够耐心啊。先在网上搜了一下,结果发现似乎还没有牛人公布批量下载NetLibrary电子书的方法。正好今天得闲,便开始琢磨着如何批量下载NetLibrary的电子书。经过一个下午和网上的努力,终于初步开发出一个比较省力省心的办法来。现拿出与大家共享,不过由此引发的版权问题,本人概不负责。

首先,登上NetLibrary,打开你要的电子书链接(“View this eBook”)。
打开的窗口如下图所示:
我们可以查看一下页面范围,点击页面左边导航栏和右上角的“Next >>”按钮,找到全书最后一页,如图所示:
如本例,最后一页是递471页。
注意,这个IE浏览器在后面的步骤中不要关闭!

第二步,删掉IE的临时文件夹(C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5)中所有的pdf文件。
一种方便的方法是,进入DOS窗口,输入:
cd C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5
然后输入命令:
for /r . %a in (*.pdf) do del "%a"

第三步,利用网页脚本自动加载每页。
具体方法是:
将下面的代码保存成netlib.htm网页文件:




//书号代码
var bookid = 105483;

//起止页码
var istart =   1;
var iend   =   471;

//延迟时间(秒)
var wtime  = 5;

var ipage = istart;

function getpage(){

    loader.location = 'http://www.netlibrary.com/nlreader/nlReader.dll?BookID=' + bookid + '&FileName=Page_' + ipage + '.pdf';


    if(ipage
        setTimeout('getpage()', wtime*1000);
    }

    ipage = ipage + 1;
}

getpage();

其中的bookid是这本书的代号,可以从IE浏览器页面右上方的frame中点右键“查看源文件”,通过查找“bookid”字段找到这个代号;istart和iend是要下载的起止页码,这里是从第1页到第471页;wtime是自己估计的加载每个页面所需的最长时间,可以根据你的网速估计一下,我这里选择的是5秒钟。
然后双击运行,直到所有页面加载完毕。如下图所示:

第四步,将已经下载完全的每页的pdf文件从IE临时文件夹中按顺序取出。
这个工作其实最麻烦,因为IE临时文件夹中的临时文件是保存在许许多多随机命名的子文件夹之中的(不信请用资源浏览器进入“C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5”看看)。而且你会发现刚才加载的那些临时的pdf文件的顺序是乱的,比如第1、4、5页在O1ORGB43子目录下,第2、3、7页在6PDQB2XW子目录下,而第6、8、9页则在W9CN0Z0N子目录下。所以,如果手工将这些pdf文件从IE临时文件夹中取出,将非常麻烦,而且取出后还要按照原书的页码顺序重命名,更是难上加难。为此,我还是用JavaScript编写了一个HTA程序,用来自动完成这些工作。我的思路很简单,就是用程序找出IE临时文件夹中所有的pdf文件,然后按照文件生成时间顺序排序,再将它们复制到硬盘的单独目录(如“C:\”)下,复制后的文件名就是这一页页码的名字。
具体方法是:
将下面代码保存成getpdf.hta文件:


function ShowFolderList(folderspec)
{
   var fso, f, fc, s;
   fso = new ActiveXObject("Scripting.FileSystemObject";
   f = fso.GetFolder(folderspec);
   fc = new Enumerator(f.SubFolders);
   s = "";
   for (; !fc.atEnd(); fc.moveNext())
   {
      s += fc.item();
      s += "\n";
   }
   return(s);
}

function ShowFolderFileList(folderspec, filespec)
{
   var fso, f, f1, fc, s;
   fso = new ActiveXObject("Scripting.FileSystemObject";
   f = fso.GetFolder(folderspec);
   fc = new Enumerator(f.files);
   s = "";
   for (; !fc.atEnd(); fc.moveNext())
   {
      var st = fc.item() + "";
      var fname = st.split('.');
      var fileext = fname[fname.length-1];
      if( (filespec != '*' && filespec != fileext) || st.length == 0){
          continue;
      }
      //document.write('_'+st+'_
')
      s += fc.item();
      s += "\n";
   }
   return(s);
}

function ShowSubFolderFileList(folderspec, filespec)
{
   var s, i;
   
   var folders = ShowFolderList(folderspec).split('\n');

   s = "";
   for (i=0; i
   {
      if( folders.length == 0){
          continue;
      }
      s += ShowFolderFileList(folders, filespec);
   }
   return(s);
}

function GetFileList(folderspec, filespec)
{
   var s = ShowSubFolderFileList(folderspec, filespec);
   var fa = s.split('\n');
   fa.length = fa.length - 1;
   return fa;
}

function GetFileTime(filespec)
{
   var fso, f, d, t;
   fso = new ActiveXObject("Scripting.FileSystemObject";
   f = fso.GetFile(filespec);
   d=new Date(f.DateCreated);
   return d.getTime();
}


function QuickSort(arr) {
     if (arguments.length>1) {
         var low = arguments[1];
         var high = arguments[2];
     }
     else{
         var low = 0;
         var high = arr.length-1;
     }

     if(low
         // function Partition
         var i = low;
         var j = high;
         var pivot = arr;
         while(i
             while(i=pivot)
                 j--;
                 if(i
                     arr[i++] = arr[j];
             }
         while(i
             i++;
             if(i
                 arr[j--] = arr;
             }
         }//endwhile
         arr = pivot;
         // end function
         var pivotpos = i; //Partition(arr,low,high);
         QuickSort(arr, low, pivotpos-1);
         QuickSort(arr, pivotpos+1, high);
     }
     else{
       return;
     }
   return arr;
}

var fa = new Array();
var ft = new Array();
var sft = new Array();

fa = GetFileList('C:\\Documents and Settings\\Administrator\\Local Settings\\Temporary Internet Files\\Content.IE5', 'pdf');
s ="";
for (i=0; i
    s += GetFileTime(fa)+'
';
    ft = GetFileTime(fa);
    sft = ft;
}

sft = QuickSort(sft);

var ia = new Array();
for(i=0;i
    for(j=0;j
        if(sft == ft[j]){
            ia = j;
            break;
        }
    }
}

var fso, f;
fso = new ActiveXObject("Scripting.FileSystemObject";

for (i=0; i
  f = fso.GetFile(fa[ia]);
  if(i+1
      f.Copy("C:\\00" + (i+1) + ".pdf";
      document.write('00' + (i+1) + '.pdf
');
  }
  else if(i+1
      f.Copy("C:\\0" + (i+1) + ".pdf";
      document.write('0' + (i+1) + '.pdf
');
  }
  else{
      f.Copy("C:\\" + (i+1) + ".pdf";
      document.write((i+1) + '.pdf
');
  }
}


双击运行之后,就会在C:\下看到复制出来的按照页码命名的一系列pdf文件。用Adobe Acrobat就可以将它们合并成一个完整的pdf文件。在整理时要注意检查有没有漏页或重页。弄完后删除掉C:\复制出来的单页文件。
最后,NetLibrary的电子书还有Cover和用小写罗马数字命名的页面(即封面和目录、前言、致谢、凡例等页),对于这些页面,一般不多,可以用手工下载。具体方法是:
在IE浏览器的NetLibrary在线阅读器中进入第一页封面页。然后重复前述第二步操作。
点击在线阅读器右上方的“Next >>”按钮,一页一页地手工加载。
然后重复前述第四步操作。
用Adobe Acrobat将这些页面与前面已合并的正文页整合成完整的一本电子书。在整理时要注意检查有没有漏页或重页。

[ Last edited by neweroica on 2006-10-12 at 11:50 ]
回复此楼
Simpler, stronger, more tolerant
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zjwanglei

金虫 (小有名气)

1

高手啊,我要回去试试看!!谢谢!
2楼2006-10-01 02:50:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wguoyong

金虫 (著名写手)

0.5

不错!但没有图例!好像这点小事高手应能解决吧!
http://emuchhelp.ys168.com/
3楼2006-10-01 20:32:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zjwanglei

金虫 (小有名气)

已经试过,确实可行。但这里的代码与博客中想必缺少 script的开始和终止符号。另外,建议不要把时间间隔设定小于5,(我尝试设置成2,结果100页后出现了版权保护提示,反而影响了正常的下载。)还有,有的书的格式并不是PDF,可以考虑修改程序代码中的pdf为html,也可以正常下载,问题就是其中的图片可能会有问题。(还没有测试,等测试后再来报告结果)。总之,非常感谢楼主的工具,小程序可以解决大问题,这正是编程高手的境界呀~!
4楼2006-10-02 06:59:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chenkfeng

木虫 (正式写手)

学习下
5楼2006-10-02 09:27:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pizarro

金虫 (小有名气)

1

天才啊
6楼2006-10-03 01:07:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

neweroica

木虫 (著名写手)

补充

使用下面的函数可以下载页码为罗马数字的书页:
function getromanpage(){
       
          var roman = new Array('Cover','i','ii','iii','iv','v','vi','vii','viii','ix','x','xi','xii','xiii','xiv','xv','xvi','xvii','xviii','xix','xx',
                                        'xxi','xxii','xxiii','xxiv','xxv','xxvi','xxvii','xxviii','xxix','xxx',
                                        'xxxi','xxxii','xxxiii','xxxiv','xxxv','xxxvi','xxxvii','xxxviii','xxxix','xl',
                                        'xli','xlii','xliii');
          
          if( ipage == 0 ){ //Cover
        loader.location = 'http://www.netlibrary.com/nlreader/nlReader.dll?BookID=' + bookid + '&FileName=' + roman[ipage] + '.pdf';
    }
    else{
        loader.location = 'http://www.netlibrary.com/nlreader/nlReader.dll?BookID=' + bookid + '&FileName=Page_' + roman[ipage] + '.pdf';
    }


    if(ipage < iend){
        setTimeout('getromanpage()', wtime*1000);
    }

    ipage = ipage + 1;
}
Simpler, stronger, more tolerant
7楼2006-10-12 11:49:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pizarro

金虫 (小有名气)

我来顶,你应该发到原创资源去,应该可以给你加vip的
8楼2006-10-13 18:31:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

oranged_7

荣誉版主 (知名作家)

老虫

公平的说,还是麻烦一些....不如弄个能直接下载的帐号....另外,OFFLINE这款工具早都为人所知了...
成不了牛人了。
9楼2006-10-13 22:06:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yahoohoo

铁杆木虫 (著名写手)

1

想法非常简单,但却极其使用,顶!!!
10楼2006-10-27 10:02:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 neweroica 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见