一个简单的网络爬虫 - SharkCrawler
来源:互联网 发布:软件开发待遇 编辑:程序博客网 时间:2024/05/19 13:21
最近需要通过网络爬虫来收集点数据,想找一些简单易用的开源版本,总是要么配置起来有点复杂,要么功能上不太容易扩展。还是自己实现一个简单的版本更容易扩展相应的功能。这个版本的实现完全参照wiki上面对于webcrawler的架构来设计类型。
实现了一些简单的功能
- 从指定起始地址爬链接,结果以htm形式存在本地文件系统
- 执行目标输出路径和工作线程数
- 暂定和恢复爬行
- 跟踪爬行请求以及出错请求
由于只是用来收集比较少的数据,很多高级的功能没有实现,
- 没有持久化队列,程序关闭不能断点续爬
- 判断循环链接算法需要优化,目前只用了一个自定义的url树来跟踪链接
- 由于没有用图来跟踪链接,链接于链接的之间的入度关系信息丢掉了,无法应用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"); }
- 一个简单的网络爬虫 - SharkCrawler
- 一个简单的java网络爬虫(spider)
- 一个简单的java网络爬虫(spider)
- 一个简单的宽度优先网络爬虫
- 一个简单的网络爬虫程序
- 网络爬虫(六):一个简单的百度贴吧小爬虫
- 一个简单网络爬虫示例
- 简单的网络爬虫
- 一个最简单的网络爬虫的实现
- 使用HttpClient做的一个简单的网络爬虫
- 一个简单的爬虫
- 一个简单的爬虫
- 一个简单的爬虫
- 搜索引擎----Java实现一个简单的网络爬虫
- 一个简单的网络爬虫---爬取网页中的图片
- 关于一个简单的网络爬虫源码分析
- 用java实现一个简单的网络爬虫
- python初学者——一个简单的网络爬虫
- POJ 2456 Aggressive cows 和 NYOJ 586 疯牛【二分枚举+贪心】
- 零基础学软件测试基础篇---什么是软件测试
- 47_输入4个整数,按从大到小的顺序输出这4个整数
- struts前后台用字符串传递json(重点,替换特殊字符)
- 48_判断一年是否是闰年_2
- 一个简单的网络爬虫 - SharkCrawler
- QT210 -> u-boot-samsung-dev中的mkconfig文件注释
- 49_C/C++ for循环实验
- LINUX的目录树
- 自由口通信模式下计算机读写PLC存储区的程序
- VS2008 Error
- c++使用联合体保存成绩,并且输出
- JavaScript Module Pattern: In-Depth
- 度娘弱爆了:看看 Google 日本女优程序员