免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhoulifa
打印 上一主题 下一主题

[原创] 用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-09-07 12:39 |只看该作者
原帖由 flw 于 2006-9-2 15:09 发表
像这一类程序,耗时的操作主要在于网络通讯上,
处理本身是不占用什么时间的,
反过来灵活性和扩展性就显得至关重要,
用 C 来做爬虫,的确罕见!

BTW:可以请蜘蛛给大家介绍一下。


几个出名的开源引擎的爬虫都是用 c 或 c++ 或 java的
其实wget就是一个简单的爬虫

perl可以考虑做为抓取过来以后,保存的数据的协议分析

论坛徽章:
0
32 [报告]
发表于 2006-09-07 12:48 |只看该作者
原帖由 GNM 于 2006-9-7 12:28 发表
程序运行也有问题(as4上编译)
[root@test09.news.sina ~]# ./spdir http://bn.sina.com.cn/pv/index.html
GetHost error from '蜜窨僳窨'


打印出这行提示是这一句程序:
if(ret)        {if(DEBUG) fprintf(stdout, "GetHost error from '%s'\n", argv); exit(0);}

而程序里用的是argv,理论上应该是http://bn.sina.com.cn/pv/index.html啊
我写了测试代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. char e[2] = "@/";

  5. void GetMemory(char ** myanchor, int len)
  6. {
  7.         if(!(*myanchor))        (*myanchor) = (char *)malloc(len + 1);
  8.         else        (*myanchor) = (char *)realloc((void *)(*myanchor), len + 1);
  9.         memset((*myanchor), 0, len + 1);
  10. }

  11. void Rstrchr(char * s, int x, char ** d)
  12. {
  13.         int len = strlen(s) - 1;
  14.         while(len >= 0)        {
  15.                 if(x == s[len]) {(*d) = s + len; return;}
  16.                 len--;
  17.         }
  18.         (*d) = 0;
  19. }

  20. int GetHost(char * src, char ** web, char ** file, int * port, char ** dir)  {
  21.   char * pA, * pB, * pC;
  22.   int len;

  23.   *port = 0;
  24.   if(!(*src))  return -1;
  25.   pA = src;
  26.   if(!strncmp(pA, "http://", strlen("http://")))  pA = src+strlen("http://");
  27.   /* else if(!strncmp(pA, "https://", strlen("https://")))  pA = src+strlen("https://"); */
  28.   else return 1;
  29.   pB = strchr(pA, '/');
  30.   if(pB)  {
  31.     len = strlen(pA) - strlen(pB);
  32.     GetMemory(web, len);
  33.     memcpy((*web), pA, len);
  34.     if(*(pB+1))  {
  35.       Rstrchr(pB + 1, '/', &pC);
  36.       if(pC) len = strlen(pB + 1) - strlen(pC);
  37.       else len = 0;
  38.       if(len > 0) {
  39.         GetMemory(dir, len);
  40.         memcpy((*dir), pB + 1, len);

  41.         if(pC + 1) {
  42.           len = strlen(pC + 1);
  43.           GetMemory(file, len);
  44.           memcpy((*file), pC + 1, len);
  45.         }
  46.         else {
  47.           len = 1;
  48.           GetMemory(file, len);
  49.           memcpy((*file), e, len);
  50.         }
  51.       }
  52.       else {
  53.         len = 1;
  54.         GetMemory(dir, len);
  55.         memcpy((*dir), e + 1, len);

  56.         len = strlen(pB + 1);
  57.         GetMemory(file, len);
  58.         memcpy((*file), pB + 1, len);
  59.       }
  60.     }
  61.     else {
  62.       len = 1;
  63.       GetMemory(dir, len);
  64.       memcpy((*dir), e + 1, len);

  65.       len = 1;
  66.       GetMemory(file, len);
  67.       memcpy((*file), e, len);
  68.     }
  69.   }
  70.   else  {
  71.     len = strlen(pA);
  72.     GetMemory(web, len);
  73.     memcpy((*web), pA, strlen(pA));
  74.     len = 1;
  75.     GetMemory(dir, len);
  76.     memcpy((*dir), e + 1, len);
  77.     len = 1;
  78.     GetMemory(file, len);
  79.     memcpy((*file), e, len);
  80.   }

  81.   pA = strchr((*web), ':');
  82.   if(pA)  *port = atoi(pA + 1);
  83.   else *port = 80;

  84.   return 0;
  85. }

  86. int main(int argc, char ** argv)
  87. {
  88.         int ret = 0, WebPort = 0;
  89.         char * WebHost = 0, * PageAddress = 0, * WebDir = 0;

  90.         ret = GetHost(argv[1], &WebHost, &PageAddress, &WebPort, &WebDir); /* Get web page info */
  91.         if(ret)        {fprintf(stdout, "GetHost error from '%s'\n", argv[1]); exit(0);}
  92.         else fprintf(stdout, "'%s' => %s:%d %s %s\n", argv[1], WebHost, WebPort, WebDir, PageAddress);
  93.         return 0;
  94. }
复制代码


运行结果为:
test@locale:/source/example/c$ gcc gethost.c -Wall
test@locale:/source/example/c$ ./a.out http://bn.sina.com.cn/pv/index.html
'http://bn.sina.com.cn/pv/index.html' => bn.sina.com.cn:80 pv index.html


GNM,你在你电脑上试试这段代码看行不行

论坛徽章:
0
33 [报告]
发表于 2006-09-07 12:54 |只看该作者
原帖由 cmzhubill 于 2006-9-6 20:29 发表
可以在开源的爬虫,例如larbin的基础上稍作修改就能达到这个目的啊

larbin是C++写的,效率非常高。


多谢提供一份源码参考!

我下载了个larbin-2.6.3来,不过编译通不过,adns__parse_domain的申明和实现不一致
申明为internal.h:570行:
adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
                               vbuf *vb, parsedomain_flags flags,
                               const byte *dgram, int dglen, int *cbyte_io, int max);

实现却为parse.c:114行:
adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
                               vbuf *vb, adns_queryflags flags,
                               const byte *dgram, int dglen, int *cbyte_io, int max)
我学习学习这份代码再说吧,原理不会差很多吧

论坛徽章:
0
34 [报告]
发表于 2006-09-07 14:19 |只看该作者
学习

论坛徽章:
0
35 [报告]
发表于 2006-09-07 16:27 |只看该作者
[test@root]$ ./a.out http://bn.sina.com.cn/pv/index.html
'http://bn.sina.com.cn/pv/index.html' => bn.sina.com.cn:80 pv index.html

楼主测试代码通过,但原代码还是不行报错

论坛徽章:
0
36 [报告]
发表于 2006-09-07 17:02 |只看该作者
赞。。。

论坛徽章:
0
37 [报告]
发表于 2006-09-07 18:25 |只看该作者
GNM , 实在想不出你那是什么问题了
要不你把你那份源码发过来我这里试试看 zhoulifa@163.com

论坛徽章:
0
38 [报告]
发表于 2006-09-07 21:55 |只看该作者
和你第一页的源代码一样的,楼主可以在as4或redhat8.0下试试

论坛徽章:
0
39 [报告]
发表于 2006-09-07 22:43 |只看该作者
辛苦了,不过,恩…… why not nutch?

论坛徽章:
0
40 [报告]
发表于 2006-09-08 08:24 |只看该作者
原帖由 GNM 于 2006-9-7 21:55 发表
和你第一页的源代码一样的,楼主可以在as4或redhat8.0下试试


已经好久不用Red Hat的东西了,感觉它太难用了 :(
不过,我会在虚拟机里来试试它
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP