打印

[.net] .net采集技术初探

抛砖引玉,希望有人能有更详细的讲解,基本上注释里都已经写的很详细啦...
复制内容到剪贴板
代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //**.net数据采集初探
        //首先我们确定要采集的目标,这次我们以后台区的版面为采集目标
        //url:http://bbs.blueidea.com/forum-2-1.html
        //第一步要获取页面源码...
        //使用WebRequest 和 WebResponse来获取,需要添加引用using System.Net;
        WebRequest bi = WebRequest.Create("http://bbs.blueidea.com/forum-2-1.html");
        WebResponse gbi = bi.GetResponse();
        //此时接收到的为数据流,所以需要一个streamreader来进行读取,并且在读取时设置编码格式,一般情况下设置为默认即可..
        //使用streamreader需要添加引用using System.IO;
        StreamReader rbi = new StreamReader(gbi.GetResponseStream(),System.Text.Encoding.Default );
        string str = rbi.ReadToEnd();
        //在页面中建立一个多行的文本框来显示接收的内容
        re.Text = str;
        //此时我们运行程序就可以看到源代码我们已经得到了...
        //下面我们要应用正则来提取其中的内容,有难度,正则俺学的并不好,不过按照我们一般的采集要求,好象要求并不高,可以试一下,
        //由于我们一般都是做普通的截取,而且要重复使用多次,所以我们做一个函数出来...
        //函数说明见cutstr.....
        //好了,欢迎从cutstr回来,现在我们应用一下cutstr看看效果吧...
        //我们现在采集一下版块名称.也就是说,我们可以采集多个不同的版块..
        //先查看源码,找找特征...<title>后台数据库编程 -  经典论坛 网页-网站-制作-设计-编程 - Powered by Discuz!</title>
        //还不错,很好找.试下先...
        Response.Write("采集到版块名称:" + cutstr(str, "<title>", "-")+"<br>");
        //显示没有问题,我们正测试一下其它版块...http://bbs.blueidea.com/forum-5-1.html
        //通过替换URL,可以采集到名称为:WEB标准化专栏
        //这个基本的测试我们只做一次就够了,试试复杂点的吧...
        //从这个页面把帖子列表采集出来...
        //当然还是用正则了,不过和cutstr里面的应用不是很一样..试下先...
        //先是查看代码帖子链接的共性:<a href="thread-2883739-1-1.html">请问蓝色理想的搜索方式如何实现的?类似百度</a>
        //难度在2883739这个全是不一样的...
        MatchCollection vid = Regex.Matches(str, "(-1-1.html\">).+?(<)");
        for (int i = 0; i < vid.Count; i++)
        {
            Response.Write(cutstr(vid[i].ToString(), "-1-1.html\">","<")+"<br>");
        }
        //OK,列表页出来了....不过有些具体的内容还需要做详细的提取,偶的正则学的也不好,只会这点基础的应用啦....
        //发现有分页的第一页的链接文字还是会被提取出来,这个就要看具体需要来做处理啦,
        //另外置顶由于链接里面带有样式,所以这样也无法提取....
        //不过理论上还是可以提出来的,看正则应用的熟练程度啦...
        //偶最近只是粗浅的学到这么多,希望抛砖引玉,有高手出来讲讲啦...
    }
    protected string cutstr(string str, string bs, string es)
    {
    //函数cutstr
    //功能切割字符串
    //参数说明str,需要切割的字符串,bs,开始字符串,es,结束字符串
        //由于我们要使用正则,所以要添加引用using System.Text.RegularExpressions;
        Match tempstr = Regex.Match(str, "(" + bs + ").+?(" + es + ")");
        //这是很普通的正则,我也解释不明白....
        string temp2 = tempstr.ToString();
        if (temp2.Length != 0)
        {
            string temp3 = temp2.Substring(bs.Length, temp2.Length - bs.Length - es.Length);
            //此次将取得的字符串的开始结束字符串去掉
            return temp3;
        }
        else
        {
            return "采集失败!!!";
        }
        //OK,此段看完可以返回page_load继续了...
    }
}
个站交流!开发郁闷期
个站交流!开发郁闷期
昨天看了你之前写的笔记,很清楚的,感谢今天又发帖指点,呵呵
用正则表达的话对服务器压力比较大吧!
如果搜索引擎用这种方式的话怕是压力不小~~
做最好的自己,我能。

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
很不错~

TOP

引用:
原帖由 ishowing 于 2008-9-4 17:22 发表
用正则表达的话对服务器压力比较大吧!
如果搜索引擎用这种方式的话怕是压力不小~~
这句话用在ASP还可以。。。。
开发ASP Q:37992553

TOP