ASP.Net中抓取网页到本地数据库

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

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))continue;

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

        t1 = RegExp.$1;

        temp = a.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>会很麻烦,即便写出来,程序也会失去灵活性,变得难以维护,所以现在只做到了这一步。

 

 

 

如何用正则表达式提出网页表格中的数据?

<table[^>]*>[/s/S]*?<a[/s/S]*?href=("(?<href>[^"]*)"|'(?<href>[^']*)'|(?<href>[^>/s]*))[^>]*?>(?<title>[/s/S]*?)</a>[/s/S]*?</table>  
   
  测试:  
  string   content   =   @"<table   border=""0""   width=""11%""   class=""Headline"">  
  <tr>  
  <td   width=""100%"">  
  <p   align=""center"">这是第一个表格</td>  
  <td>  
  <A   href=""http://www.163.com""   target=_blank>网易</A></td>  
  </tr>  
  </table>";  
  Regex   htmlRegex   =   new   Regex(  
  @"<table[^>]*>[/s/S]*?<a[/s/S]*?href=(""(?<href>[^""]*)""|'(?<"  
  +   @"href>[^']*)'|(?<href>[^>/s]*))[^>]*?>(?<title>[/s/S]*?)</a>["  
  +   @"/s/S]*?</table>",  
  RegexOptions.IgnoreCase   |   RegexOptions.Compiled);  
  //content   =   htmlRegex.Replace(content,   "");  
   
  MatchCollection   mc   =   htmlRegex.Matches(content);  
  string[]   div   =   new   string[mc.Count];  
  for   (int   i=0;   i<mc.Count;   i++)  
  {  
  //int   n   =   Int32.Parse(mc[i].Groups["Content"].Value);  
  Console.WriteLine(mc[i].Groups[0].Value); //The   whole   table  
  Console.WriteLine(mc[i].Groups["href"].Value); //URL  
  Console.WriteLine(mc[i].Groups["title"].Value); //Text  
  //Console.WriteLine();  
  //div[i]   =   mc[i].Groups["content"].Value;  
  }  
  输出:  
  <table   border="0"   width="11%"   class="Headline">  
  <tr>  
  <td   width="100%">  
  <p   align="center">这是第一个表格</td>  
  <td>  
  <A   href="http://www.163.com"   target=_blank>网易</A></td>  
  </tr>  
  </table>  
  http://www.163.com  
  网易 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2010/12/30 v1.2版 改掉程序所有的select标签 项目结构说明: \ ……\App_Data 项目数据库文件 (ACCESS2003) ……\bin\ …………\AjaxPro.2.dll .NET调用AJAX类库 …………\App_Code.dll 功能类文件 …………\App_Web_ka4newz2.dll *.aspx.cs文件打包 ……\JS\ …………\jquery-1.4.4.min.js JQuery库 …………\Script 系统自定义JS文件 ……\Default.aspx 系统功能页面 ……\Help.txt 帮助文档 ……\web.config 配置文件 ……\PrecompiledApp.config 发布配置文件 系统使用说明: 一、系统启动后在“抓取网页路径” 输入要抓取网页的URL 以文本内默认格式输入 选择“网页编码格式” (如果不知道网页格式可以更换不同选择项),然后点击“测试打开网页”。系统会 在页面右侧空白处显示页面源码,以及以小窗口形式显示要抓取网页可视化界面。 二、在“列表定位标签”输入要抓取列表信息容器型标签。例如:DIV、UL、TABLE “筛选同类标签”作用是用来过滤页面上同类定位标签,然后点击“测试列表定位” 三、“抓取信息标签”是指列表后页面要制定抓取的信息容器型标签。(如果抓取整页信息请为空),然后点 击“开始抓取列表内容”。 四、当抓取记录操作出现抓取日志时。网页HTML字符串已经保存完毕。可是图片可能还在陆续保存。由于是WEB 形式所以无法得知何时抓取完毕,用户需长时间进程守候。 五、“获取抓取页面打包”是先前抓取网页以及图片打包 六、项目DOWNLOADS分HTML、IMAGES是保存抓取网页的信息 系统问题: 系统对网速要求很高,因为下载图片是多线程。 B/S模式程序响应可能超时而影响系统正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值