C语言编写一个网络蜘蛛.docx
- 文档编号:24413719
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:30
- 大小:23.53KB
C语言编写一个网络蜘蛛.docx
《C语言编写一个网络蜘蛛.docx》由会员分享,可在线阅读,更多相关《C语言编写一个网络蜘蛛.docx(30页珍藏版)》请在冰豆网上搜索。
C语言编写一个网络蜘蛛
用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
--------------------------------------------------------------------------------
作者:
zhoulifa发表于:
2007-04-1522:
15:
38
【发表评论】【查看原文】【Linux讨论区】【关闭】
可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用google之类的搜索引擎是没法实现这种特定功能的,所以用C语言来写一个吧。
它的功能就是不断去取得网络上的页面,然后分析出网页上出现的邮件地址保存下来。
象个蜘蛛一样,从网络上一个网页爬向另一个网页,不停止地搜索邮件地址。
当然这只是一个原理展示程序,并没有进行优化。
这个程序的main函数流程图如下:
即:
分析程序运行时的参数,把各网页地址作为根节点加入到链表,然后从链表头开始处理各节点
对整个链表的处理是先处理兄弟节点,流程图如下:
然后再处理各节点的子节点,流程图如下:
当然,这里采用了递归调用方法,处理子节点的数据时和处理整个链表一样循环处理就是了。
/************关于本文档********************************************
*filename:
用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
*purpose:
一个邮址搜索程序的雏形
*wroteby:
zhoulifa([email]zhoulifa@[/email])周立发()
Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言
*datetime:
2006-08-3121:
00:
00
*Note:
任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
*但请遵循GPL
*Hope:
希望越来越多的人贡献自己的力量,为科学技术发展出力
*********************************************************************/
程序在运行的过程中要建立一个树形链表结构,结构图如下:
程序启动时分析所带参数,把各参数加入到根网页节点,如果有多个参数则这个根网页有兄弟节点。
然后从根节点开始处理这一级上各节点,把各节点网页上出现的网页链接加到该节点的子节点上,处理完当前这一级后处理子节点这一级。
源代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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,"\tSocketError:
%s\a\n",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,"\tConnectError:
%s\a\n",strerror(errno));
exit
(1);
}
}
/**************************************************************
功能:
向网站发送HTTP请求
***************************************************************/
voidSendRequest(void){/*sendmyhttp-requesttowebserver*/
dsend=0;totalsend=0;
nbytes=strlen(request);
while(totalsend dsend=write(sockfd,request+totalsend,nbytes-totalsend); if(dsend==-1){fprintf(stderr,"\tsenderror! %s\n",strerror(errno));exit(0);} totalsend+=dsend; fprintf(stdout,"\n\tRequest.%d%dbytessendOK! \n",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,"\n\tError,socketisnegative! \n");exit(0);} ret=select(sockfd+1,&writefds,NULL,NULL,&tival); if(ret==0){ if(retry++<10)goto__ReCeive; } if(ret<=0){fprintf(stderr,"\n\tErrorwhilereceiving! \n");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\n",NodeCurr->file);return;} /*receivedatafromwebserver*/ while((nbytes=read(sockfd,buffer,1))==1) { if(i<4){/*获取HTTP消息头*/ if(buffer[0]=='\r'||buffer[0]=='\n')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,"\tRequest.%dis: \n%s",++reqn,request); DoOnce(); if(flag)fprintf(stdout,"\n\tThefollowingistheresponseheader: \n%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([email]zhoulifa@[/email])周立发() Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言 *datetime: 2006-08-3121: 00: 00 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 *但请遵循GPL *Thanksto: www.gd-linux.org广东省Linux公共服务技术支持中心 *********************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编写 一个 网络 蜘蛛