- 浏览: 21541613 次
- 性别:
- 来自: 杭州
最新评论
-
ZY199266:
配置文件还需要额外的配置ma
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
ZY199266:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我又一个问题就是 如果像你的这种形式写。配置文件还需要额外的 ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
y1210251848:
你的那个错误应该是项目所使用的目标框架不支持吧
log4net配置(web中使用log4net,把web.config放在单独的文件中)
[转]用 C 语言编写一个网络蜘蛛
用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
作者:zhoulifa
来源:http://bbs.chinaunix.net/viewthread.php?tid=821361
可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用 google 之类的搜索引擎是没法实现这种特定功能的,所以用 C 语言来写一个吧。它的功能就是不断去取得网络上的页面,然后分析出网页上出现的邮件地址保存下来。象个蜘蛛一样,从网络上一个网页爬向另一个网页,不停止地搜索邮件地址。
即:分析程序运行时的参数,把各网页地址作为根节点加入到链表,然后从链表头开始处理各节点
对整个链表的处理是先处理兄弟节点,流程图如下:
然后再处理各节点的子节点,流程图如下:
当然,这里采用了递归调用方法,处理子节点的数据时和处理整个链表一样循环处理就是了。
/************关于本文档********************************************
*filename: 用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
*purpose: 一个邮址搜索程序的雏形
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2006-08-31 21:00:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
*********************************************************************/
程序在运行的过程中要建立一个树形链表结构,结构图如下:
程序启动时分析所带参数,把各参数加入到根网页节点,如果有多个参数则这个根网页有兄弟节点。
然后从根节点开始处理这一级上各节点,把各节点网页上出现的网页链接加到该节点的子节点上,处理完当前这一级后处理子节点这一级。
当然这只是一个原理展示程序,并没有进行优化。
这个程序的 main 函数流程图如下:
源代码如下:
#includesys/stat.h>
#includefcntl.h>
#includesys/mman.h>
#includeunistd.h>
#includestdio.h>
#includestring.h>
#includestdlib.h>
#includenetdb.h>
#includeerrno.h>
#includelocale.h>
#defineUSERAGENT"Wget/1.10.2"
#defineACCEPT"*/*"
#defineACCEPTLANGUAGE"zh-cn,zh;q=0.5"
#defineACCEPTENCODING"gzip,deflate"
#defineACCEPTCHARSET"gb2312,utf-8;q=0.7,*;q=0.7"
#defineKEEPALIVE"300"
#defineCONNECTION"keep-alive"
#defineCONTENTTYPE"application/x-www-form-urlencoded"
#defineMAXFILENAME14
#defineDEBUG1
typedefstructwebnode{
char*host;/*网页所在的主机*/
intport;/*网络服务器所使用的端口*/
char*dir;/*网页所在的目录*/
char*page;/*网页文件名*/
char*file;/*本地保存的文件名*/
charIsHandled;/*是否处理过*/
structwebnode*brother;/*兄弟节点链表指针*/
structwebnode*child;/*子节点链表指针*/
}WEBNODE;
structsockaddr_inserver_addr;
intsockfd=0,dsend=0,totalsend=0,nbytes=0,reqn=0,i=0,j=0,ret=0;
structhostent*host;
charrequest[409600]="",buffer[1024]="",httpheader[1024]="";
intFileNumber=0;
chare[2]="@/";
WEBNODE*NodeHeader,*NodeTail,*NodeCurr;
char*mapped_mem;
intGetHost(char*,char**,char**,int*,char**);/**/
voidAnalyzePage(WEBNODE*);/**/
voidAddInitNode(char*,char*,int,char*);/**/
voidHandleInitNode(WEBNODE*);/**/
voidDisplayNode(WEBNODE*);/**/
voidHandOneNode(WEBNODE*);/**/
voidDoneWithList(int);/**/
voidDoOnce();/**/
voidConnectWeb(void);/**/
voidSendRequest(void);/**/
voidReceiveResponse(void);/**/
voidGetEmail(char*);/**/
voidGetLink(char*);/**/
voidGetBeforePos(char*,char**);/**/
voidGetAfterPos(char*,char**);/**/
voidAddChildNode(WEBNODE*,char*);/**/
voidGetAfterPosWithSlash(char*,char**);/**/
voidGetMemory(char**,int);/**/
intIsExistWeb(WEBNODE*,char*,char*,int,char*);/**/
voidRstrchr(char*,int,char**);/**/
intGetLocalAgent(char*UserAgent,char*Accept,char*AcceptLanguage,char*AcceptEncoding,char*AcceptCharset,char*KeepAlive,char*Connection,char*ContentType);/**/
功能:设置HTTP协议头内容的一些固定值
***************************************************************/
intGetLocalAgent(char*UserAgent,char*Accept,char*AcceptLanguage,char*AcceptEncoding,char*AcceptCharset,char*KeepAlive,char*Connection,char*ContentType)
{
memcpy(UserAgent,USERAGENT,strlen(USERAGENT));
memcpy(Accept,ACCEPT,strlen(ACCEPT));
memcpy(AcceptLanguage,ACCEPTLANGUAGE,strlen(ACCEPTLANGUAGE));
memcpy(AcceptEncoding,ACCEPTENCODING,strlen(ACCEPTENCODING));
memcpy(AcceptCharset,ACCEPTCHARSET,strlen(ACCEPTCHARSET));
memcpy(KeepAlive,KEEPALIVE,strlen(KEEPALIVE));
memcpy(Connection,CONNECTION,strlen(CONNECTION));
memcpy(ContentType,CONTENTTYPE,strlen(CONTENTTYPE));
return0;
}
/**************************************************************
功能:在字符串s里搜索x字符,并设置指针d指向该位置
***************************************************************/
voidRstrchr(char*s,intx,char**d)
{
intlen=strlen(s)-1;
while(len>=0){
if(x==s[len]){(*d)=s+len;return;}
len--;
}
(*d)=0;
}
/**************************************************************
功能:连接一个网站服务器
***************************************************************/
voidConnectWeb(void){/*connecttowebserver*/
/*createasocketdescriptor*/
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr," SocketError:%sa ",strerror(errno));
exit(1);
}
/*bindaddress*/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(NodeCurr->port);
server_addr.sin_addr=*((structin_addr*)host->h_addr);
/*connecttotheserver*/
if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1)
{
fprintf(stderr," ConnectError:%sa ",strerror(errno));
exit(1);
}
}
/**************************************************************
功能:向网站发送HTTP请求
***************************************************************/
voidSendRequest(void){/*sendmyhttp-requesttowebserver*/
dsend=0;totalsend=0;
nbytes=strlen(request);
while(totalsendnbytes){
dsend=write(sockfd,request+totalsend,nbytes-totalsend);
if(dsend==-1){fprintf(stderr," senderror!%s ",strerror(errno));exit(0);}
totalsend+=dsend;
fprintf(stdout," Request.%d%dbytessendOK! ",reqn,totalsend);
}
}
/**************************************************************
功能:接收网站的HTTP返回
***************************************************************/
voidReceiveResponse(void){/*getresponsefromwebserver*/
fd_setwritefds;
structtimevaltival;
intretry=0;
FILE*localfp=NULL;
i=0;j=0;
__ReCeive:
FD_ZERO(&writefds);
tival.tv_sec=10;
tival.tv_usec=0;
if(sockfd>0)FD_SET(sockfd,&writefds);
else{fprintf(stderr," Error,socketisnegative! ");exit(0);}
ret=select(sockfd+1,&writefds,NULL,NULL,&tival);
if(ret==0){
if(retry++10)goto__ReCeive;
}
if(ret0){fprintf(stderr," Errorwhilereceiving! ");exit(0);}
if(FD_ISSET(sockfd,&writefds)){
memset(buffer,0,1024);
memset(httpheader,0,1024);
if((localfp=fopen(NodeCurr->file,"w"))==NULL){if(DEBUG)fprintf(stderr,"createfile'%s'error ",NodeCurr->file);return;}
/*receivedatafromwebserver*/
while((nbytes=read(sockfd,buffer,1))==1)
{
if(i4){/*获取HTTP消息头*/
if(buffer[0]==' '||buffer[0]==' ')i++;
elsei=0;
memcpy(httpheader+j,buffer,1);j++;
}
else{/*获取HTTP消息体*/
fprintf(localfp,"%c",buffer[0]);/*printcontentonthescreen*/
//fprintf(stdout,"%c",buffer[0]);/*printcontentonthescreen*/
i++;
}
}
fclose(localfp);
}
}
/**************************************************************
功能:执行一次HTTP请求
***************************************************************/
voidDoOnce(){/*sendandreceive*/
ConnectWeb();/*connecttothewebserver*/
/*sendarequest*/
SendRequest();
/*receivearesponsemessagefromwebserver*/
ReceiveResponse();
close(sockfd);/*becauseHTTPprotocoldosomethingoneconnection,soIcancloseitafterreceiving*/
}
/**************************************************************
功能:执行HTTP请求
***************************************************************/
voidDoneWithList(intflag){
if(flag)fprintf(stdout," Request.%dis: %s",++reqn,request);
DoOnce();
if(flag)fprintf(stdout," Thefollowingistheresponseheader: %s",httpheader);
}
/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到文件和目录
***************************************************************/
intGetHost(char*src,char**web,char**file,int*port,char**dir){
char*pA,*pB,*pC;
intlen;
*port=0;
if(!(*src))return-1;
pA=src;
if(!strncmp(pA,"http://",strlen("http://")))pA=src+strlen("http://");
/*elseif(!strncmp(pA,"https://",strlen("https://")))pA=src+strlen("https://");*/
elsereturn1;
pB=strchr(pA,'/');
if(pB){
len=strlen(pA)-strlen(pB);
GetMemory(web,len);
memcpy((*web),pA,len);
if(*(pB+1)){
Rstrchr(pB+1,'/',&pC);
if(pC)len=strlen(pB+1)-strlen(pC);
elselen=0;
if(len>0){
GetMemory(dir,len);
memcpy((*dir),pB+1,len);
if(pC+1){
len=strlen(pC+1);
GetMemory(file,len);
memcpy((*file),pC+1,len);
}
else{
len=1;
GetMemory(file,len);
memcpy((*file),e,len);
}
}
else{
len=1;
GetMemory(dir,len);
memcpy((*dir),e+1,len);
len=strlen(pB+1);
GetMemory(file,len);
memcpy((*file),pB+1,len);
}
}
else{
len=1;
GetMemory(dir,len);
memcpy((*dir),e+1,len);
len=1;
GetMemory(file,len);
memcpy((*file),e,len);
}
}
else{
len=strlen(pA);
GetMemory(web,len);
memcpy((*web),pA,strlen(pA));
len=1;
GetMemory(dir,len);
memcpy((*dir),e+1,len);
len=1;
GetMemory(file,len);
memcpy((*file),e,len);
}
pA=strchr((*web),':');
if(pA)*port=atoi(pA+1);
else*port=80;
return0;
}
*filename:mailaddrsearch.c
*purpose:用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
*tidiedby:zhoulifa(zhoulifa@163.com)周立发(http://zhoulifa.bokee.com)
Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言
*datetime:2006-08-3121:00:00
*Note:任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
*但请遵循GPL
*Thanksto:www.gd-linux.org广东省Linux公共服务技术支持中心
*********************************************************************/
intmain(intargc,char**argv)
{
intWebPort;
char*WebHost=0,*PageAddress=0,*WebDir=0;
if(argc2){if(DEBUG)fprintf(stdout,"Commanderror,youshouldinputlikethis: %sWebPageAddress1WebPageAddress2WebPageAddress3...",argv[0]);exit(0);}
NodeHeader=NodeTail=NodeCurr=0;
//setlocale(LC_ALL,"zh_CN.gb2312");
for(i=1;iargc;i++){
ret=GetHost(argv,&WebHost,&PageAddress,&WebPort,&WebDir);/*Getwebpageinfo*/
if(ret){if(DEBUG)fprintf(stdout,"GetHosterrorfrom'%s' ",argv);exit(0);}
AddInitNode(WebHost,PageAddress,WebPort,WebDir);/*addthispagetochain*/
}
free(WebHost);free(PageAddress);free(WebDir);
if(DEBUG){
fprintf(stdout," Display.%5d:",FileNumber);
DisplayNode(NodeHeader);/*displayeverynode*/
}
HandleInitNode(NodeHeader);/*handleeverypage*/
return0;
}
功能:分析网页
***************************************************************/
voidAnalyzePage(WEBNODE*node)
{
intfd;
intflength=0;
fd=open(node->file,O_RDONLY);
if(fd==-1)goto__AnalyzeDone;
flength=lseek(fd,1,SEEK_END);
write(fd,"/0",1);
lseek(fd,0,SEEK_SET);
mapped_mem=mmap(0,flength,PROT_READ,MAP_PRIVATE,fd,0);
GetEmail(mapped_mem);
GetLink(mapped_mem);
close(fd);
munmap(mapped_mem,flength);
__AnalyzeDone:
close(fd);
node->IsHandled=1;
remove(node->file);
}
/**************************************************************
功能:为根节点设置兄弟节点
***************************************************************/
voidAddInitNode(char*Host,char*Page,intPort,char*Dir)
{
WEBNODE*NewNode;
charfilename[MAXFILENAME+1]="";
if(NodeHeader==NULL)NewNode=NodeHeader=(WEBNODE*)malloc(sizeof(WEBNODE));
elseNodeTail->brother=NewNode=(WEBNODE*)malloc(sizeof(WEBNODE));
memset(NewNode,0,sizeof(WEBNODE));
NewNode->host=(char*)malloc(strlen(Host)+1);
memset(NewNode->host,0,strlen(Host)+1);
NewNode->page=(char*)malloc(strlen(Page)+1);
memset(NewNode->page,0,strlen(Page)+1);
NewNode->dir=(char*)malloc(strlen(Dir)+1);
memset(NewNode->dir,0,strlen(Dir)+1);
NewNode->file=(char*)malloc(MAXFILENAME+1);
memset(NewNode->file,0,MAXFILENAME+1);
strcpy(NewNode->host,Host);
strcpy(NewNode->page,Page);
strcpy(NewNode->dir,Dir);
sprintf(filename,"file%05d.html",FileNumber++);
strcpy(NewNode->file,filename);
NewNode->port=Port;
NewNode->IsHandled=0;
NewNode->brother=0;
NewNode->child=0;
NodeTail=NewNode;
}
/**************************************************************
功能:处理根节点信息
***************************************************************/
voidHandleInitNode(WEBNODE*node)
{
WEBNODE*CurrentNode=0;
CurrentNode=node;
if(CurrentNode){
while(CurrentNode){
if(CurrentNode->IsHandled==0){
HandOneNode(CurrentNode);
if(DEBUG){
fprintf(stdout," Display.%5d:",FileNumber);
DisplayNode(NodeHeader);/*displayeverynode*/
}
}
CurrentNode=CurrentNode->brother;
}
CurrentNode=node;
while(CurrentNode){
if(CurrentNode->child&&CurrentNode->child->IsHandled==0){
HandleInitNode(CurrentNode->child);
}
CurrentNode=CurrentNode->brother;
}
}
}
/**************************************************************
功能:显示年有节点信息
***************************************************************/
voidDisplayNode(WEBNODE*NodeHeader)
{
WEBNODE*TempNode;
TempNode=NodeHeader;
fprintf(stdout," ");
while(TempNode){
if(!strcmp(TempNode->dir,"/"))fprintf(stdout," %s:%d%s%s=>%s%d ",TempNode->host,TempNode->port,TempNode->dir,strcmp(TempNode->page,"@")?TempNode->page:"",TempNode->file,TempNode->IsHandled);
elsefprintf(stdout," %s:%d/%s/%s=>%s%d ",TempNode->host,TempNode->port,TempNode->dir,strcmp(TempNode->page,"@")?TempNode->page:"",TempNode->file,TempNode->IsHandled);
TempNode=TempNode->brother;
}
TempNode=NodeHeader;
while(TempNode){
if(TempNode->child)DisplayNode(TempNode->child);
TempNode=TempNode->brother;
}
}
/**************************************************************
功能:处理单个节点信息
***************************************************************/
voidHandOneNode(WEBNODE*node)
{
charUserAgent[1024]="",Accept[1024]="",AcceptLanguage[1024]="",AcceptEncoding[1024]="",AcceptCharset[1024]="",KeepAlive[1024]="",Connection[1024]="",ContentType[1024]="";
NodeCurr=node;
if((host=gethostbyname(NodeCurr->host))==NULL)/*getipaddressbydomain*/
{
if(DEBUG)fprintf(stderr," Gethostname'%s'error,%s ",NodeCurr->host,strerror(errno));
exit(1);
}
GetLocalAgent(UserAgent,Accept,AcceptLanguage,AcceptEncoding,AcceptCharset,KeepAlive,Connection,ContentType);/*Getclientbrowserinformation*/
if(strcmp(NodeCurr->dir,"/"))sprintf(request,"GET/%s/%sHTTP/1.0 Host:%s User-Agent:%s Accept:%s Connection:%s ",NodeCurr->dir,strcmp(NodeCurr->page,"@")?NodeCurr->page:"",NodeCurr->host,UserAgent,Accept,Connection);
elsesprintf(request,"GET%s%sHTTP/1.0 Host:%s User-Agent:%s Accept:%s Connection:%s ",NodeCurr->dir,strcmp(NodeCurr->page,"@")?NodeCurr->page:"",NodeCurr->host,UserAgent,Accept,Connection);
DoneWithList(1);
AnalyzePage(NodeCurr);
}
/**************************************************************
功能:从字符串src中分析出邮件地址保存到文件
***************************************************************/
voidGetEmail(char*src)
{
char*pa,*pb,*pc,*pd;
charmyemail[1024]="";
FILE*mailfp=NULL;
if((mailfp=fopen("email.txt","a+"))==NULL)return;
pa=src;
while((pb=strchr(pa,'@'))){
GetBeforePos(pb,&pc);
GetAfterPos(pb,&pd);
if(pc&&pd&&(strlen(pc)>(strlen(pd)+3))){
memset(myemail,0,1024);
memcpy(myemail,pc,strlen(pc)-strlen(pd));
if(strcmp(NodeCurr->dir,"/"))fprintf(mailfp,"%s http://%s/%s/%s ",myemail,NodeCurr->host,NodeCurr->dir,strcmp(NodeCurr->page,"@")?NodeCurr->page:"");
elsefprintf(mailfp,"%s http://%s%s%s ",myemail,NodeCurr->host,NodeCurr->dir,strcmp(NodeCurr->page,"@")?NodeCurr->page:"");
if(*(pd+1))pa=pd+1;
elsebreak;
}
elseif(*(pb+1))pa=pb+1;
elsebreak;
}
fclose(mailfp);
}
/**************************************************************
功能:从src中找出前面的字母、数字等内含,即email地址中@的前面部分
***************************************************************/
voidGetBeforePos(char*src,char**d)
{
char*x;
if(src-1)x=src-1;
else{*d=0;return;}
while(x){
if(*x>='a'&&*x'z'){x--;continue;}
elseif(*x>='A'&&*x'Z'){x--;continue;}
elseif(*x>='0'&&*x'9'){x--;continue;}
elseif(*x=='.'||*x=='-'||*x=='_'){x--;continue;}
else{break;}
}
x++;
if(x)*d=x;
else*d=0;
}
/**************************************************************
功能:从src中找出后面的字母、数字等内含,即email地址中@的后面部分
***************************************************************/
voidGetAfterPos(char*src,char**d)
{
char*x;
if(src+1)x=src+1;
else{*d=0;return;}
while(x){
if(*x>='a'&&*x'z'){x++;continue;}
elseif(*x>='A'&&*x'Z'){x++;continue;}
elseif(*x>='0'&&*x'9'){x++;continue;}
elseif(*x=='.'||*x=='-'||*x=='_'){x++;continue;}
else{break;}
}
if(x)*d=x;
else*d=0;
}
功能:从src中找出前面的字母、数字等内含,即一个网页地址中主机名后面的部分
***************************************************************/
voidGetAfterPosWithSlash(char*src,char**d)
{
char*x;
if(src)x=src;
else{*d=0;return;}
while(x){
if(*x>='a'&&*x'z'){x++;continue;}
elseif(*x>='A'&&*x'Z'){x++;continue;}
elseif(*x>='0'&&*x'9'){x++;continue;}
elseif(*x=='.'||*x=='-'||*x=='_'||*x=='='){x++;continue;}
elseif(*x==':'||*x=='/'||*x=='?'||*x=='&'){x++;continue;}
else{break;}
}
if(x)*d=x;
else*d=0;
}
/**************************************************************
功能:为myanchor分配len大小的内存
***************************************************************/
voidGetMemory(char**myanchor,intlen)
{
if(!(*myanchor))(*myanchor)=(char*)malloc(len+1);
else(*myanchor)=(char*)realloc((void*)(*myanchor),len+1);
memset((*myanchor),0,len+1);
}
/**************************************************************
功能:从src中分析出网页链接,并加入到当前节点的子节点上
***************************************************************/
voidGetLink(char*src)
{
char*pa,*pb,*pc;
char*myanchor=0;
intlen=0;
pa=src;
do{
if((pb=strstr(pa,"href='"))){
pc=strchr(pb+6,''');
len=strlen(pb+6)-strlen(pc);
GetMemory(&myanchor,len);
memcpy(myanchor,pb+6,len);
}
elseif((pb=strstr(pa,"href=""))){
pc=strchr(pb+6,'"');
len=strlen(pb+6)-strlen(pc);
GetMemory(&myanchor,len);
memcpy(myanchor,pb+6,len);
}
elseif((pb=strstr(pa,"href="))){
GetAfterPosWithSlash(pb+5,&pc);
len=strlen(pb+5)-strlen(pc);
GetMemory(&myanchor,len);
memcpy(myanchor,pb+5,len);
}
else{goto__returnLink;}
/*
if(DEBUG){
if(strcmp(NodeCurr->dir,"/"))fprintf(stdout,"%s http://%s/%s/%s ",myanchor,NodeCurr->host,NodeCurr->dir,strcmp(NodeCurr->page,"`")?NodeCurr->page:"");
elsefprintf(stdout,"%s http://%s%s%s ",myanchor,NodeCurr->host,NodeCurr->dir,strcmp(NodeCurr->page,"`")?NodeCurr->page:"");
}
*/
if(strlen(myanchor)>0)AddChildNode(NodeCurr,myanchor);
if(pc+1)pa=pc+1;
}while(pa);
__returnLink:
return;
}
/**************************************************************
功能:为当前节点增加子节点
***************************************************************/
voidAddChildNode(WEBNODE*node,char*src)
{
intWebPort,len;
char*WebHost=0,*PageAddress=0,*WebDir=0,*pC=0;
WEBNODE*NewNode;
charfilename[MAXFILENAME+1]="";
charIsFromRoot=0;
if(!src)return;
if(!strncasecmp(src,"mailto:",strlen("mailto:")))return;
if(strstr(src,".css"))return;
if(strstr(src,".xml"))return;
if(strstr(src,".ico"))return;
if(strstr(src,".jpg"))return;
if(strstr(src,".gif"))return;
if(strstr(src,"javascript:"))return;
if(strstr(src,"+"))return;
ret=GetHost(src,&WebHost,&PageAddress,&WebPort,&WebDir);
if(ret){
len=strlen(node->host);
GetMemory(&WebHost,len);
strcpy(WebHost,node->host);
WebPort=node->port;
IsFromRoot=!strncmp(src,"/",1);
if(IsFromRoot&&(src+1))Rstrchr(src+1,'/',&pC);
elseif(!IsFromRoot)Rstrchr(src,'/',&pC);
elsepC=0;
if(pC){
if(IsFromRoot)len=strlen(src+1)-strlen(pC);
elselen=strlen(src)-strlen(pC)+strlen(node->dir)+1;
GetMemory(&WebDir,len);
if(IsFromRoot)memcpy(WebDir,src+1,len);
else{memcpy(WebDir,node->dir,strlen(node->dir));strcat(WebDir,"/");memcpy(WebDir+strlen(node->dir)+1,src,strlen(src)-strlen(pC));}
if(pC+1){
len=strlen(pC+1);
GetMemory(&PageAddress,len);
strcpy(PageAddress,pC+1);
}
else{
len=1;
GetMemory(&PageAddress,len);
memcpy(PageAddress,e,len);
}
}
else{
if(IsFromRoot){
len=1;
GetMemory(&WebDir,len);
memcpy(WebDir,e+1,len);
len=strlen(src+1);
GetMemory(&PageAddress,len);
memcpy(PageAddress,src+1,len);
}
else{
len=strlen(node->dir);
GetMemory(&WebDir,len);
memcpy(WebDir,node->dir,len);
len=strlen(src);
GetMemory(&PageAddress,len);
memcpy(PageAddress,src,len);
}
}
}
ret=IsExistWeb(NodeHeader,WebHost,PageAddress,WebPort,WebDir);
if(ret)goto__ReturnAdd;
if(node->child==NULL)NewNode=node->child=(WEBNODE*)malloc(sizeof(WEBNODE));
elseNodeTail->brother=NewNode=(WEBNODE*)malloc(sizeof(WEBNODE));
memset(NewNode,0,sizeof(WEBNODE));
NewNode->host=(char*)malloc(strlen(WebHost)+1);
memset(NewNode->host,0,strlen(WebHost)+1);
NewNode->page=(char*)malloc(strlen(PageAddress)+1);
memset(NewNode->page,0,strlen(PageAddress)+1);
NewNode->dir=(char*)malloc(strlen(WebDir)+1);
memset(NewNode->dir,0,strlen(WebDir)+1);
NewNode->file=(char*)malloc(MAXFILENAME+1);
memset(NewNode->file,0,MAXFILENAME+1);
strcpy(NewNode->host,WebHost);
strcpy(NewNode->page,PageAddress);
strcpy(NewNode->dir,WebDir);
sprintf(filename,"file%05d.html",FileNumber++);
strcpy(NewNode->file,filename);
NewNode->port=WebPort;
NewNode->IsHandled=0;
NewNode->brother=0;
NewNode->child=0;
NodeTail=NewNode;
__ReturnAdd:
free(WebHost);free(PageAddress);free(WebDir);
}
/**************************************************************
功能:检查是否已经处理过的网页
***************************************************************/
intIsExistWeb(WEBNODE*node,char*host,char*page,intport,char*dir)
{
WEBNODE*t;
t=node;
while(t){
if(!strcmp(t->host,host)&&!strcmp(t->page,page)&&t->port==port&&!strcmp(t->dir,dir))return1;
t=t->brother;
}
t=node;
while(t){
if(t->child){
ret=IsExistWeb(t->child,host,page,port,dir);
if(ret)return2;
}
t=t->brother;
}
return0;
}
输入一个网址作为参数运行一下试试吧:
程序首先找出 http://zhoulifa.bokee.com/5531748.html 页面上的邮件地址保存到当前目录下 email.txt 文件里,每行一条记录,格式为邮件地址和出现该邮件地址的网页。然后分析这个页面上出现的网页链接,把各链接作为子节点加入链表,再去处理子节点,重复上述操作。
这只是一个示例程序,并不完善,如果要使其达到实用的目的,还需要让这个程序效率更高点,比如加入 epoll ( 在 2.4 内核中只有 select 了 ) 实现 I/O 多路复用。又比如对每个子节点实现多线程,每个线程处理一个节点。
如果对 I/O 多路复用不熟悉,您可以看一下我这篇文章 http://zhoulifa.bokee.com/5345930.html 里关于 “ Linux 下各类TCP网络服务器的实现源代码”
相关推荐
用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
该文档详细介绍了网络蜘蛛(网络爬虫),并附带c语言开发的爬虫代码,对爬虫初学者很有用。
用C语言编写一个网络蜘蛛 ,内有完整代码及详细解释
可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用 google 之类的搜索引擎是没法实现这种特定功能的,所以用 C 语言来写一个吧。它的功能就是不断去取得网络上的页面,然后分析出网页上出现的...
一个简易的用C语言编写的蜘蛛纸牌小游戏
网络蜘蛛网络蜘蛛网络蜘蛛网络蜘蛛网络蜘蛛网络蜘蛛
一个非常不错的java网络蜘蛛程序及源码,依靠apache commons httpclient v3.0,可以从网站上下载任何你指定扩展名的文件
一个简单的网络蜘蛛框架,由Python编写,需要Python3.8+ PSpider的特点 1. 支持多线程爬行模式(使用线程) 2. 支持使用代理进行爬行(使用线程和队列) 3.定义一些实用函数和类,例如:UrlFilter、get_string_num等 4....
一个非常不错的python文档,关于网络蜘蛛的,有兴趣的可以下来看下
网络蜘蛛 网络蜘蛛 网络蜘蛛 网络蜘蛛 网络爬虫
用java编写的蜘蛛纸牌游戏,学习Java的很好的资料
Java网络爬虫(蜘蛛)源码是一种用Java语言编写的程序,它可以模拟人类在互联网上的浏览并抓取信息。这种程序可以在互联网上自动地搜索和提取数据,并将其保存在本地计算机上,以供后续处理和分析。通过使用Java网络...
c开发的网络蜘蛛源代码
网络蜘蛛,有时也称为网络爬虫,是一些根据网络链接从一个网站到另外一个网站,检查内容和记录位置的程序。商业搜索站点使用网络蜘蛛丰富它们的数据库,研究人员可以使用蜘蛛获得相关的信息。创建自己的蜘蛛搜索的...
一个简单的网络蜘蛛 可以用于建立搜索网站。商业情报采集和分析。
网络蜘蛛最新源码
网络蜘蛛 网络爬虫 网络机器人 电子书pdg版值得参考
MFC 网络蜘蛛程序
SPIDER工程(程序)是一个如何用抢先式多线程技术实现在网上用网络蜘蛛/机器人聚集信息的程序。 <br>该工程产生一个象蜘蛛一样行动的程序,该程序为断开的URL链接检查WEB站点。链接验证仅在href指定的链接上进行...
一个简单的java网络蜘蛛程序,非常适合初学者