• 蛙蛙推荐:远程抓取网页到本地数据库.doc


     

    接到一个任务是把中国名牌网站的某些内容添加到我们的网站上,地址如下:

    http://www.chinamp.org/mppro2.php

    这个页上全是一些文章链接列表,点击链接会出现文章的详细内容显示页,根据这个规律,结合正则表达式,XMLHTTP技术,Jscript服务端脚本,以及ADO技术,写了一个小程序,把这些内容抓取到了本地数据库。抓取下来,然后就数据库对数据库导数据就比较方便了。先建立一个Access数据库,结构如下

    Id

    自动编号

    标识,主键

    oldID

    数字

    旧数据编码

    Title

    标题

    文本

    Content

    备注

    内容

     

    具体实现代码如下

    <%@LANGUAGE="JSCRIPT" CODEPAGE="936"%>

    <!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library"

           TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->

    <%

    //打开数据库

    try

    {

           var strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("#db.mdb");

           var objConnection = Server.CreateObject("ADODB.Connection");

           objConnection.Open(strConnectionString);

    }

    catch(e)

    {

           Response.Write(e.description);

           Response.End();

    }

    %>

    <script language="jscript" runat="server">

    //远程获取数据

    function GetData()

    {

           var xHttp = new ActiveXObject("microsoft.xmlhttp");

           xHttp.open("POST","http://www.chinamp.org/mppro2.php",false);

           xHttp.send();

        return(xHttp.responseText);

    }

    //利用正则表达式提取符合条件的链接

    function GetLinks(str)

    {

           var re  = new RegExp("<a[^<>]+?\>((.|\n)*?)<\/a>", "gi");

           var a = str.match(re); //第一次搜索

           for(var i=0;i<a.length;i++)

           {

                  var t1,t2;

                  var temp;

                  var r = /qy.php\?id=(\d+)/ig;

                  if(!r.test(a[i]))continue;

                  temp = a[i].match(/qy.php\?id=(\d+)/ig);

                  t1 = RegExp.$1;

                  temp = a[i].match(/<font[^<>]+?color=\"#000000\"\>(.*?)<\/font>/ig);

                  t2 = RegExp.$1;

                  if(t1 == t2)continue;

                  SaveArticle(t1,t2,GetContent(t1));

           }

    }

    //通过提取的链接获取ID,并通过这个ID取抓取相应的文章

    function GetContent(id)

    {

           var xHttp = new ActiveXObject("microsoft.xmlhttp");

           xHttp.open("POST","http://www.chinamp.org/qy.php?id=" + id,false);

           xHttp.send();

        var str = xHttp.responseText;

           var re  = new RegExp("<span[^<>]+?style=\"font-size:10\.8pt\">(.*?)<\/span>", "gi");

           var a = str.match(re);

           return(RegExp.$1);

    }

    //入库

    function SaveArticle(oldID,Title,Content)

    {

           var oRst = Server.CreateObject("ADODB.Recordset");

           var sQuery;

           sQuery = "SELECT oldID,Title,Content FROM Articles"

           oRst.Open(sQuery,objConnection,adOpenStatic,adLockPessimistic);

           oRst.AddNew();

           oRst("oldID")         = oldID;

           oRst("Title")          = Title;

           oRst("Content")                    = Content;

           oRst.Update();

           oRst.Close();

           Response.Write(Title + "抓取成功" + "<br>");

    }

    </script>

    <HTML>

    <HEAD>

    <TITLE> 抓取文章</TITLE>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></HEAD>

    <BODY>

    <%=GetLinks(GetData())%>

    </BODY>

    </HTML>

    下一步就是,把这个Access的数据库的内容导入到服务器的数据库里了,但是还有一些东西,就是原来的文章是分类的,所以导入的时候还得手工分类,因为在分析链接的时候正则表达式本来写就很麻烦,但还算严谨,如果把分类也用正则表达式解析的话,会很麻烦,因为分类是包含在<td>里面的,而那个页的<td>标签又很多,要想定位分类文字所在的<td>会很麻烦,即便写出来,程序也会失去灵活性,变得难以维护,所以现在只做到了这一步。

  • 相关阅读:
    Advanced-REST-client安装
    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    mysql5.6 的st_distance 实现按照距离远近排序。
    Springboot读取配置文件及自定义配置文件
    mysql distinct
    SOAP XML报文解析
    提交post请求,参数为xml格式
    docker中tomcat日志输出自定义
    Vmware centos 虚拟机 磁盘扩容
    vim开发配置
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/193479.html
Copyright © 2020-2023  润新知