您的位置:首页 > 编程语言 > C#

开源一个C#写的小爬虫,简单实用

2012-08-19 23:01 204 查看
出于工作上的需要,两年前wl363535796和我一起写了一个微型的爬虫库(目前还称不上一个爬虫,仅仅是对一些抓取操作的封装而已)。后来便一直没怎么管它,直到最近有时间,我们修复了所有已发现的Bug,完善了一些功能,并对代码进行了重构。现在将其开源,取名为EasySpider,意为一个简单实用的抓取库。开源的目的是希望这个项目能为有同样需求的朋友们节省一些时间,如果侥幸哪位朋友能用到,我们会倍感荣幸。(ps:本人已经很长一段时间没有碰过C#了,代码写得不好的地方还望各位朋友海涵。)

最近不知道为什么,codeplex访问好慢,所以将项目托管到了http://code.taobao.org。如果您在使用过程中如果遇到什么问题或者对未来版本有什么建议想法,欢迎大家在项目主页上填写issues,或者在此篇博文下留言,也可以给我们发email。
wl363535796的email:wl363535796@gmail.com
mangoalex的email:mangoalex@163.com
项目的地址是:http://code.taobao.org/p/easyspider,您可以使用svn签出,也可以单击这里下载第一个版本:http://code.taobao.org/svn/easyspider/tags/release-v1.0.rar

一、项目的相关介绍

1. 这个库主要实现的功能如下:
(1) 封装基本的Http请求操作,包括get、post请求,文件上传以及资源下载等
(2) 封装页面的一些常用操作,包括js过滤,页面所有资源下载(将页面所含的图片、js、css以及flash下载到本地指定路径,然后更改页面中的引用路径)等

(3) 一些工具性的封装,包括相对url到绝对url的转换,根据两个不同目录得到引用路径,以及页面编码判断等

2. 项目主要的一些类以及说明如下:
Spider 这个是主要类,所有http请求操作的入口都在这里,主要封装一个同异步请求相关的方法
WebPage 这个是页面下载的主要类库,需要您需要下载页面所有资源到本地,就会用到这个类
CHttpWebRequest 对HttpWebRequest的一个封装,添加一些诸如http标头设置等方法
CHttpWebResponse 对HttpWebResponse的一个封装,添加一些诸如页面编码获取以及对服务器输出的压缩流解压的一些操作

3. 项目主要目录说明如下:
Common 看名字就知道,这个文件夹下是一些项目公用的配置以及基础类的封装
Regex 正则相关的封装,主要封装了一些常用的正则表达式
Utility 工具文文件夹,主要封装一些路径、文件等常用操作

4. 几点补充说明:

(1) 出于性能考虑,CHttpWebResponse没使用析构函数,而是实现了IDisposable接口,也就是说一般情况下您需要使用using语法来显式释放资源(某些情况下,您可以调用一些已经自带垃圾回收的方法)
(2) 出于兼容性考虑,整个项目是基于FrameWork 2.0的。但是本人机子上装的是vs2010,所以如果您的vs版本低于2010的话需要将项目转换为低版本的(具体方法可参考此处:( http://www.cnblogs.com/hibernate6/archive/2011/11/28/2521991.html ),或者创建一个新项目,将代码复制到新项目。

二、一些简单的例子

1. 同步get、post请求

//1.1 使用同步get请求,获取返回的html

using (CHttpWebResponse cResponse = Spider.Get("http://www.baidu.com"))

{

//第一个参数是解析服务器输出流的编码,设置为null表示自动获取;第二个参数是在调用方法后是否释放资源,由于显式使用了using所以此处设置为false

string html = cResponse.GetContent(null, false);

}

//1.2 使用同步post方法,提交字符串和文件,获取返回的html

Dictionary<string,string> postDic=new Dictionary<string,string>();

List<HttpPostFile> files = new List<HttpPostFile>();

//发送"name=mango&age=20"到服务器

postDic.Add("name","mango");

postDic.Add("age","20");

//发送两个文件到服务器,FromFilePath的第一个参数是文件的本地路径;第二个参数是文件在表单中的name;第三个参数是文件的mime类型,设置为null表示自动获取

files.Add(HttpPostFile.FromFilePath(@"D:\1.txt","file1",null));

files.Add(HttpPostFile.FromFilePath(@"D:\2.txt", "file2", null));

//Post方法第一个参数是url;第二个参数是需要提交的表单域的键值对;第三个参数是需要提交的文件列表,如果不需要提交文件则设置为null;第四个参数表示post字符串的编码,如果为null则会使用utf8编码

using (CHttpWebResponse cResponse =Spider.Post("http://www.baidu.com", postDic,files,null))

{

string html = cResponse.GetContent(null, false);

}

2. 异步get、post请求

异步方法与同步方法使用类似,只不多了一个委托参数,我们以异步get方法为例:

//2.1 由于使用异步调用,所以AsyncGet不会阻塞程序的执行,想要看到服务端返回的html,需要在此方法后调用Console.ReadLine让程序暂停

Spider.AsyncGet(Spider.CreateRequest("http://www.baidu.com"),new ResponseCallback(delegate(CHttpWebResponse cResponse){

//注意:此处没有使用using语法,是因为做了一个封装,GetContent()其实是调用GetContent(null, true)

string html = cResponse.GetContent();

Console.WriteLine(html);

}));

Console.ReadLine();

3. 页面资源下载

using (CHttpWebResponse cResponse = Spider.Get(Spider.CreateRequest("http://www.taobao.com")))

{

WebPage page= cResponse.GetWebPage();

//第一个参数指定保存的文件名;第二个参数表示不过滤js;第三个参数指定保存文件夹(还可以为css、js等指定不同的文件夹,只要在同一目录下就行)

page.SaveHtmlAndResource(@"taobao.html", false, new DirConfig(@"D:\test"));

}

执行上面的代码以后,会在D:\test生成如下几个目录:



打开taobao.html,发现页面显示如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: