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网页文件:
<iframe name=loader src="about:blank" width=800 height=600></iframe>
<script>
//书号代码
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 <= iend){
setTimeout('getpage()', wtime*1000);
}
ipage = ipage + 1;
}
getpage();
</script>
其中的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文件:
<script>
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+'_<br>')
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<folders.length; i++)
{
if( folders[i].length == 0){
continue;
}
s += ShowFolderFileList(folders[i], 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 < high){
// function Partition
var i = low;
var j = high;
var pivot = arr[i];
while(i<j){
while(i<j && arr[j]>=pivot)
j--;
if(i<j){
arr[i++] = arr[j];
}
while(i<j && arr[i]<=pivot)
i++;
if(i<j){
arr[j--] = arr[i];
}
}//endwhile
arr[i] = 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<fa.length;i++){
s += GetFileTime(fa[i])+'<br>';
ft[i] = GetFileTime(fa[i]);
sft[i] = ft[i];
}
sft = QuickSort(sft);
var ia = new Array();
for(i=0;i<sft.length;i++){
for(j=0;j<ft.length;j++){
if(sft[i] == ft[j]){
ia[i] = j;
break;
}
}
}
var fso, f;
fso = new ActiveXObject("Scripting.FileSystemObject");
for (i=0; i<fa.length;i++){
f = fso.GetFile(fa[ia[i]]);
if(i+1<10){
f.Copy("C://00" + (i+1) + ".pdf");
document.write('00' + (i+1) + '.pdf<br>');
}
else if(i+1<100){
f.Copy("C://0" + (i+1) + ".pdf");
document.write('0' + (i+1) + '.pdf<br>');
}
else{
f.Copy("C://" + (i+1) + ".pdf");
document.write((i+1) + '.pdf<br>');
}
}
</script>
双击运行之后,就会在C:/下看到复制出来的按照页码命名的一系列pdf文件。用Adobe Acrobat就可以将它们合并成一个完整的pdf文件。在整理时要注意检查有没有漏页或重页。弄完后删除掉C:/复制出来的单页文件。
最后,NetLibrary的电子书还有Cover和用小写罗马数字命名的页面(即封面和目录、前言、致谢、凡例等页),对于这些页面,一般不多,可以用手工下载。具体方法是:
- 在IE浏览器的NetLibrary在线阅读器中进入第一页封面页。然后重复前述第二步操作。
- 点击在线阅读器右上方的“Next >>”按钮,一页一页地手工加载。
- 然后重复前述第四步操作。
- 用Adobe Acrobat将这些页面与前面已合并的正文页整合成完整的一本电子书。在整理时要注意检查有没有漏页或重页。