抛砖引玉,希望有人能有更详细的讲解,基本上注释里都已经写的很详细啦...
复制内容到剪贴板
代码:
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继续了...
}
}