2006年09月26日

using System.Management;

/// <summary>
/// 获取MAC地址
/// </summary>
/// <returns></returns>
public string GetNetCardMacAddress()
{
ManagementClass mc;
ManagementObjectCollection moc;
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
moc = mc.GetInstances();
string str = "";
foreach(ManagementObject mo in moc)
{
if((bool)mo["IPEnabled"] == true)
str = mo["MacAddress"].ToString();

}
return str;
}

/// <summary>
/// C盘序列号
/// </summary>
/// <returns></returns>
public string GetDiskVolumeSerialNumber()
{
ManagementObject disk;
disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}

2006年09月23日

一、本机直接上网时:
#region 获取指定远程网页内容
/// <summary>
/// 获取指定远程网页内容
/// </summary>
/// <param name="strUrl">所要查找的远程网页地址</param>
/// <param name="timeout">超时时长设置,一般设置为8000</param>
/// <param name="enterType">是否输出换行符,0不输出,1输出文本框换行</param>
/// <param name="EnCodeType">编码方式</param>
/// <returns></returns>
/// 也可考虑 static string

public string GetRequestString(string strUrl,int timeout,int enterType,Encoding EnCodeType)
{
string strResult;
try
{
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl) ;
myReq.Timeout = timeout;
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream () ;
StreamReader sr = new StreamReader(myStream , EnCodeType);
StringBuilder strBuilder = new StringBuilder();

while (-1 != sr.Peek())
{
strBuilder.Append(sr.ReadLine());
if(enterType==1)
{
strBuilder.Append("\r\n");
}
}
strResult = strBuilder.ToString();
}
catch(Exception err)
{
strResult = "请求错误:" + err.Message;
}
return strResult ;
}

#endregion二:通过域环境代理上网时这样就不行了!

private void Page_Load(object sender, System.EventArgs e)
{

string url1 = "http://csharp.xdowns.com";
string url2 = "http://csharp.xdowns.com/logo.gif";
Response.Write("<li>方法1:");
Response.Write(url1 + " 存在:" + UrlExistsUsingHttpWebRequest(url1).ToString());
Response.Write("<li>方法2:");
Response.Write(url1 + " 存在:" + UrlExistsUsingSockets(url1).ToString());
Response.Write("<li>方法3:");
Response.Write(url1 + " 存在:" + UrlExistsUsingXmlHttp(url1).ToString());

Response.Write("<li>方法1:");
Response.Write(url2 + " 存在:" + UrlExistsUsingHttpWebRequest(url2).ToString());
Response.Write("<li>方法3:");
Response.Write(url2 + " 存在:" + UrlExistsUsingXmlHttp(url2).ToString());
}
private bool UrlExistsUsingHttpWebRequest(string url)
{
try
{
System.Net.HttpWebRequest myRequest =(System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
myRequest.Method = "HEAD";
myRequest.Timeout = 100;
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)myRequest.GetResponse();
return (res.StatusCode == System.Net.HttpStatusCode.OK);
}
catch(System.Net.WebException we)
{
System.Diagnostics.Trace.Write(we.Message);
return false;
}
}
private bool UrlExistsUsingXmlHttp(string url)
{
//注意:此方法需要引用Msxml2.dll
MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
_xmlhttp.open("HEAD",url,false,null,null);
_xmlhttp.send("");
return (_xmlhttp.status == 200 );
}

private bool UrlExistsUsingSockets(string url)
{
if(url.StartsWith("http://")) url = url.Remove(0,"http://".Length);
try
{
System.Net.IPHostEntry ipHost = System.Net.Dns.Resolve(url);
return true;
}
catch (System.Net.Sockets.SocketException se)
{
System.Diagnostics.Trace.Write(se.Message);
return false;
}
}

//取得输入的URL地址
PageUrl = UrlText.Text;
WebClient wc = new WebClient();
//把已登录的用户或正被模拟的用户的用户凭据赋给用于对向Internet资源的请求进行身份验证的网络凭据
wc.Credentials = CredentialCache.DefaultCredentials;

///方法一:
///从指定的URI下载数据
Byte[] pageData = wc.DownloadData(PageUrl);
//把下载到的字符型数组数据转换成字符串类型
ContentHtml.Text = Encoding.Default.GetString(pageData);

/// 方法二
//为指定的URI打开一个可读的数据流,并定义一个该流的引用
/// Stream resStream = wc.OpenRead(PageUrl);
/// 根据上面定义的数据流,以默认编码的方式定义一个读数据流
/// StreamReader sr = new StreamReader(resStream,System.Text.Encoding.Default);
/// 读取数据流中的内容
/// ContentHtml.Text = sr.ReadToEnd();
/// //关闭数据流
/// resStream.Close();
/// 
//释放资源
wc.Dispose();  

PageUrl = UrlText.Text;
//根据指定的UR建立WEB请求
WebRequest  request = WebRequest.Create(PageUrl);
//定义对上面WEB请求的反应
WebResponse response = request.GetResponse();
//取得WEB响应的数据流
Stream resStream = response.GetResponseStream();
//根据上面定义的数据流,以默认编码的方式定义一个读数据流
StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);
// 读取数据流中的内容
ContentHtml.Text = sr.ReadToEnd();
//关闭数据流
resStream.Close();
//关闭读数据流并释放资源
sr.Close();

NetBug–爬虫 V1.02开发笔记

背景

随着Internet的普及,网络信息正以极高的速度增长,在这么多数据中找到自己需要的信息是一件很繁琐的事情,找到需要的信息后如何获取也是件麻烦的事。这就需要Internet信息抓取程序来代替人工的操作。

所谓Internet信息抓取程序,就是程序会按照用户的关键词或关键网站来收集相应的信息,并提供给用户想要的信息格式。

信息量的增加会带来信息网站发布人员工作量的剧增,为实现信息发布系统实现信息自

动发布、减少工作人员工作量、即时跟踪最新信息,就需要自动信息提供程序,因此Internet信息抓取程序应运而生。

目标

实现自定义网站信息分类抓取,存入本地数据库、生成静态页面或其它用户定义的信息结构,并下载与信息相关的多媒体文件。

开发

l 目标站点结构分析

本步骤是准确抓取信息个关键。

首先要选择更新频率高的页面做为抓取地址,然后分析要抓取内容页面url特点。

然后分析要抓取信息页面的元素特性,比如标题位置,内容位置 等,得到定位标记点。

将以上信息写成自己的配置文件或存到数据库中。

每个网站都需要分析,写出单独的配置文件,供抓取程序使用。

l 信息提取

根据配置文件取得要抓取页面url,使用HttpWebRequest类获取内容:

//获取http页面函数

public string Get_Http(string a_strUrl,int timeout)

{

string strResult ;

try

{

HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl) ;

myReq.Timeout = timeout;

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();

}

catch(Exception exp)

{

strResult = "错误:" + exp.Message ;

}

return strResult ;

}

获取页面内容后,分析页面中连接地址取到要抓取的url:

//处理页面标题和链接

public string SniffWebUrl( string urlStr,string blockB,string blockE )

{

string urlch1 = "";

string urlch2 = "";

int end_n1 = 0;

int end_nums = 0;

int end_nums1 = 0;

int end_nums2 = 0;

int end_nums3 = 0;

string reUTStr = "";

string reTitle = "";

string ret = "";

try

{

int pos01 = urlStr.IndexOf( "." );

int pos02 = urlStr.LastIndexOf( "/" );

if( pos01 < 0 )

{

return "";

}

if( pos02 < 0 )

{

return "";

}

int pos03 = urlStr.IndexOf( "/",pos01 );

if ( pos03 < 0 )

{

urlch1 = urlStr;

urlch2 = urlStr;

}

else

{

urlch1 = urlStr.Substring( 0,pos03 );

urlch2 = urlStr.Substring( 0,pos02 );

}

string tmpAllStr = new PublicFun().Get_Http( urlStr ,time1);

int pos1 = tmpAllStr.IndexOf( blockB );

int pos2 = tmpAllStr.IndexOf( blockE,pos1 + blockB.Length );

if ( pos1>0 && pos2>0 && pos2>pos1 )

{

ret = tmpAllStr.Substring( pos1 + blockB.Length,pos2 – pos1 – blockB.Length );

ret = ret.Substring( ret.IndexOf( "<" ));

while( ret.IndexOf( "<A" ) >= 0 )

{

ret = ret.Substring( 0,ret.IndexOf( "<A" ) ) + "<a" + ret.Substring( ret.IndexOf( "<A" ) + 2 );

}

while( ret.IndexOf( "</A" ) >=0 )

{

ret = ret.Substring( 0,ret.IndexOf( "</A" ) ) + "</a" + ret.Substring( ret.IndexOf( "</A" ) + 3 );

}

while( ret.IndexOf( "Href=" ) >=0 )

{

ret = ret.Substring( 0,ret.IndexOf( "Href=" )) + "href=" + ret.Substring( ret.IndexOf( "Href=" ) + 5 );

}

while( ret.IndexOf( "HREF=" ) >=0 )

{

ret = ret.Substring( 0,ret.IndexOf( "HREF=" )) + "href=" + ret.Substring( ret.IndexOf( "HREF=" ) + 5 );

}

while( ret.IndexOf( "href=’" ) >=0 )

{

ret = ret.Substring( 0,ret.IndexOf( "href=’" )) + "href=\"" + ret.Substring( ret.IndexOf( "href=’" ) + 6 );

}

}

tmpAllStr = ret;

int begin_nums = tmpAllStr.IndexOf( "href=" );

while ( begin_nums >= 0 )

{

string tmpStrA = "";

string tmpStrB = tmpAllStr.Substring( begin_nums + 5,1 );

if ( tmpStrB == "\"" )

{

end_n1 = begin_nums + 6;

if ( ( end_n1 + 1 ) > tmpAllStr.Length )

{

return "";

}

tmpStrA = tmpAllStr.Substring( begin_nums+6,1 );

}

else

{

end_n1 = begin_nums + 5;

tmpStrA = tmpStrB;

}

if ( tmpStrA == "#" )

{

tmpAllStr = tmpAllStr.Substring( end_n1 );

begin_nums = tmpAllStr.IndexOf( "href=" );

}

else

{

end_nums1 = tmpAllStr.IndexOf( " ",end_n1 );

end_nums2 = tmpAllStr.IndexOf( ">",end_n1 );

end_nums3 = tmpAllStr.IndexOf( "</a",end_nums2 );

if ( ( end_nums3 >= 0 ) && ( end_nums2 >= 0 ) )

{

reTitle = tmpAllStr.Substring( end_nums2 + 1,end_nums3 – end_nums2 – 1 );

if ( end_nums1 > end_nums2 )

{

end_nums = end_nums2;

}

else

{

if ( end_nums1 < 0 )

{

end_nums = end_nums2;

}

else

{

end_nums = end_nums1;

}

}

string str4 = tmpAllStr.Substring( end_nums-1, end_nums – end_nums + 1 );

if ( str4 =="\"" || str4 == "’" )

{

end_nums = end_nums – 1;

}

string sTotalOne = tmpAllStr.Substring( end_n1,end_nums – end_n1 );

if ( sTotalOne.IndexOf( "http://" ) <0 )

{

if ( sTotalOne.IndexOf( "/" ) == 0 )

{

sTotalOne = urlch1 + sTotalOne;

}

else

{

int linshiIntNum = 0;

int flags = 0;

string urlChange = urlStr;;

while( sTotalOne.IndexOf( "../" ) >= 0 )

{

sTotalOne = sTotalOne.Substring( sTotalOne.IndexOf( "../" ) + 3 );

linshiIntNum = linshiIntNum + 1;

flags = flags +1;

}

while( ( urlChange.LastIndexOf( "/" ) >= 0 ) && ( linshiIntNum >= 0 ) )

{

urlChange = urlChange.Substring( 0,urlChange.LastIndexOf( "/" ) );

linshiIntNum = linshiIntNum – 1;

}

if ( flags == 0 )

{

sTotalOne = urlch2 + "/" + sTotalOne;

}

else

{

sTotalOne = urlChange + "/" + sTotalOne;

}

}

}

reUTStr = reUTStr + new PublicFun().RemoveHtmlCode( reTitle ) + sTotalOne;

tmpAllStr = tmpAllStr.Substring( end_nums3 + 4 );

begin_nums = tmpAllStr.IndexOf( "href=" );

}

else

{

begin_nums = -1;

}

}

}

return reUTStr;

}

catch( Exception e)

{

return "";

}

}

