日期:2014-05-16  浏览次数:20403 次

自己用javascript写了一些代码,用来批量下载“绝影”博客上《疯狂的程序员》文章

近日,在拜读了“绝影”博客上《疯狂的程序员》连载文章后,感触颇深,从他的文章里找了自己的人生记忆,仿佛其中的主角就是自已…..

可是,由于白天要上班,晚上回家了也很晚,没多少空闲时间看,想来想去,最后决定将文章下下来,做成txt格式放到手机上看,反正每天上下班都有差不多两个小时,够我看的了。

问题来了,如果我是用手工的方式去一页一页的复制、粘贴。。。这工作量是不是也太大了,况且自己还身为一名“程序员”,感觉总有点怪怪的。又不想上网找那种可以下载网页的软件。最后想想,反正这难度应该不大,自己动手写个小程序试试,不成功也就当是练习练习吧。

接下来,开始分析需求。其实很简单,就是输入博客的网址,然后得到当前页面当中的所有文章的超链接,再根据这个链接去读取每篇文章的内容,把内容全部显示到一个网页里,然后就只需要复制一次就可以将所有的内容copy下来了。

?

开始写代码,这里碰到了一个问题,本想一次性将所有的链接全部得到,然后通过循环的方式去读取每个链接所对应的网页内容。可是当我真正去实现的时候出现了一个无法访问的错误,打开了一个CSDN用户登录页面。不知道是什么原因,猜想是人家网站不让你这样去弄吧,也没多想。此路不行,换条路。打开其中的一个链接,看了一下结构,发现每篇文章上面都有一个链接可以查看下一篇文章的内容,既然如此那我就可以通过读取这个链接得到下一篇文章的网页了。通过不断的循环,应该可以一直不断的得到后面的网页。

?

思路理清了,就开始写代码吧

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        //获取网页内容,经过处理后将内容写入到指定的div当中
        function getPage(url){
            var xmlhttp = createXmlHttp();                      //获取xmlhttp对象
            var all_yk = document.getElementById("all_yk");    //得到用于保存网页的div
            if(url == null || url == "") {
                alert("网址不能为空!");
                return;
            }else {
                xmlhttp.open("GET",url,false);
                xmlhttp.send();
                if(xmlhttp.readyState ==4) {
                    if(xmlhttp.status != 200) {
                        alert("连接失败!");
                        return;
                    }else {
                        /*
                            这里通过xmlhttp对象读取了网页后,将内容写入到all_yk这个div当中,
                            这里面的内容其实就是包含所有内容的网页源代码。
                            由于div的样式已设置不显示,所以我们在网页是看不到的。
                         */
                        all_yk.innerHTML=xmlhttp.responseText;
                        //这个用来提取我们需要数据,获取文章的内容就看它了
                        getText();
                    }
                }
            }
        }

        //定义一个计数器,通过此计数器,我们可以设置要访问的级数
        var count=1;
        //从指定的div当中获取需要的数据
        function getText() {
            var temp_yk = document.getElementById("temp_yk");
            //下一页的超链接
            var nextHREF;
            if(document.getElementById("Post.ascx_ViewPost_PreviousAndNextEntriesUp")){
                /*
                    这里的id是通过分析网页源代码得到的,大家可以自己去查看博客上的网页源代码就知道了
                    得到了这个节点对象我们就可以缩小查找范围,只需要得到这个节点的第一个<a>元素的href属性
                    就可以获取下一篇文章的链接了,再将链接保存到变量当中,用于下一次getPage()方法的运行,
                    如此循环即可以不断的得到不同的文章内容
                 */
                 var nextURLS =document.getElementById("Post.ascx_ViewPost_PreviousAndNextEntriesUp");
                    nextHREF=nextURLS.getElementsByTagName("a")[0].getAttribute("href");
            }

            /*
             *这段代码用来获取我们需要的文章内容,同样