网页数据抓取软件( 具体分析如下实现抓取和分析网页类,实例分析(图))

优采云 发布时间: 2021-10-13 23:31

  网页数据抓取软件(

具体分析如下实现抓取和分析网页类,实例分析(图))

  爬取分析网页类示例的C#实现

  更新时间:2015-05-25 10:53:05 作者:莫翔

  本文文章主要介绍爬取分析网页的C#实现,实例分析了C#抓取分析网页中的文字和连接的相关使用技巧。有一定的参考价值,有需要的朋友可以参考以下

  本文介绍了爬取和分析网页的 C# 实现。分享给大家,供大家参考。具体分析如下:

  以下是用于抓取和分析网页的类。

  它的主要功能是:

  1、 提取网页的纯文本,转到所有html标签和javascript代码

  2、 提取网页链接,包括href、frame和iframe

  3、 提取网页标题等(其他标签类推,规律相同)

  4、 可以实现简单的表单提交和cookie保存

  

/*

* Author:Sunjoy at CCNU

* 如果您改进了这个类请发一份代码给我(ccnusjy 在gmail.com)

*/

using System;

using System.Data;

using System.Configuration;

using System.Net;

using System.IO;

using System.Text;

using System.Collections.Generic;

using System.Text.RegularExpressions;

using System.Threading;

using System.Web;

///

/// 网页类

///

public class WebPage

{

#region 私有成员

private Uri m_uri; //网址

private List m_links; //此网页上的链接

private string m_title; //此网页的标题

private string m_html; //此网页的HTML代码

private string m_outstr; //此网页可输出的纯文本

private bool m_good; //此网页是否可用

private int m_pagesize; //此网页的大小

private static Dictionary webcookies = new Dictionary();//存放所有网页的Cookie

private string m_post; //此网页的登陆页需要的POST数据

private string m_loginurl; //此网页的登陆页

#endregion

#region 私有方法

///

/// 这私有方法从网页的HTML代码中分析出链接信息

///

/// List

private List getLinks()

{

if (m_links.Count == 0)

{

Regex[] regex = new Regex[2];

regex[0] = new Regex("(?m)]*>(?(\\w|\\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);

for (int i = 0; i < 2; i++)

{

Match match = regex[i].Match(m_html);

while (match.Success)

{

try

{

string url = new Uri(m_uri, match.Groups["url"].Value).AbsoluteUri;

string text = "";

if (i == 0) text = new Regex("(]+>)|(\\s)|( )|&|\"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");

Link link = new Link(url, text);

m_links.Add(link);

}

catch(Exception ex){Console.WriteLine(ex.Message); };

match = match.NextMatch();

}

}

}

return m_links;

}

///

/// 此私有方法从一段HTML文本中提取出一定字数的纯文本

///

/// HTML代码

/// 提取从头数多少个字

/// 是否要链接里面的字

/// 纯文本

private string getFirstNchar(string instr, int firstN, bool withLink)

{

if (m_outstr == "")

{

m_outstr = instr.Clone() as string;

m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase ).Replace(m_outstr, "");

m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase ).Replace(m_outstr, "");

m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase ).Replace(m_outstr, "");

if (!withLink) m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");

Regex objReg = new System.Text.RegularExpressions.Regex("(]+?>)| ", RegexOptions.Multiline | RegexOptions.IgnoreCase);

m_outstr = objReg.Replace(m_outstr, "");

Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);

m_outstr = objReg2.Replace(m_outstr, " ");

}

return m_outstr.Length > firstN ? m_outstr.Substring(0, firstN) : m_outstr;

}

///

/// 此私有方法返回一个IP地址对应的无符号整数

///

/// IP地址

///

private uint getuintFromIP(IPAddress x)

{

Byte[] bt = x.GetAddressBytes();

uint i = (uint)(bt[0] * 256 * 256 * 256);

i += (uint)(bt[1] * 256 * 256);

i += (uint)(bt[2] * 256);

i += (uint)(bt[3]);

return i;

}

#endregion

#region 公有文法

///

/// 此公有方法提取网页中一定字数的纯文本,包括链接文字

///

/// 字数

///

public string getContext(int firstN)

{

return getFirstNchar(m_html, firstN, true);

}

///

/// 此公有方法提取网页中一定字数的纯文本,不包括链接文字

///

///

///

public string getContextWithOutLink(int firstN)

{

return getFirstNchar(m_html, firstN, false);

}

///

/// 此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式

///

/// 正则式

/// 返回的链接的个数

/// List

public List getSpecialLinksByUrl(string pattern,int count)

{

if(m_links.Count==0)getLinks();

List SpecialLinks = new List();

List.Enumerator i;

i = m_links.GetEnumerator();

int cnt = 0;

while (i.MoveNext() && cnt=getuintFromIP(ip_start) && getuintFromIP(ip) 1 (?(?:\w|\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase );

Match mc = reg.Match(m_html);

if (mc.Success)

m_title= mc.Groups["title"].Value.Trim();

}

return m_title;

}

}

///

/// 此属性获得本网页的所有链接信息,只读

///

public List Links

{

get

{

if (m_links.Count == 0) getLinks();

return m_links;

}

}

///

/// 此属性返回本网页的全部纯文本信息,只读

///

public string Context

{

get

{

if (m_outstr == "") getContext(Int16.MaxValue);

return m_outstr;

}

}

///

/// 此属性获得本网页的大小

///

public int PageSize

{

get

{

return m_pagesize;

}

}

///

/// 此属性获得本网页的所有站内链接

///

public List InsiteLinks

{

get

{

return getSpecialLinksByUrl("^http://"+m_uri.Host,Int16.MaxValue);

}

}

///

/// 此属性表示本网页是否可用

///

public bool IsGood

{

get

{

return m_good;

}

}

///

/// 此属性表示网页的所在的网站

///

public string Host

{

get

{

return m_uri.Host;

}

}

///

/// 此网页的登陆页所需的POST数据

///

public string PostStr

{

get

{

return m_post;

}

}

///

/// 此网页的登陆页

///

public string LoginURL

{

get

{

return m_loginurl;

}

}

#endregion

}

///

/// 链接类

///

public class Link

{

public string url; //链接网址

public string text; //链接文字

public Link(string _url, string _text)

{

url = _url;

text = _text;

}

}

  我希望这篇文章对你的 C# 编程有所帮助。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线