得到要抓取内容的url后,处理该页面:

//获取链接内容并分类处理

public string GetWebContent( string gatherUrl,string subUrl,string subTitle,string b_Content,string e_Content,string b_Filter,string e_Filter,string root )

{

string tmpAllStr = "";

string dfStrB = "";

string dfStrE = "";

string rePicStr = "";//图片返回路径

string reContentStr = "";

string picHtml = "images"; //本地图片路径

string urlch1 ="";

string urlch2 ="";

int pos1 = gatherUrl.IndexOf( "." );

int pos2 = gatherUrl.LastIndexOf( "/" );

if( pos1 < 0 )

{

return "";

}

if( pos2 < 0 )

{

return "";

}

int pos3 = gatherUrl.IndexOf( "/",pos1 );

if ( pos3 < 0 )

{

urlch1 = gatherUrl;

urlch2 = gatherUrl;

}

else

{

urlch1 = gatherUrl.Substring( 0,pos3 );

urlch2 = gatherUrl.Substring( 0,pos2 );

}

tmpAllStr = new PublicFun().Get_Http( subUrl,time1 );

//取稿源

string docFromStr = "";

if ( dfStrB != "" && dfStrE != "" )

{

if ( tmpAllStr != "" )

{

int b_docF = tmpAllStr.IndexOf( dfStrB );

if ( b_docF > 0 )

{

int e_docF = tmpAllStr.IndexOf( dfStrE,b_docF + dfStrB.Length );

if ( e_docF > 0 && e_docF > b_docF && e_docF – b_docF < 20 )

{

docFromStr = tmpAllStr.Substring( b_docF + dfStrB.Length, e_docF – b_docF – dfStrB.Length );

}

}

}

}

//取内容

if ( tmpAllStr != "" )

{

int begin_strnum = tmpAllStr.IndexOf( b_Content );

if ( begin_strnum < 0 )

{

return "";

}

int end_strnum = tmpAllStr.IndexOf( e_Content,begin_strnum + b_Content.Length );

if ( end_strnum < 0 )

{

return "";

}

string sTotalSubM = "";

if ( end_strnum > begin_strnum )

{

sTotalSubM = tmpAllStr.Substring ( begin_strnum,end_strnum – begin_strnum );

}

if ( sTotalSubM == "" )

{

return "";

}

//过滤无用信息

int bfnum = sTotalSubM.IndexOf( b_Filter );

if ( bfnum > -1 )

{

int efnum = sTotalSubM.IndexOf( e_Filter,bfnum );

if ( efnum > -1 )

{

if ( efnum > bfnum )

{

sTotalSubM = sTotalSubM.Substring( 0,bfnum ) + sTotalSubM.Substring( efnum + e_Filter.Length );

}

}

}

//格式化图片标记

while( sTotalSubM.IndexOf( "Src=" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "Src=" ) ) + "src=" + sTotalSubM.Substring( sTotalSubM.IndexOf( "Src=" ) + 4 );

}

while( sTotalSubM.IndexOf( "SRC=" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "SRC=" ) ) + "src=" + sTotalSubM.Substring( sTotalSubM.IndexOf( "SRC=" ) + 4 );

}

while( sTotalSubM.IndexOf( "src=’" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "src=’" ) ) + "src=\"" + sTotalSubM.Substring( sTotalSubM.IndexOf( "src=’" ) + 5 );

}

