如何利用C#提取目标网页?

chsl918 2005-01-12 11:06:51
我要对一个网页做批量提取。
要求是对某一个网站,作一种有规律的操作。然后得到目标网页,再保存。

这个用C#编程该用什么控件或者方法?网页相关操作能够做吗?比如后退,点击有规律的超链接。保存网页,是否可以保存网页内固定范围内的东西?
高手帮帮忙啊!给个思路也成,我现在是一点门都摸不到啊!
...全文
706 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiying 2005-01-13
  • 打赏
  • 举报
回复
Mark and UP
chsl918 2005-01-13
  • 打赏
  • 举报
回复
谢谢大家的协助,我最最起码知道如何入手了,解决我的问题虽然我还有一段路要走,但是我先结帐,有问题我再发帖子更加有针对性的问问题,这样大家也好回答。
另外zachary7833(潜龙勿用to飞龙在天) 虽然没有完全回答出来我的问题,但是mshtml对象对我的启发不小所以给的分数多一些。

amendajing 2005-01-12
  • 打赏
  • 举报
回复
收藏一下!
aicode 2005-01-12
  • 打赏
  • 举报
回复
晕好像帖的都是怎么得到网页源码的代码.这些sdk文档和高级编程上都有.

楼主要得到的应该是进行一系列操作以后得出的网页.不知道这一系列操作是由用户完成还是在程序中完成?
tengjian1981 2005-01-12
  • 打赏
  • 举报
回复
mark
sywcf 2005-01-12
  • 打赏
  • 举报
回复
收藏
chsl918 2005-01-12
  • 打赏
  • 举报
回复
真是谢谢大家,我先消化一下大家的回答,然后给分,当然如果有哪个高手还有好方法,尽管道来!!
lonelydreamsym 2005-01-12
  • 打赏
  • 举报
回复
我以前写的一个类,有两种方式实现,你看看吧
using System;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;

namespace Efun.Common
{
/// <summary>
/// CatchWebContent 的摘要说明。
/// </summary>
public class CatchWebContent
{
public CatchWebContent()
{
/// <summary>
/// CatchWebContent获取指定URL地址的页面内容的HTML代码。
/// </summary>
}
public string ByteGetContent(string strUrl)
{
///<summary>
///字节方式方式读取网页内容,返回网页内容的全部字符,传入要抓取的网页地址
///</summary>

strUrl = FormatString(strUrl);

string strContent;

if (CheckURL(strUrl))
{
try
{
WebClient myclien = new WebClient();
byte[] myData;

myData = myclien.DownloadData(strUrl);
strContent = System.Text.Encoding.Default.GetString(myData).ToString().Trim();

return strContent;
}
catch(System.Exception Ex)
{
return Ex.Message.ToString();
}
}
else
{
return "您输入的地址不正确";
}

}
public string ByteGetContentClean(string strUrl)
{
///<summary>
///字节方式读取网页内容,返回网页过滤掉HTML标签后内容的字符(保留<br>标记),传入要抓取的网页地址
///</summary>

string strContent;
strContent = ByteGetContent(strUrl);
// strContent = Regex.Replace(strContent.ToLower(),@"[^(<body>(.|\n)*<\/body>)]","");
strContent = Regex.Replace(strContent.ToLower(),@"(?!<br>|<br\/>)<.*?>","");
return strContent;
}

public string StreamGetContent(string strUrl)
{
///<summary>
///流方式读取网页内容,返回网页内容的全部字符,传入要抓取的网页地址
///</summary>

strUrl = FormatString(strUrl);

if (CheckURL(strUrl))
{
try
{
string strContent;
WebClient myclien = new WebClient();

System.IO.StreamReader mystream = new System.IO.StreamReader(myclien.OpenRead(strUrl),System.Text.Encoding.GetEncoding("gb2312"));
strContent = mystream.ReadToEnd().ToString().Trim();

return strContent;
}
catch(System.Exception Ex)
{
return Ex.Message.ToString();
}
}
else
{
return "您输入的地址不正确";
}
}
public string StreamGetContentClean(string strUrl)
{
///<summary>
///流方式读取网页内容,返回网页过滤掉HTML标签后内容的字符(保留<br>标记),传入要抓取的网页地址
///</summary>

string strContent;
strContent = StreamGetContent(strUrl);
// strContent = Regex.Replace(strContent.ToLower(),@"[^(<body>(.|\n)*<\/body>)]","");
strContent = Regex.Replace(strContent.ToLower(),@"(?!<br>|<br\/>)<.*?>","");
return strContent;
}

private bool CheckURL(string strUrl)
{
///<summary>
///检测输入的地址格式
///</summary>

if (Regex.IsMatch(strUrl,@"(\s|\n|^)(\w+://[^\s\n]+)"))
{
return true;
}
else
{
return false;
}
}
private string FormatString(string strUrl)
{
///<summary>
///检测输入的地址格式有没有包含URL前缀
///</summary>

if (strUrl.ToLower().Substring(0,7) != "http://")
{
strUrl = "http://" + strUrl;
}
return strUrl;
}
}
}

