用C#2.0实现网络蜘蛛(WebSpider)
2009-05-29 08:31:25 来源:WEB开发网六、分析网络资源
对下载的网络资源进行分析是网络蜘蛛中最重要的功能之一。这里网络资源主要指的是html代码中标签的href属性值。状态和状态之间会根据从html文件中读入的字符进行切换。下面是状态之间切换的描述。
状态0:读入'<'字符后切换到状态1,读入其他的字符,状态不变。
状态1:读入'a'或'A',切换到状态2,读入其他的字符,切换到状态0。
状态2:读入空格或制表符(\t),切换到状态3,读入其他的字符,切换到状态0。
状态3:读入'>',成功获得一个,读入其他的字符,状态不变。为了更容易说明问题。在本文给出的网络蜘蛛中只提取了html代码中中的href属性中的url。本文中所采用的分析方法是分步进行提取href。首先将html代码中的标签整个提出来。不包括和前面的字符,如comprg中只提取,而comprg将被忽略,因为这里并没有url。
本文使用了一个状态机来的提取,这个状态机分为五个状态(0 至 4)。第一个状态是初始态,最后一个状态为终止态,如果到达最后一个状态,说明已经成功获得了一个
状态机如图1所示。
图1
最后一个双环的状态是最终态。下面让我们来看看获得的实现代码。
getA方法的实现
// 获得html中的
private void getA()
{
char[] buffer = new char[1024];
int state = 0;
String a = "";
while (!sr.EndOfStream)
{
int n = sr.Read(buffer, 0, buffer.Length);
for (int i = 0; i < n; i++)
{
switch (state)
{
case 0: // 状态0
if (buffer[i] == '<') // 读入的是'<'
{
a += buffer[i];
state = 1; // 切换到状态1
}
break;
case 1: // 状态1
if (buffer[i] == 'a' || buffer[i] == 'A') // 读入是'a'或'A'
{
a += buffer[i];
state = 2; // 切换到状态2
}
else
{
a = "";
state = 0; // 切换到状态0
}
break;
case 2: // 状态2
if (buffer[i] == ' ' || buffer[i] == '\t') // 读入的是空格或'\t'
{
a += buffer[i];
state = 3;
}
else
{
a = "";
state = 0; // 切换到状态0
}
break;
case 3: // 状态3
if (buffer[i] == '>') // 读入的是'>',已经成功获得一个
{
a += buffer[i];
try
{
string url = getUrl(getHref(a)); // 获得中的href属性的值
if (url != null)
{
if (findUrl != null)
findUrl(url); // 引发发现url的事件
}
}
catch (Exception e)
{
}
state = 0; // 在获得一个后,重新切换到状态0
}
else
a += buffer[i];
break;
}
}
}
}
更多精彩
赞助商链接