//取图片地址

int end_n12 = 0;

int end_nums2 = 0;

int begin_nums2 = sTotalSubM.IndexOf( "src=" );

while( begin_nums2 >= 0 )

{

String tmpStr = sTotalSubM.Substring( begin_nums2 + 4,1 );

if ( tmpStr == "\"" )

{

end_n12 = begin_nums2 + 5;

}

else

{

end_n12 = begin_nums2 + 4;

}

int end_nums2a = sTotalSubM.IndexOf( " ",end_n12 );

int end_nums2b = sTotalSubM.IndexOf( ">",end_n12 );

if ( end_nums2b < 0 )

{

break;

}

if ( end_nums2a > end_nums2b )

{

end_nums2 = end_nums2b;

}

else

{

if (end_nums2a<0)

{

end_nums2 = end_nums2b;

}

else

{

end_nums2 = end_nums2a;

}

}

tmpStr = sTotalSubM.Substring( end_nums2-1,1 );

if ( tmpStr == "\"" || tmpStr == "’" )

{

end_nums2 = end_nums2 – 1;

}

string tmpPicStr = sTotalSubM.Substring( end_n12,end_nums2 – end_n12 );

if ( tmpPicStr.IndexOf( "http://" ) < 0 )

{

if ( tmpPicStr.IndexOf( "/" ) == 0 )

{

tmpPicStr = urlch1 + tmpPicStr;

}

else

{

int linshiIntNum = 0;

int flags = 0;

string urlChange = subUrl;

while( tmpPicStr.IndexOf( "../" ) >= 0 )

{

tmpPicStr = tmpPicStr.Substring( tmpPicStr.IndexOf("../") + 3 );

linshiIntNum = linshiIntNum + 1;

flags = flags + 1;

}

while( ( urlChange.LastIndexOf( "/" ) >= 0 ) && ( linshiIntNum >= 0 ) )

{

urlChange = urlChange.Substring( 0,urlChange.LastIndexOf( "/" ) );

linshiIntNum = linshiIntNum – 1;

}

if ( flags == 0 )

{

tmpPicStr = urlch2 + "/" + tmpPicStr;

}

else

{

tmpPicStr = urlChange + "/" + tmpPicStr;

}

}

}

//tmpPicStr = tmpPicStr.ToLower();

string tmpPicStrTmp = tmpPicStr.ToLower();

//if ( tmpPicStr.IndexOf( ".jpg" ) > 0 || tmpPicStr.IndexOf( ".gif" ) > 0 || tmpPicStr.IndexOf( ".bmp" ) > 0 )

if ( tmpPicStrTmp.IndexOf( ".jpg" ) > 0 || tmpPicStrTmp.IndexOf( ".gif" ) > 0 || tmpPicStrTmp.IndexOf( ".bmp" ) > 0 )

{

rePicStr = rePicStr + "||" + tmpPicStr ;

int flagN2 = tmpPicStr.LastIndexOf( "/" );

string fileN2 = picHtml + tmpPicStr.Substring( flagN2 );

sTotalSubM = sTotalSubM.Substring( 0,end_nums2 ) + ">******" + fileN2 + "******<" + sTotalSubM.Substring( end_nums2 );

begin_nums2 = sTotalSubM.IndexOf( "src=", end_nums2 + fileN2.Length + 22 );

}

else

{

begin_nums2 = sTotalSubM.IndexOf( "src=", end_nums2 + 4 );

}

}

if ( rePicStr.Length > 2 )

rePicStr = rePicStr.Substring(2);

//内容处理 格式化关键标记

while( sTotalSubM.IndexOf( "<P" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<P" ) ) + "|****|<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<P" ) + 2 );

}

while( sTotalSubM.IndexOf( "<p" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<p" ) ) + "|****|<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<p" ) + 2 );

}

while( sTotalSubM.IndexOf( "</P" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "</P" ) ) + "|****|<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "</P" ) + 3 );

}

while( sTotalSubM.IndexOf( "</p" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "</p" ) ) + "|****|<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "</p" ) + 3 );

}

while( sTotalSubM.IndexOf( "<br" ) >=0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<br" ) ) + "+****+<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<br" ) + 3 );

}

while( sTotalSubM.IndexOf( "<BR" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<BR" ) ) + "+****+<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<BR" ) + 3 );

}

while( sTotalSubM.IndexOf( "<Br" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<Br" ) ) + "+****+<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<Br" ) + 3 );

}

while( sTotalSubM.IndexOf( "<bR" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "<bR" ) ) + "+****+<" + sTotalSubM.Substring( sTotalSubM.IndexOf( "<bR" ) + 3 );

}

//去除html标记

int linshiInt1 = sTotalSubM.IndexOf( "<" );

int linshiInt2 = sTotalSubM.IndexOf( ">" );

if ( linshiInt2 < linshiInt1 )

{

sTotalSubM = sTotalSubM.Substring( linshiInt2 + 1 );

}

int linshiInt11 = sTotalSubM.LastIndexOf( "<" );

int linshiInt12 = sTotalSubM.LastIndexOf( ">" );

if ( linshiInt12 < linshiInt11 )

{

sTotalSubM = sTotalSubM.Substring( 0,linshiInt12 + 1 );

}

linshiInt1 = sTotalSubM.IndexOf( "<" );

while ( linshiInt1 >= 0 )

{

linshiInt2 = sTotalSubM.IndexOf( ">",linshiInt1 );

if ( linshiInt2 >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,linshiInt1 ) + sTotalSubM.Substring( linshiInt2 + 1 );

}

else

{

sTotalSubM = sTotalSubM.Substring( 0,linshiInt1 );

}

linshiInt1 = sTotalSubM.IndexOf("<");

}