qingping21cn 2005-01-12
  • 打赏
  • 举报
回复
mark
LoveCherry 2005-01-12
  • 打赏
  • 举报
回复
HttpWebRequest request;
HttpWebResponse response;
request=(HttpWebRequest)WebRequest.Create("需要获取html代码的页面地址");
response=(HttpWebResponse)request.GetResponse();
System.IO.StreamReader sr=new System.IO.StreamReader(response.GetResponseStream(),System.Text.Encoding.GetEncoding("gb2312"));
string s=sr.ReadToEnd();
sr.Close();
//字符串s就是你想要的
sequelbo 2005-01-12
  • 打赏
  • 举报
回复
private string Get_Http(string a_strUrl)
{
string strResult ;
try
{
HttpWebRequest myReq = (HttpWebRequest)
System.Net.WebRequest.Create(a_strUrl) ;





/*NetworkCredential NetIc = new NetworkCredential("yub","168168","yyyy");
System.Net.WebProxy m=new WebProxy("10.88.10.88",8080);

myReq.Proxy=m;
myReq.Proxy.Credentials=NetIc;*/

System.Net.

myReq.PreAuthenticate=true;
myReq.Credentials=this.Lisen();

HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream () ;
StreamReader sr = new StreamReader(myStream , Encoding.Default);
StringBuilder strBuilder = new StringBuilder();
while (-1 != sr.Peek())
{
strBuilder.Append(sr.ReadLine()+"\r\n");
}
strResult = strBuilder.ToString();
HttpWResp.Close();
}
catch(Exception exp)
{
strResult = "错误:" + exp.Message ;
}
return strResult ;

}
xjtao 2005-01-12
  • 打赏
  • 举报
回复
新浪新闻下载客户端下载地址:www.news07.net
xjtao 2005-01-12
  • 打赏
  • 举报
回复
如有兴趣,可以多交流,与我联系:

xjtao@msn.com
xjtao 2005-01-12
  • 打赏
  • 举报
回复
我曾写过一个专门即时提取新浪新闻的服务端程序,只提取到其新闻文章,过滤其它代码,纳入数据库,再作为数据流发分给客户端或网站,作为新闻数据源。


其中提取目标网页代码的函数:
//取指定链接网页的源代码
public string SourceCode(string SinaURL)
{
try
{
WebClient wc = new WebClient();
byte[] data = wc.DownloadData(SinaURL);
string HtmlCode = Encoding.Default.GetString(data);
wc.Dispose();
return HtmlCode;
}
catch(Exception ex)
{
System.Diagnostics.Debug.Write(ex.ToString());
return null;
}
}

根据提到的代码再作分析,作下一步的处理。
yellowhwb 2005-01-12
  • 打赏
  • 举报
回复
还有一个用来分析html的类,再gotdotnet网上能找到叫SgmlReader类,XMLReader类是不能用来分析html代码的!
LoveCherry 2005-01-12
  • 打赏
  • 举报
回复
http://www.riveastking.com/treatise/program/softSoul.htm
yellowhwb 2005-01-12
  • 打赏
  • 举报
回复
要保存“固定范围内的东西”就要对网页的内容(即html字符串)进行分析,然后提取,用正则表达式比较好!
yellowhwb 2005-01-12
  • 打赏
  • 举报
回复
用HttpWebRequest和HttpWebResponse类获取网页等internet上的资源
zachary7833 2005-01-12
  • 打赏
  • 举报
回复

还要加上
using mshtml;

我觉的用IHTMLDocument2分析网页最简单的
zachary7833 2005-01-12
  • 打赏
  • 举报
回复
private void button1_Click(object sender, System.EventArgs e)
{
object Zero = 0;
object EmptyString = "";
axWebBrowser1.Navigate(textBox1.Text,ref Zero, ref EmptyString, ref EmptyString, ref EmptyString);

}

private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
IHTMLDocument2 HTMLDocument =(IHTMLDocument2) axWebBrowser1.Document;
IHTMLElementCollection links = HTMLDocument.links;

listBox1.Items.Clear();

foreach (HTMLAnchorElementClass el in links)
{
listBox1.Items.Add(el.outerHTML);
}

}

链接列在listBox1里
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