元始天尊 发表于 2014-1-29 13:06:25

自己动手编写MSDN下载工具

       微软msdn一般都会在vs安装包里提供,但是有时候你只需要庞大信息的一个小分支,特定信息只有微软官网才有,vs2010强大的帮助文档也未提供,我遇到这个问题的时候就想用java+jsoup做个下载器解决这个问题,按目录递归下载各个网页拼成整个的html,最后转换成doc。效果还是不错的,我另外生成目录并加到html最前端。我之所以要写这个代码,是因为前两天看到了windbg想看看用法无奈他的帮助信息指向到了微软msdn里,而vs没有这部分内容,仅在在线msdn才有。java代码如下:
import java.io.FileOutputStream;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class MSDNDownloader
{
        public static String htmldirtree="";//生成目录树
        public static String htmlbody="";//拼接章节
        public static String urlbase="http://msdn.microsoft.com";//根路径地址
        public static String root="/en-us/library/ff551063(v=vs.85).aspx";//windows debugging在msdn的根位置
        public static int maxcount=10000;
        public static void resolve(String cururl,int curdepth)
        {
                boolean islastlayer=false;
                try
                {
                        if(maxcount-- <= 0)
                                return;
                        System.out.println(maxcount);
                        Document doc=Jsoup.connect(cururl).timeout(0).get();
                        if(!doc.select("div.toclevel2.current a").isEmpty())
                                islastlayer=true;
                        //先添加当前层目录
                        Element curtitle;
                        if(islastlayer)
                                curtitle=doc.select("div.toclevel2.current a").get(0);
                        else
                                curtitle=doc.select("div.toclevel1.current a").get(0);
                        htmldirtree+= "<H"+curdepth+" style=\"margin-left:"+20*curdepth+"px\">";
                        htmldirtree+= curtitle.text()+"</H"+curdepth+">\n";
                        System.out.println(curtitle.text());
                        //再添加当前层内容
                        htmlbody += doc.select(".topic").toString()+"\n";
                       
                        if(!islastlayer)
                        {
                                //处理下一层
                                Elements subtitle=doc.select("div.toclevel2 a");
                                if(!doc.select("div.toclevel2.current a").isEmpty())
                                {
                                        subtitle.remove(0);
                                }
                                for(Element everytitle:subtitle)
                                {
                                        resolve(everytitle.attr("abs:href"),curdepth+1);
                                }   
                        }
                }
                catch(Exception exc)
                {
                        System.out.println("错误!");
                        //System.exit(0);
                }
        }
        public static void main(String[] args)
        {
                try
                {
                        resolve(urlbase+root,1);
                       
                        FileOutputStream fs=new FileOutputStream("result.htm");
                        String html="<!DOCTYPE html>\n<html>\n<head><title>result</title></head>\n<body>\n<font color=0x00ffff>\n";
                        html += htmldirtree+"\n</font>\n"+htmlbody+"\n</body>\n</html>";
                        fs.write(html.getBytes());
                        fs.close();
                }
                catch(Exception exc)
                {
                        System.out.println("错误!");
                        System.exit(0);
                }
        }
}
以上代码比较厉害,不过由于手机网络限制始终没有直接运行,我找仅仅了一个子目录运行,就生成了5M的html(见过这么大的没),
以下是部分目录:
Debugger Reference
Command-Line Options
CDB Command-Line Options
KD Command-Line Options
WinDbg Command-Line Options
DbgSrv Command-Line Options
KdSrv Command-Line Options
DbEngPrx Command-Line Options
KDbgCtrl Command-Line Options
DbgRpc Command-Line Options
SymStore Command-Line Options
Environment Variables
General Environment Variables
Kernel-Mode Environment Variables
Debugger Commands


页: [1]
查看完整版本: 自己动手编写MSDN下载工具