C#抓取动态网页(连同响应翻页)的数据(例如火车时刻表)显示,具体如题

火电 2007-06-25 10:51:30
要实现动态抓取其他权威数据库上的数据(最新火车时刻表)
显示在本地网页中,保证连接和分页有效的连接过去。如何实现

求解决方案!!!!
...全文
1217 点赞 收藏 11
写回复
11 条回复
dxzhang2 2011年09月02日
后台聊过了。。能把解决方案共享了么?
回复 点赞
jiejie526 2009年12月09日
<@Aattention Content="本Blog原创文章,转载或引用请注明转载" From="Robby.cnblogs.com"@>

由于自己的搜索引擎中做到了这一块内容,所以今天说说如何抓取网页数据、分析并且去除Html标签,给大家提供一个参考。我的平台是Visual Studio2005,C#。

—————————————————————割—————————————————————————

首先将网页内容整个抓取下来,这个我就不说了,不是本次话题的重点。假设抓取的数据放在RecvBuffer这个byte[]中(数据从网络上传输过来时不是字符串的形式而是byte),那么我们的第一步就是将RecvBuffer转化为String,以便于对其操作,实例如下:
// 将接收到的数据增加到响应字符串中
strResponse += Encoding.ASCII.GetString(RecvBuffer, 0, nBytes); strResponse即是保存数据的字符串,此处用系统自带的System.Text.Encoding的方法转化RecvBuffer,GetString的第一个参数RecvBuffer就是我们的原始数据,即包含需要解码的字节序列的字节数组;第二个参数0代表第一个要解码的字节的索引,一般就从0开始;第三个参数nBytes为要解码的字节数,可以自己调整。

得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用)。下面我以几个例子来说明对网页数据的解析:
// 解析页面,查找链接
// 此处尚需扩展,还有某些形式的链接不被识别
string strRef = @"(href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""']";
MatchCollection matches = new Regex(strRef).Matches(strResponse);
strStatus += "找到: "+matches.Count+" 个链接\r\n"; 上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。
当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是蛮简单的。
再举几个更简单点的解析的例子,大家学习学习:
//获取标题
Match TitleMatch = Regex.Match(strResponse, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
title = TitleMatch.Groups[1].Value;

//获取描述信息
Match Desc = Regex.Match(strResponse, "<Meta name=\"DESCRIPTION\" content=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
strdesc = Desc.Groups[1].Value;

//获取网页的大小
size = strResponse.Length;
—————————————————————割—————————————————————————

好了,下面说一下如何去除Html标签,这个想必有很多初学者很需要。其实还是正则表达式和字符串基本操作的应用,由于这个功能还是比较常用的,所以例子写成了函数,便于调用:
/**//// <summary>
/// 将Html标签转化为空格
/// </summary>
/// <param name="strHtml">待转化的字符串</param>
/// <returns>经过转化的字符串</returns>
private string stripHtml(string strHtml)
{
Regex objRegExp = new Regex("<(.|\n)+?>");
string strOutput = objRegExp.Replace(strHtml, "");
strOutput = strOutput.Replace("<", "<");
strOutput = strOutput.Replace(">", ">");
return strOutput;
} ok,这样一来Html标签就基本没了,但是有些例外会使得去除不干净,所以建议连续两次转化,这样就搞定了。但是还没结束,如果你留意的话,可以看到上面的函数其实是将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
//把所有空格变为一个空格
Regex r = new Regex(@"\s+");
wordsOnly = r.Replace(strResponse, " ");
wordsOnly.Trim(); 好了,大功告成,这里的wordsOnly便是我们最终的成果----去除了Html标签,并去除了多余空格的字符串。
希望对大家有用!

回复 点赞
火电 2007年06月27日
已经搞定,结贴,感谢lxcnn(过客)的帮助(后台聊过)
回复 点赞
LinDaXX 2007年06月26日

StreamReader sr = new StreamReader(resStream, System.Text.Encoding.UTF8);

回复 点赞
火电 2007年06月26日
string url = "http://www.huoche.com/chaxun/showchezhan.asp?zhan=大连";

string ResponseText = String.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.url);
request.UserAgent = Request.UserAgent;

System.Net.WebResponse response = request.GetResponse();

//返回信息
Stream resStream = response.GetResponseStream();
StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);
ResponseText = sr.ReadToEnd();
resStream.Close();
sr.Close();

return ResponseText;


抓取网页数据时遇到中文时(url中含有‘大连’)
出现乱码!!!!如何解决!!!

回复 点赞
pzlk 2007年06月25日
比如对方页面
time.aspx?page=1

你的
mytime.aspx?page=1

获得对方页面相应页码的html代码,对翻页连接做修改,改成你自己的就可以了
回复 点赞
-过客- 2007年06月25日
只是能链接过去就行吗?那就取得网页源码,提取出你想要的链接,有些用相对地址的,替换成绝对地址就行了,如果是大型或者权威的网站,格式应该都是固定的,提取应该很容易的
回复 点赞
Red_angelX 2007年06月25日
不保存? 那就存在内存里了 得到服务器返回的html str后替换掉里面的url 用个表来存这些东西
回复 点赞
火电 2007年06月25日
不保存数据,就要做到连接(分页,朝连接)过去就行

具体些,如何实现呢
回复 点赞
Red_angelX 2007年06月25日
抓回来 把分页链接替换下
回复 点赞
pzlk 2007年06月25日
你是要连接过去,还是想把数据抓取下来放到自己的数据库中呢?
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告