//还原关键标记

int linshiInt3 = 0;

int linshiInt4 = 0;

while( sTotalSubM.IndexOf( "+****+" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "+****+" ) ) + "<br>\n" + sTotalSubM.Substring( sTotalSubM.IndexOf( "+****+" ) + 9 );

}

while( sTotalSubM.IndexOf( "|****|" ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( "|****|" ) ) + "<br>\n" + sTotalSubM.Substring( sTotalSubM.IndexOf( "|****|" ) + 9 );

}

while( sTotalSubM.IndexOf( "******" ) >= 0 )

{

linshiInt3 = sTotalSubM.IndexOf( "******" ) + 9;

linshiInt4 = sTotalSubM.IndexOf( "******",linshiInt3 );

if ( linshiInt4 >= 0 )

{

int tmpPos = sTotalSubM.IndexOf( "******" );

string tmpStr1 = sTotalSubM.Substring( 0,tmpPos );

string tmpStr2 = sTotalSubM.Substring( linshiInt3,linshiInt4 – linshiInt3 );

string tmpStr3 = sTotalSubM.Substring( linshiInt4 + 9 );

sTotalSubM = tmpStr1 + "<img src=" + tmpStr2 + ">" + tmpStr3;

}

else

{

break;

}

}

//去除内容中的标题

if ( sTotalSubM.IndexOf( subTitle ) >= 0 )

{

sTotalSubM = sTotalSubM.Substring( 0,sTotalSubM.IndexOf( subTitle ) ) + sTotalSubM.Substring( sTotalSubM.IndexOf( subTitle ) + subTitle.Length );

}

reContentStr = sTotalSubM;

//调用下载图片功能

//下载图片到指定目录

string[] img_Url = new PublicFun().split( rePicStr,"||" );

for ( int i=0;i<img_Url.Length;i++ )

{

if ( img_Url[i] != "" )

{

new PublicFun().Get_Img( img_Url[i],10000,root + "\\images\\" + img_Url[i].Substring( img_Url[i].LastIndexOf("/")+1 ) );

}

}

}

return reContentStr;

}

以上方法返回要取得的信息,包括标题内容,图片地址等。

下载页面中图片:

//下载图片

public void Get_Img(string a_strUrl,int timeout,string filepath)

{

try

{

HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl) ;

myReq.Timeout = timeout;

HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();

Stream myStream = HttpWResp.GetResponseStream () ;

Bitmap map = new Bitmap( myStream );

PictureBox picB = new PictureBox();

picB.Image = (Image)map;

string path = filepath.Substring( 0,filepath.LastIndexOf( "\\" ) );

if (!Directory.Exists(path))

{

CreateDir( path );

}

picB.Image.Save(filepath);

}

catch(Exception exp)

{

string ss = exp.Message;

WriteLog( filepath.Substring(0,filepath.LastIndexOf("\\")) + "\\error.log",a_strUrl + "–" + ss + "\r\n");

}

}

l 保存文件或入库

上面取得的信息可以按自己的要求保存。

****设计的时候没有使用url按层次循环抓取,这样定义抓取url效率更高,速度更快。

测试程序下载:http://bjfile.focus.cn/file/15379/NetBugV102.rar

如有建议请发送EMail:xiancai@qianlong.com 或msn yutao728@hotmail.com

注:此版本只提供静态文件存储功能,不提供数据库接口,不提供自定义网站功能。

本程序运行需要先安装.net 框架1.1。

2006年09月07日

1、DateTime 数字型
System.DateTime currentTime=new System.DateTime();
1.1 取当前年月日时分秒
currentTime=System.DateTime.Now;
1.2 取当前年
int 年=currentTime.Year;
1.3 取当前月
int 月=currentTime.Month;
1.4 取当前日
int 日=currentTime.Day;
1.5 取当前时
int 时=currentTime.Hour;
1.6 取当前分
int 分=currentTime.Minute;
1.7 取当前秒
int 秒=currentTime.Second;
1.8 取当前毫秒
int 毫秒=currentTime.Millisecond;
(变量可用中文)

1.9 取中文日期显示——年月日时分
string strY=currentTime.ToString("f"); //不显示秒

1.10 取中文日期显示_年月
string strYM=currentTime.ToString("y");

1.11 取中文日期显示_月日
string strMD=currentTime.ToString("m");

1.12 取当前年月日,格式为:2003-9-23
string strYMD=currentTime.ToString("d");

1.13 取当前时分,格式为:14:24
string strT=currentTime.ToString("t");

2、Int32.Parse(变量) Int32.Parse("常量")
字符型转换 转为32位数字型

3、 变量.ToString()
字符型转换 转为字符串
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%

4、变量.Length 数字型
取字串长度:
如: string str="中国";
int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名

5、System.Text.Encoding.Default.GetBytes(变量)
字码转换 转为比特码
如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);
然后可得到比特长度:
len = bytStr.Length;

6、System.Text.StringBuilder("")
字符串相加,(+号是不是也一样?)
如:System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("中华");
sb.Append("人民");
sb.Append("共和国");

