关键技术之单机爬虫的实现(1)---我的名字叫小蛛蛛,虽然我还小,但是 ...

        大家好,我的中文名字叫小蛛蛛英文名字叫jspider。现在刚刚从“妈妈”肚子出来。动作比较缓慢,不过对外界东西已经有反应了。别说我坏话哈,我听的懂的。刚出来还不知道我到底来到世界是干嘛的,后来查了下资料。才知道:

        网络爬虫,又称网络蜘蛛,是指某个能以人类无法达到的速度不断重复执行某项任务的自动程序。由于专门用于检索信息的爬虫程序像蜘蛛(Spider)一样在网络间爬来爬去,因此,搜索引擎的Crawler程序被称为Spider程序。世界上{dy}个Crawler程序,是MIT Matthew Gray的World wide WebWanderer,用于追踪互联网发展规模。刚开始它只用来统计互联网上的服务器数量,后来则发展为也能够捕获网址(URL)。随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在Wanderer基础上,一些编程者将传统的Crawler程序工作原理作了些改进。其设想是,既然所有网页都可能有连向其他网站的链接,那么从一个网站开始,跟踪所有网页上的所有链接,就有可能检索整个互联网。到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,其中最负盛名的三个是:Scotland的JumpStation,Colorado大学Oliver McBryan的The World Wide WebWorm(First Mention of McBryan's World Wide Web Worm),NASA的Repository-Based Software Engineering(RBSE)Crawler。

       发现自己起的作用还挺大,连搜索引擎都离开不我。好羡慕上面的大蛛蛛们哦,竟然能把绝大网页都爬到。没办法谁让别人有个好“妈妈”呢。不管了,还是接受现实吧。看看我“妈妈”都给我造成什么样子。应该至少像个蜘蛛吧,应该是个好胎没发生什么变异。呵呵...

      

        ”身体造成“如下:

代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.IO;
 5 using System.Net;
 6 using System.Collections;
 7 using System.Text.RegularExpressions;
 8 namespace HelloSpider
 9 {
10     class JSpider
11     {
12         private WebClient webClient = new WebClient();
13         private Queue<string> urls = new Queue<string>();
14         private int count = 0;
15         private string current;
16         static void Main(string[] args)
17         {
18             Console.WriteLine("欢迎进入HelloSpider,人家还小爬的比较慢嘛!嘿嘿。。。");
19             JSpider myspider = new JSpider();
20             myspider.urls.Enqueue("http://www.cnblogs.com/yueyue_jwfm/");
21             myspider.Spider();
22             Console.WriteLine("我开始爬行了,速度有点慢哦。");
23         }
24         private void Spider()
25         {
26             while (urls.Count > 0)
27             {
28                 current = urls.Peek();
29                 Console.WriteLine("正在爬行"+urls.Peek()+"页面!");
30                 DownLoad(urls.Dequeue());
31                 Console.WriteLine("爬行结束" + urls.Peek() + "页面!");
32             }
33         }
34         private void DownLoad(string url)
35         {
36             HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
37             req.Timeout = 30000;
38             HttpWebResponse response = (HttpWebResponse)req.GetResponse();
39             byte[] buffer = ReadInstreamIntoMemory(response.GetResponseStream());
40             string fileName = count.ToString();
41             FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);
42             fs.Write(buffer, 0, buffer.Length);
43             fs.Close();
44             count++;
45             string html = Encoding.UTF8.GetString(buffer);
46             Parser(html);
47             Spider();
48         }
49         public void Parser(string html)
50         {
51             Console.WriteLine("正在解析" + current + "页面!");
52             string strRef = @"(href|HREF|src|SRC)[ ]*=[ ]*[""'][^""'#>]+[""']";
53             MatchCollection matches = new Regex(strRef).Matches(html);
54             foreach (Match match in matches)
55             {
56                 strRef = match.Value.Substring(match.Value.IndexOf('='+ 1).Trim('"''\'''#'' ''>');
57                 Console.WriteLine("得到了" + strRef + "地址,加到我的大脑里面去!");
58                 urls.Enqueue(strRef);
59             }
60             Console.WriteLine("解析结束" + current + "页面!");
61         }
62         private static byte[] ReadInstreamIntoMemory(Stream stream)
63         {
64             int bufferSize = 16384;
65             byte[] buffer = new byte[bufferSize];
66             MemoryStream ms = new MemoryStream();
67             while (true)
68             {
69                 int numBytesRead = stream.Read(buffer, 0, bufferSize);
70                 if (numBytesRead <= 0break;
71                 ms.Write(buffer, 0, numBytesRead);
72             }
73             return ms.ToArray();
74         }
75     }
76 }
77 

 

        呜呜。。。真的好简单哦,大家别笑我哈。我回头让“妈妈“多吃点东西,长快点。至少像我哥哥那样。这是我们哥俩的照片,”妈妈“拍的。

       

 


希望楼主再接再厉,赞一个!

但需要解决的基本问题还很多:

1. 多线程
2. 存储接口
3. 优先级:爬重点网页
4. 防止死循环:很多网站存在死循环。就是链接无穷多,但是,其实是指向一个网页。

---还有:

1.日志分析机制,更新策略
2.html解析还远远不够,能否支持插件模式,支持附件抽取?
3.对每个网页有一套算法,用来标识 权重。
4.当遇到网页错误的时候,日志需完备。
5.采集层数控制,每次任务采集数目控制,另外你用正则解析网页速度太慢了,根本上不了规模的应用。。
6.楼主到底是男的女的哈?

其实做一个可用的spider,你现在做的工作还不到5%...

郑重声明:资讯 【关键技术之单机爬虫的实现(1)---我的名字叫小蛛蛛,虽然我还小,但是 ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——