您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言编写出一个网络蜘蛛
C语言编写一个网络蜘蛛可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用google之类的搜索引擎是没法实现这种特定功能的,所以用C语言来写一个吧。它的功能就是不断去取得网络上的页面,然后分析出网页上出现的邮件地址保存下来。象个蜘蛛一样,从网络上一个网页爬向另一个网页,不停止地搜索邮件地址。当然这只是一个原理展示程序,并没有进行优化。这个程序的main函数流程图如下:即:分析程序运行时的参数,把各网页地址作为根节点加入到链表,然后从链表头开始处理各节点对整个链表的处理是先处理兄弟节点,流程图如下:然后再处理各节点的子节点,流程图如下:当然,这里采用了递归调用方法,处理子节点的数据时和处理整个链表一样循环处理就是了。/************关于本文档*********************************************filename:用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址*purpose:一个邮址搜索程序的雏形*wroteby:zhoulifa(zhoulifa@163.com)周立发()Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言*datetime:2006-08-3121:00:00*Note:任何人可以任意复制代码并运用这些文档,当然包括你的商业用途*但请遵循GPL*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力*********************************************************************/程序在运行的过程中要建立一个树形链表结构,结构图如下:程序启动时分析所带参数,把各参数加入到根网页节点,如果有多个参数则这个根网页有兄弟节点。然后从根节点开始处理这一级上各节点,把各节点网页上出现的网页链接加到该节点的子节点上,处理完当前这一级后处理子节点这一级。源代码如下:[code]#includesys/types.h#includesys/stat.h#includefcntl.h#includesys/mman.h#includeunistd.h#includestdio.h#includestring.h#includestdlib.h#includenetdb.h#includeerrno.h#includelocale.h#defineUSERAGENTWget/1.10.2#defineACCEPT*/*#defineACCEPTLANGUAGEzh-cn,zh;q=0.5#defineACCEPTENCODINGgzip,deflate#defineACCEPTCHARSETgb2312,utf-8;q=0.7,*;q=0.7#defineKEEPALIVE300#defineCONNECTIONkeep-alive#defineCONTENTTYPEapplication/x-{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(totalsendnbytes){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;_
本文标题:C语言编写出一个网络蜘蛛
链接地址:https://www.777doc.com/doc-5527779 .html