一个简单的网络爬虫 - SharkCrawler

最近需要通过网络爬虫来收集点数据,想找一些简单易用的开源版本,总是要么配置起来有点复杂,要么功能上不太容易扩展。还是自己实现一个简单的版本更容易扩展相应的功能。这个版本的实现完全参照wiki上面对于webcrawler的架构来设计类型。

实现了一些简单的功能

  1. 从指定起始地址爬链接,结果以htm形式存在本地文件系统
  2. 执行目标输出路径和工作线程数
  3. 暂定和恢复爬行
  4. 跟踪爬行请求以及出错请求

由于只是用来收集比较少的数据,很多高级的功能没有实现,

  1. 没有持久化队列,程序关闭不能断点续爬
  2. 判断循环链接算法需要优化,目前只用了一个自定义的url树来跟踪链接
  3. 由于没有用图来跟踪链接,链接于链接的之间的入度关系信息丢掉了,无法应用PageRank等依赖于链接关系的算法


爬虫运行起来的样子,


输出目录



安装包和代码下载放在了Codeplex,


https://sharkcrawler.codeplex.com/


如果有人需要爬网页或者进行一些数据分析,可以直接更改这个方法SharkCrawler.Scheduler.DefaultScheduler.ThreadProc()进行相应的扩展。

private void ThreadProc()
        {
            string threadId = Thread.CurrentThread.Name;
            TracerSink.Instance.Trace(threadId, string.Empty, "Started");
            while (!stop)
            {
                if (!pause)
                {
                    string uri = null;
                    lock (queuelock)
                    {
                        if (queue.Count > 0)
                        {
                            uri = queue.Dequeue();
                        }
                    }
                    if (!string.IsNullOrEmpty(uri))
                    {
                        TracerSink.Instance.Trace(threadId, uri, "Downloading");
                        WebPage page = WebPageDownloader.Download(uri);
                        if (page != null)
                        {
                            fileStorage.SaveWebPage(page);
                            Collection<string> urls = HtmlParser.ParseUrl(page.Content);
                            lock (queuelock)
                            {
                                for (int i = 0; i < urls.Count; i++)
                                {
                                    string url = urls[i].Substring(6, urls[i].Length - 7);

                                    if (!queue.Contains(url)
                                        && url.StartsWith("http")
                                        && !url.Contains("?")
                                        && (url.EndsWith("/")
                                        || url.EndsWith(".htm")
                                        || url.EndsWith(".html")
                                        || url.EndsWith(".aspx")
                                        || url.EndsWith(".asp")
                                        || url.EndsWith(".jsp")
                                        || url.EndsWith(".php")
                                        || url.LastIndexOf('.') < url.LastIndexOf('/'))
                                        )
                                    {
                                        queue.Enqueue(url);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        TracerSink.Instance.Trace(threadId, string.Empty, "Sleeping");
                        Thread.Sleep(100);
                    }
                }
                else
                {
                    TracerSink.Instance.Trace(threadId, string.Empty, "Paused");
                    Thread.Sleep(500);
                }
            }
            TracerSink.Instance.Trace(threadId, string.Empty, "Stopped");
        }


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值