C#实现web信息自动抓取.docx
《C#实现web信息自动抓取.docx》由会员分享,可在线阅读,更多相关《C#实现web信息自动抓取.docx(20页珍藏版)》请在冰豆网上搜索。
![C#实现web信息自动抓取.docx](https://file1.bdocx.com/fileroot1/2022-11/24/22b627bd-2ea9-4672-9fdc-4c5eddf884e3/22b627bd-2ea9-4672-9fdc-4c5eddf884e31.gif)
C#实现web信息自动抓取
C#实现web信息自动抓取
背景
随着Internet的普及,网络信息正以极高的速度增长,在这么多数据中找到自己需要的信息是一件很繁琐的事情,找到需要的信息后如何获取也是件麻烦的事。
这就需要Internet信息抓取程序来代替人工的操作。
所谓Internet信息抓取程序,就是程序会按照用户的关键词或关键网站来收集相应的信息,并提供给用户想要的信息格式。
信息量的增加会带来信息网站发布人员工作量的剧增,为实现信息发布系统实现信息自
动发布、减少工作人员工作量、即时跟踪最新信息,就需要自动信息提供程序,因此Internet信息抓取程序应运而生。
目标
实现自定义网站信息分类抓取,存入本地数据库、生成静态页面或其它用户定义的信息结构,并下载与信息相关的多媒体文件。
开发
l目标站点结构分析
本步骤是准确抓取信息个关键。
首先要选择更新频率高的页面做为抓取地址,然后分析要抓取内容页面url特点。
然后分析要抓取信息页面的元素特性,比如标题位置,内容位置等,得到定位标记点。
将以上信息写成自己的配置文件或存到数据库中。
每个网站都需要分析,写出单独的配置文件,供抓取程序使用。
l信息提取
根据配置文件取得要抓取页面url,使用HttpWebRequest类获取内容:
//获取http页面函数
C#code
publicstringGet_Http(stringa_strUrl,inttimeout)
{
stringstrResult;
try
{
HttpWebRequestmyReq=(HttpWebRequest)HttpWebRequest.Create(a_strUrl);
myReq.Timeout=timeout;
HttpWebResponseHttpWResp=(HttpWebResponse)myReq.GetResponse();
StreammyStream=HttpWResp.GetResponseStream();
StreamReadersr=newStreamReader(myStream,Encoding.Default);
StringBuilderstrBuilder=newStringBuilder();
while(-1!
=sr.Peek())
{
strBuilder.Append(sr.ReadLine()+"\r\n");
}
strResult=strBuilder.ToString();
}
catch(Exceptionexp)
{
strResult="错误:
"+exp.Message;
}
returnstrResult;
}
获取页面内容后,分析页面中连接地址取到要抓取的url:
C#code
//处理页面标题和链接
publicstringSniffWebUrl(stringurlStr,stringblockB,stringblockE)
{
stringurlch1="";
stringurlch2="";
intend_n1=0;
intend_nums=0;
intend_nums1=0;
intend_nums2=0;
intend_nums3=0;
stringreUTStr="";
stringreTitle="";
stringret="";
try
{
intpos01=urlStr.IndexOf(".");
intpos02=urlStr.LastIndexOf("/");
if(pos01<0)
{
return"";
}
if(pos02<0)
{
return"";
}
intpos03=urlStr.IndexOf("/",pos01);
if(pos03<0)
{
urlch1=urlStr;
urlch2=urlStr;
}
else
{
urlch1=urlStr.Substring(0,pos03);
urlch2=urlStr.Substring(0,pos02);
}
stringtmpAllStr=newPublicFun().Get_Http(urlStr,time1);
intpos1=tmpAllStr.IndexOf(blockB);
intpos2=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("=0)
{
ret=ret.Substring(0,ret.IndexOf("}
while(ret.IndexOf("
=0)
{
ret=ret.Substring(0,ret.IndexOf("
}
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;
intbegin_nums=tmpAllStr.IndexOf("href=");
while(begin_nums>=0)
{
stringtmpStrA="";
stringtmpStrB=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("
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;
}
}
stringstr4=tmpAllStr.Substring(end_nums-1,end_nums-end_nums+1);
if(str4=="\""||str4=="'")
{
end_nums=end_nums-1;
}
stringsTotalOne=tmpAllStr.Substring(end_n1,end_nums-end_n1);
if(sTotalOne.IndexOf("http:
//")<0)
{
if(sTotalOne.IndexOf("/")==0)
{
sTotalOne=urlch1+sTotalOne;
}
else
{
intlinshiIntNum=0;
intflags=0;
stringurlChange=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+newPublicFun().RemoveHtmlCode(reTitle)+sTotalOne;
tmpAllStr=tmpAllStr.Substring(end_nums3+4);
begin_nums=tmpAllStr.IndexOf("href=");
}
else
{
begin_nums=-1;
}
}
}
returnreUTStr;
}
catch(Exceptione)
{
return"";
}
}
得到要抓取内容的url后,处理该页面:
C#code
//获取链接内容并分类处理
publicstringGetWebContent(stringgatherUrl,stringsubUrl,stringsubTitle,stringb_Content,stringe_Content,stringb_Filter,stringe_Filter,stringroot)
{
stringtmpAllStr="";
stringdfStrB="";
stringdfStrE="";
stringrePicStr="";//图片返回路径
stringreContentStr="";
stringpicHtml="images";//本地图片路径
stringurlch1="";
stringurlch2="";
intpos1=gatherUrl.IndexOf(".");
intpos2=gatherUrl.LastIndexOf("/");
if(pos1<0)
{
return"";
}
if(pos2<0)
{
return"";
}
intpos3=gatherUrl.IndexOf("/",pos1);
if(pos3<0)
{
urlch1=gatherUrl;
urlch2=gatherUrl;
}
else
{
urlch1=gatherUrl.Substring(0,pos3);
urlch2=gatherUrl.Substring(0,pos2);
}
tmpAllStr=newPublicFun().Get_Http(subUrl,time1);
//取稿源
stringdocFromStr="";
if(dfStrB!
=""&&dfStrE!
="")
{
if(tmpAllStr!
="")
{
intb_docF=tmpAllStr.IndexOf(dfStrB);
if(b_docF>0)
{
inte_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!
="")
{
intbegin_strnum=tmpAllStr.IndexOf(b_Content);
if(begin_strnum<0)
{
return"";
}
intend_strnum=tmpAllStr.IndexOf(e_Content,begin_strnum+b_Content.Length);
if(end_strnum<0)
{
return"";
}
stringsTotalSubM="";
if(end_strnum>begin_strnum)
{
sTotalSubM=tmpAllStr.Substring(begin_strnum,end_strnum-begin_strnum);
}
if(sTotalSubM=="")
{
return"";
}
//过滤无用信息
intbfnum=sTotalSubM.IndexOf(b_Filter);
if(bfnum>-1)
{
intefnum=sTotalSubM.IndexOf(e_Filter,bfnum);
if(efnum>-1)
{
if(efnum>bfnum)
{
sTotalSubM=sTotalSubM.Substring(0,bfnum)+sTotalSubM.Substring(efnum+e_Filter.Length);
}
}
}
接上
C#code
//格式化图片标记
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);
}
//取图片地址
intend_n12=0;
intend_nums2=0;
intbegin_nums2=sTotalSubM.IndexOf("src=");
while(begin_nums2>=0)
{
StringtmpStr=sTotalSubM.Substring(begin_nums2+4,1);
if(tmpStr=="\"")
{
end_n12=begin_nums2+5;
}
else
{
end_n12=begin_nums2+4;
}
intend_nums2a=sTotalSubM.IndexOf("",end_n12);
intend_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;
}
stringtmpPicStr=sTotalSubM.Substring(end_n12,end_nums2-end_n12);
if(tmpPicStr.IndexOf("http:
//")<0)
{
if(tmpPicStr.IndexOf("/")==0)
{
tmpPicStr=urlch1+tmpPicStr;
}
else
{
intlinshiIntNum=0;
intflags=0;
stringurlChange=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();
stringtmpPicStrTmp=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;
intflagN2=tmpPicStr.LastIndexOf("/");
stringfileN2=picHtml+tmpPicStr.Substring(flagN2);
sTotalSubM=sTotalSu