7、变量.Substring(参数1,参数2);
截取字串的一部分,参数1为左起始位数,参数2为截取几位。
如:string s1 = str.Substring(0,2);

8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
取远程用户IP地址

9、穿过代理服务器取远程用户真实IP地址:
if(Request.ServerVariables["HTTP_VIA"]!=null){
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
}

10、 Session["变量"];
存取Session值;
如,赋值: Session["username"]="小布什";

取值: Object objName=Session["username"];
String strName=objName.ToString();
清空: Session.RemoveAll();

11、String str=Request.QueryString["变量"];
用超链接传送变量。
如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>
在Edit.aspx页中取值:String str=Request.QueryString["fdid"];

12、DOC对象.CreateElement("新建节点名");
创建XML文档新节点

13、父节点.AppendChild(子节点);
将新建的子节点加到XML文档父节点下

14、 父节点.RemoveChild(节点);
删除节点

15、Response
Response.Write("字串");
Response.Write(变量);
向页面输出。

Response.Redirect("URL地址");
跳转到URL指定的页面

16、char.IsWhiteSpce(字串变量,位数)——逻辑型
查指定位置是否空字符;
如:
string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。

17、char.IsPunctuation(‘字符’) –逻辑型
查字符是否是标点符号
如:Response.Write(char.IsPunctuation(‘A’)); //返回:False

18、(int)’字符’
把字符转为数字,查代码点,注意是单引号。
如:
Response.Write((int)’中’); //结果为中字的代码:20013

19、(char)代码
把数字转为字符,查代码代表的字符。
如:
Response.Write((char)22269); //返回“国”字。

20、 Trim()
清除字串前后空格

21 、字串变量.Replace("子字串","替换为")
字串替换
如:
string str="中国";
str=str.Replace("国","央"); //将国字换为央字
Response.Write(str); //输出结果为“中央”

再如:(这个非常实用)

string str="这是<script>脚本";
str=str.Replace("<","<font><</font>"); //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
Response.Write(str); //显示为:“这是<script>脚本”

如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。
这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。
具体实现:将你的表单提交按钮脚本加上下面代码:
string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
strSubmit=strSubmit.Replace("<","<font><</font>");
然后保存或输出strSubmit。
用此方法还可以简单实现UBB代码。

22、Math.Max(i,j)
取i与j中的最大值
如 int x=Math.Max(5,10); // x将取值 10

23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

(1)、
string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }

(2)、
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

(3)、
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

24、IndexOf() 、LastIndexOf()
查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如:
str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)

25、Insert()
在字串中指定索引位插入指定字符。如:
str1.Insert(1,"字");在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;

26、PadLeft()、PadRight()
在字串左(或右)加空格或指定char字符,使字串达到指定长度,如:
<%
string str1="中国人";
str1=str1.PadLeft(10,’1′); //无第二参数为加空格
Response.Write(str1); //结果为“1111111中国人” , 字串长为10
%>

27、Remove()
从指定位置开始删除指定数的字符
字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

1、
string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }

2、
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

3、
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

28、IndexOf()
查找字串中指定字符或字串首次出现的位置,返首索引值,如:
str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)

1. 利用如Dw-Mx这样的工具生成html格式的模板,在需要添加格式的地方加入特殊标记(如$),动态生成文件时利用代码读取此模板,然后获得前台输入的内容,添加到此模板的标记位置中,生成新文件名后写入磁盘,写入后再向数据库中写入相关数据。

  2. 使用后台代码硬编码Html文件,可以使用HtmlTextWriter类来写html文件。
  优点
  1. 可以建立非常复杂的页面,利用包含js文件的方法,在js文件内加入document.write()方法可以在所有页面内加入如页面头,广告等内容。
  2. 静态html文件利用MS Windows2000的Index Server可以建立全文搜索引擎,利用asp.net可以以DataTable的方式得到搜索结果。而Win2000的Index服务无法查找xml文件的内容。如果包括了数据库搜索与Index索引双重查找,那么此搜索功能将非常强大。
  3. 节省服务器的负荷,请求一个静态的html文件比一个aspx文件服务器资源节省许多。
  缺点
  思路二: 如果用硬编码的方式,工作量非常大,需要非常多的html代码。调试困难。而且使用硬编码生成的html样式无法修改,如果网站更换样式,那么必须得重新编码,给后期带来巨大的工作量。
  因此这里采用的是第一种思路
  示列代码
  1.定义(template.htm)html模板页面
<html>
<head>
<title>www.webjx.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body >
<table height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000">
<tr>
<td width="100%" valign="middle" align="left">
<span style="color: ;font-size: "></span>
</td>
</tr>
</table>
</body>
</html>
  2.asp.net代码:
//———————读html模板页面到stringbuilder对象里—-
string[] format=new string[4];//定义和htmlyem标记数目一致的数组
StringBuilder htmltext=new StringBuilder();
try
{
  using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名"))
  {
  String line;
  while ((line = sr.ReadLine()) != null)
  {
  htmltext.Append(line);
  }
  sr.Close();
  }
}
catch
{
  Response.Write("<Script>alert(‘读取文件错误’)</Script>");
}
//———————给标记数组赋值————
format[0]="background=\"bg.jpg\"";//背景图片
format[1]= "#990099";//字体颜色
format[2]="150px";//字体大小
format[3]= "<marquee>生成的模板html页面</marquee>";//文字说明
//———-替换htm里的标记为你想加的内容
for(int i=0;i<4;i++)
{
  htmltext.Replace("["+i+"]",format);
}
//———-生成htm文件——————――
try
{
  using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312")))
{
  sw.WriteLine(htmltext);
  sw.Flush();
  sw.Close();
}
}
catch
{
Response.Write ("The file could not be wirte:");
}
  小结
  用此方法可以方便的生成html文件。程序使用了是循环替换,因此对需替换大量元素的模板速度非常快。

2006年08月30日

在MSDN的文档“配置跨应用程序的 Forms 身份验证(http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx)” 中,提出了在Web Farm和多个应用程序之间实现共享身份登陆信息的方法。这个方法实现的其实是场环境下的身份共享,对于跨子域名的单点登陆,如网易和CSDN的通行证的实现,也有很多朋友给出了解决方案,参见:http://www.cnblogs.com/dudu/archive/2005/07/04/186279.html Form验证其实是基于身份cookie的验证。客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web.config里Authentication节form设定的name信息,如 <authentication mode="Forms"> <forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" ></forms> </authentication> 这里,.

第一种是模版替换:
环境:Microsoft .NET Framework SDK v1.1
OS:Windows Server 2003 中文版
ASP.Net生成静态HTML页
在Asp中实现的生成静态页用到的FileSystemObject对象!
在.Net中涉及此类操作的是System.IO
以下是程序代码 注:此代码非原创!参考别人代码
//生成HTML页
public static bool WriteFile(string strText,string strContent,string strAuthor)
{
string path = HttpContext.Current.Server.MapPath("/news/");
Encoding code = Encoding.GetEncoding("gb2312");
// 读取模板文件
string temp = HttpContext.Current.Server.MapPath("/news/text.html");
StreamReader sr=null;
StreamWriter sw=null;
string str="";
try
{
sr = new StreamReader(temp, code);
str = sr.ReadToEnd(); // 读取文件
}
catch(Exception exp)
{
HttpContext.Current.Response.Write(exp.Message);
HttpContext.Current.Response.End();
sr.Close();
}
string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
// 替换内容
// 这时,模板文件已经读入到名称为str的变量中了
str =str.Replace("ShowArticle",strText); //模板页中的ShowArticle
str = str.Replace("biaoti",strText);
str = str.Replace("content",strContent);
str = str.Replace("author",strAuthor);
// 写文件
try
{
sw = new StreamWriter(path + htmlfilename , false, code);
sw.Write(str);
sw.Flush();
}
catch(Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
return true;

此函数放在Conn.CS基类中了

在添加新闻的代码中引用 注:工程名为Hover

if(Hover.Conn.WriteFilethis.Title.Text.ToString),this.Content.Text.ToString),this.Author.Text.ToString)))
{
Response.Write("添加成功");
}
else
{
Response.Write("生成HTML出错!");
}
模板页Text.html代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>ShowArticle</title>
<body>
biaoti
<br>
content<br>
author
</body>
</HTML>
biaoti
<br>
content<br>
author
</body>
</HTML>
  提示添加成功后会出以当前时间为文件名的html文件!上面只是把传递过来的几个参数直接写入了HTML文件中,
在实际应用中需要先添加数据库,然后再写入HTML文件.
第二种:
WebRequest访问aspx页面,然后获取Response流,得到的就是html
private void button1_Click(object sender, System.EventArgs e)
{
textBox1.Text=this.GetUrlValue("http://YourUrl");
}
//使用HttpWebRequest获得URL的返回值
public string GetUrlValue(string url)
{
System.Net.WebRequest HttpWebRequest=System.Net.WebRequest.Create(url);
System.Net.WebResponse HttpWebResponse =HttpWebRequest.GetResponse();
System.IO.StreamReader sr=new System.IO.StreamReader(HttpWebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));
return sr.ReadToEnd();
}

2006年08月28日

M$ 在排挤了 Java 数年之后,有公司发展出一套新的工具,这套工具
可以让 .Net 的东西转换到到 Java 中。Halcyon Software 公布了第一个
Instant .Net (简称iNet) 的测试版本,这个东西是 M$ 的Visual Studio .Net 开发工具的一个嵌入程序,这个程序可以将以XML 为基础的 .Net Web Services 转成 Java 语言,并且让任何支持 Java 的应用程序服务器执行。一般企业的开发者,可以利用 Web Services 让从不同的提供厂商所提供的应用程序透过 Internet 互相沟通。例如,在 Oracle 公司内的资料,可以被 PeopleSoft 公司的 CRM 软件分享使用。

电子钱包也是另外一个 Web Services 的应用,它允许使用者在线上购买的
时候,不用敲入信用卡号码或是其它的信息。

我们可以利用不同的厂商所提供的工具来发展 Web services ,而这些web services则可以透过网络让任何执行不同操作系统的周边装置存取时, M$ 却把 .Net Web Services 锁定在他自己的平台 .Net server software 上。这个软件包含了一个执行环境,当然这个执行环境只能在M$ 的软件上执行。不过这家公司已经将部分的执行环境提交给 European Computer Manufacturers Association(ECMA) ,这是一个工业标准组织。像是 Halcyon 的执行长说的,iNet 的一个
好处是可以让那些以 J2EE 与Windows 软件为基础的公司,可以继续开发 M$ 的程序代码,但是将他们的结果放在支持 Java 的服务器上执行,这些服务器提供商包括了 M$ 的对手,像是 BEA, Sun, IBM …Linux 以及 Mac OS X 操作系统均支持 Java ,因此也可以透过 iNet 来具备执行.Net Web services 的能力。这将会让这些选择使用 .Net来开发 Web services 的公司们,有更多的选择机会。

他同时也提到,有些争论说 M$ 也许不是个部署应用程序的好地方,也许选择 Linux box 或是 Solaris box 是更好的选择,而 iNet 让这些 .Net Web Services 的开发者可以将他们的程序部署在其它的平台上。不过 M$ .Net 工具的一位发言人婉拒了对 Halcyon 的技术下评论。Microsoft 也许会对 iNet 保持沉默,因为这个软件并不会使用 Java语言来取代掉他们的技术。

Java 是由 Sun 所发展的,并且成为 M$ 本身的程序技术的一个重要的竞争对手。M$将 Java 从 Windows XP 这个操作系统中移除,之后两家公司便不断在要吸引使用者来使用他们个别的程序语言。Hsi 指出, M$ 说过他们希望 .Net 可以在其它的操作系统上执行,但是他认为 M$很难忍受大家已经将 Java 运用得很成熟了。.Net Web Service 只可以在 M$ 的服务器上执行,因为他使用了一个叫做 CLI(Common Language Infrastructure) 的技术, CLI 是一个让 .NET
Web Service 执行的一个的一个核心技术。他与 JVM (Java Virtual Machine) 很相似,Java 可以被放在 client 上,并且执行 Java Application ,而 CLI 则像是 .Net 应用程序的引擎般。.Net 架构是 CLI 的商业化的实做结果,他包含了一些额外的特色,像是 class ibraries ,以及 client 端的使用者接口。

在经过约一年的测试之后, .Net 架构已经在 2/13 号公布了最后的版本。 人们希望M$ 公布它围绕着 .Net 架构设计的 Windows .Net Server ,接下来的五个月,会公布一个手持装置的执行环境的计划,而更小的运算装置也会在以后公布。Halcyon 的 iNet 工具可以替代 CLI ,这家公司使用自己的技术发展了一个执行环境,而这个执行环境可以让 .Net Web Service在 JVM 上执行。

Hsi 说,我们想要跳过整个 CLI 。

他们的作法是,程序开发者使用了 Visual Studio .Net 建立了一个.Net Web Service ,同时将他编译成一种叫做 MSIL (Microsoft Intermediate Language)。接着开发者使用 Halcyon 的 IL-to-Java (Intermediate Language-to-Java) 工具,这个工具最后可以将原来的 MSIL 转换成 Java byte code ,然后利用 Halcyon 工具包装成一个档案,接着这个档案就可以在 JVM 上面执行了。Yefim Natis 说: Halcyon 的计划有它的优点,然而当 M$ 持续的公布新的特色,以及更新 .Net 的架构之后,他们也许不会再继续维持下去。

Natis 也说,他很怀疑这会成功,以表面上来看,它非常的吸引人,因为他可以使用很棒的开发环境,像是 Visual Studio .Net ,然后却不被 M$ 的软件所局限住。由于 .Net 的架构下,包含了比JVM更多的特色,像是vital class ibraries ,以及用来显式 .Net Web Services 的使用者接口, Halcyon 必须开发额外的东西来补足这些差异。譬如,一家公司设计了Java 版本的 M$ Windows 窗体,他允许使用者建立client-side 的使用者接口(M$ ASP .Net) ,这个接口允许这个 application 被显示在 web site 上。

Natis 指出,他不会是 .Net 的真实行为以及功能面的复制,因为每次当 M$修改或是公布新的 service pack , Halcyon 将需要快速的实做这些新的特色,也就是说他总是 M$ 的表兄弟般,而且可能会缺少一些 .Net 的特色。Hsi则指出 Hylcyon 可以为 Java 重建整个 .Net 架构,不管 M$ 怎么修改这项技术,他有 90 个开发者在持续的维护他们的技术,而这项计划在 2000 年十月时就开始了这个计划。

Halcyon 也已经开发了一个产品叫做 Instant ASP (iASP),这是个Java 版本的Microsoft ASP (Active Server Pages) 技术。像是 HP 这些公司,都已经取得 iASP的授权, Hsi 说它的公司已经被证明他们具有将 M$ 的程序代码转换成 Java 的技术能力了。

当然也有其它人致力于将 .Net Web Services 带到其它非 Windows 的环境中,他们使用的是 ECMA 的标准, Ximian 公司就带了一个计划叫做 Mono ,他们正努力将 CLI移植到 Linux 以及 Unix 操作系统上。这个计画如果实现,将可以让程序开发者使用Linux Programming工具来开发.Net Web Services。

由 Corel 取得的技术支持, M$ 也开发了一个 FreeBSD 版的 CLI 。M$ 说,这个计划的目的在于证明 .Net 的一部份架构可以在开放式的标准下被复制出来。这个计划很像是 Mono ,但是他受到 M$ 的 shared source 版权的保护,也就是说这个程序代码只能以研究的目的存在,而不能被企业所商业化。

iNet 及 Halcyon 的 Java 执行环境可以免费下载,网址位于
http://www.halcyonsoft.com