基于.net的网站信息采集系统的设计与实现
1引言
随着WWW的发展,搜索引擎所提供的搜索和导航服务已经成为互联网上非常重要的网络服务,它的特点是能够帮助我们很快找到所需的网站或资料。而某些情况下,我们浏览网站时关注的是几个特定网站上的一类信息与数据,需要综合这类信息进行数据挖掘,来进一步分析和使用;或者只是想从几个网站上采集特定的信息,并在进行分类和统一格式后,存入本地数据库,在自己网站上发布,从而提高信息及时性,减少工作量。
本文讨论利用.Net技术、数据库技术,设计Web网站信息的采集系统,并以某人才网站招聘信息的采集为例,说明实现过程。
2信息采集系统的设计
2.1采集系统设计的思路
首先,要采集指定网站的信息,必须了解信息的浏览方式,并记录相应的访问路径。大多数网站采用动态网页技术(ASP、PHP等)构建,通过参数传递来检索数据库,输出对应信息的。例如人才招聘网的通常以单位名称作为信息的起点链接,打开对应的网页后,获得单位具体招聘岗位链接,才能获得详细的招聘信息。
第二,采集所获的信息必须存入本地数据库,需要对几个目标网站上的信息进行比较与分析,得到统一的数据模型,并设计相应的数据表,便于将来对不同网站采集来的信息统一进行结构化。
第三,考虑到可能会对网站进行多次采集,要避免重复的信息存入自己的数据库内,同时重复处理已经存在的信息也会降低采集系统的工作效率。因此可以在记录每条信息的同时,记录其对应的URL或相关ID,便于验证链接是否已经访问过。
2.2相关的技术
1)请求/响应模型
Web应用是基于HTTP协议的客户端/服务器请求响应机制的信息交换,当我们在浏览器输入一个网址,需要经过建立连接、发送请求、发送响应、关闭连接4个步骤,才能获得网页信息。
在.Net框架的命名空间System.Net中提供了两个类WebRequest和WebResponse,分别用来发送客户端请求和获取服务器返回的响应。
2)正则表达式
正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的模式匹配可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合。
在.Net的命名空间System.Text.RegularExpressions提供Regex类构建正则表达式,同时还提供了相应的方法完成对字符串的匹配和过滤。
3)ADO.Net
采集系统得到的数据最终都要存入本地数据库,在.NET框架中提供了数据库访问技术ADO.NET。它屏蔽了各类数据源之间的差异,以统一的接口进行访问,由一组访问各类数据源的类构成。为提高访问效率,还为SQLServer提供了专用类,SqlConnection、SqlCommand、SqlDataReader、Dataset、SqlDataAdapter等,完成对SQLServer数据库的访问与数据处理。
2.3算法描述
要完成信息的采集,首先要能够在页面中过滤出我们所需要的链接起点,然后系统模拟人工点击流程来读取信息。
1)根据访问路径创建一个C#自带的REGEX类的对象,该类是用来进行正则表达式的匹配文本类。
2)通过WebRequest发送请求,WebResponse接取返回的响应,再通过StreamReader读取返回的响应,形成包含网页所有源码的字符串。
3)对该字符串用正则表达式进行匹配,得到MatchCollection集合,存放了所有我们需要进一步读取的目标链接。
4)遍历集合的成员,访问成员链接所指向的页面,由StreamReader读取信息后,使用正则表达式提取页面信息。如果该页是访问路径的终点,读取相应的信息后,结构化所有数据存入数据库;若只是获取下一级链接,则转1)。
3人才招聘信息采集系统的实现
1)读取招聘单位列表信息
打开web_url指定的网站页面,并通过StreamReader对象读取网页源代码存入字符串all_code中,便于正则表达式提取。
HttpWebRequestall_codeRequest=(HttpWebRequest)WebRequest.Create(web_url);
WebResponseall_codeResponse=all_codeRequest.GetResponse();
StreamReaderthe_Reader=newStreamReader(all_codeResponse.GetResponseStream(),System.Text.Encoding.Default);
stringall_code=the_Reader.ReadToEnd();
the_Reader.Close();
2)提取招聘单位的超链列表
创建表达式字符串p,用它创建正则表达式对象re,并使用re.Matches方法返回all_code字符串所有匹配的超链集合hy。
stringp=@".+";
Regexre=newRegex(p,RegexOptions.IgnoreCase);
MatchCollectionhy=re.Matches(all_code);
for(inti=0;i正则表达式过滤,读取岗位招聘人数、有效时间、学历要求等
…//信息存入本地数据库相关表中}
}
3)信息存入本地数据库
为将信息存入本地数据库对应的表,在SQLServer中设计了一个存储过程InsertJobs,用来解决相应的数据插入问题。其中webid中存放ID是目标网站用于区分岗位的标识,InsertJobs根据其检查该岗位是否需要插入数据库,保证数据不重复。
SqlCommandcmd=newSqlCommand("InsertJobs",con);
cmd.CommandType=CommandType.StoredProcedure;
try{
cmd.Parameters.AddWithValue("@companyname",companyname);
……//招聘岗位信息
cmd.Parameters.Add("@webid",SqlDbType.BigInt,;//记录岗位ID
cmd.Parameters["@webid"].Value=Convert.ToInt64(jid);
cmd.ExecuteNonQuery();
}
catch(Exception){continue;}
4结束语
利用该设计方案,我们成功地对某人才网的信息进行了采集;其实,只需适当修改,就可用于采集其他特定网站的信息。由于针对特定的网站进行信息采集,并不需要像搜索爬虫一样对整个网站进行扫描,所以采集的速度比较快。要避免再次采集时对已采集信息的重复提取,可以在数据库中存放已扫描的链接,在2.3算法第4步读取超链内容前进行判断,则可以提高再次采集时的工作效率。