构造C#语言的爬虫蜘蛛程序

C#特别适合于构造蜘蛛程序,这是因为它已经内置了HTTP访问和多线程的能力,而这两种能力对于蜘蛛程序来说都是非常关键的。下面是构造一个蜘蛛程序要解决的关键问题:

⑴ HTML分析:需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面。

⑵ 页面处理:需要处理每一个下载得到的页面。下载得到的内容可能要保存到磁盘,或者进一步分析处理。

⑶ 多线程:只有拥有多线程能力,蜘蛛程序才能真正做到高效。

⑷ 确定何时完成:不要小看这个问题,确定任务是否已经完成并不简单,尤其是在多线程环境下。

一、HTML解析

本文提供的HTML解析器由ParseHTML类实现,使用非常方便:首先创建该类的一个实例,然后将它的Source属性设置为要解析的HTML文档:

ParseHTML parse = new ParseHTML();
parse.Source = "
Hello World
";

接下来就可以利用循环来检查HTML文档包含的所有文本和标记。通常,检查过程可以从一个测试Eof方法的while循环开始:

while(!parse.Eof())
{
char ch = parse.Parse();

Parse方法将返回HTML文档包含的字符--它返回的内容只包含那些非HTML标记的字符,如果遇到了HTML标记,Parse方法将返回0值,表示现在遇到了一个HTML标记。遇到一个标记之后,我们可以用GetTag()方法来处理它。

if(ch==0)
{
HTMLTag tag = parse.GetTag();
}

一般地,蜘蛛程序最重要的任务之一就是找出各个HREF属性,这可以借助C#的索引功能完成。例如,下面的代码将提取出HREF属性的值(如果存在的话)。

Attribute href = tag["HREF"];

string link = href.Value;

获得Attribute对象之后,通过Attribute.Value可以得到该属性的值。

二、处理HTML页面

下面来看看如何处理HTML页面。首先要做的当然是下载HTML页面,这可以通过C#提供的HttpWebRequest类实现:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri);
response = request.GetResponse();
stream = response.GetResponseStream();

接下来我们就从request创建一个stream流。在执行其他处理之前,我们要先确定该文件是二进制文件还是文本文件,不同的文件类型处理方式也不同。下面的代码确定该文件是否为二进制文件。

if( !response.ContentType.ToLower().StartsWith("text/") )
{
SaveBinaryFile(response);
return null;
}
string buffer = "",line;

如果该文件不是文本文件,我们将它作为二进制文件读入。如果是文本文件,首先从stream创建一个StreamReader,然后将文本文件的内容一行一行加入缓冲区。

reader = new StreamReader(stream);
while( (line = reader.ReadLine())!=null )
{
buffer+=line+"rn";
}

装入整个文件之后,接着就要把它保存为文本文件。

SaveTextFile(buffer);

时间: 2025-01-11 12:23:29

构造C#语言的爬虫蜘蛛程序的相关文章

爬虫/蜘蛛程序的制作(C#语言)

程序 问题是对某一网站或所有网站进行抓取,即下载所有网页.怎么实现呢? 先将问题最小化(转化的思想,转化为小规模,可以解决的问题):如果只有一个网页,怎么下载?问题变地很简单,只要用WebClient/WebRequest(甚至OpenFileDialog都可以)打开Url地址,将数据流存入本地存储器的文件(以相应的扩展名作为扩展名)即可.示例代码如下: string BoardStream;//下载内容存入此变量 Uri url = new Uri( "http://www.163.com&q

如何构造一个C#语言的爬虫程序

C#特别适合于构造蜘蛛程序,这是因为它已经内置了HTTP访问和多线程的能力,而这两种能力对于蜘蛛程序来说都是非常关键的.下面是构造一个蜘蛛程序要解决的关键问题: ⑴ HTML分析:需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面. ⑵ 页面处理:需要处理每一个下载得到的页面.下载得到的内容可能要保存到磁盘,或者进一步分析处理. ⑶ 多线程:只有拥有多线程能力,蜘蛛程序才能真正做到高效. ⑷ 确定何时完成:不要小看这个问题,确定任务是否已经完成并不简单,尤其是在多线程环境下. 一.HTML解析

使用C#实现蜘蛛程序

"蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载Web页面以便脱机使用,开发者利用蜘蛛程序扫描自己的Web检查无效的链接--对于不同的用户,蜘蛛程序有不同的用途.那么,蜘蛛程序到底是怎样工作的呢? 蜘蛛是一种半自动的程序,就象现实当中的蜘蛛在它的Web(蜘蛛网)上旅行一样,蜘蛛程序也按照类似的方式在Web链接织成的网上旅行.蜘蛛程序之所以是半自动的,是因为它总

360综合搜索推出爬虫蜘蛛 开发竞价排名系统

A5站长网8月28日消息,昨日360综合搜索宣布正式推出搜索蜘蛛(也叫爬虫)--360Spider.360综合搜索新浪官方微博称如果站长希望自己的网站被360综合搜索收录,请检查一下网站robots.txt 文件是否允许360搜索蜘蛛抓取您的网站内容.如果网站还没有允许360搜索蜘蛛抓取,只要在robots.txt 文件中添加360Spider相关代码即可. 开发竞价排名系统-蜘蛛爬虫">   robots.txt 文件中添加360Spider相关代码 根据最新数据显示,360综合搜索在上

如何优雅地使用c语言编写爬虫_C 语言

大家在平时或多或少地都会有编写网络爬虫的需求.一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择.选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述语言的爬虫框架非常之多和完善.良好的爬虫框架可以确保爬虫程序的稳定性,以及编写程序的便捷性.所以,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序. 1.爬虫的特性 配置方便.使用一句设置函数,即可定义user agent,cookie,time

多线程蜘蛛程序的实现

多线程蜘蛛程序是一个很有用的组件, 我在自己开发的Spider Studio中也提供了一个. 在设计上我尽量遵循使用简 单的原则, 大量使用dynamic对象的特性, 使得代码非常精简灵活, 通过17行就能实现一个功能比较齐全的蜘蛛程序. 现 在和大家分享一下: public void Run() { dynamic link = new ExpandoObject(); link.Url = "http://news.163.com"; Spider.AddLink(link); S

c语言-C语言自己写的程序有个小错,求改下

问题描述 C语言自己写的程序有个小错,求改下 #includeint main(){ int nlkyt1t2t3;char x1x2x3;t1=0;t2=0;t3=0; printf(""请输入现在队伍的列数:n""); scanf(""%d""&n); printf(""拉面的制作时间:n""); scanf(""%d""&l)

在osx系统下,能用c语言编写窗口化的程序么?

问题描述 在osx系统下,能用c语言编写窗口化的程序么? 在mac下,c语言能编写窗口化的程序么, 我在网上搜索了下,没有具体的回答,但是有人说程序是否窗口化和语言无关,只和 调用的api有关... 小弟菜鸟一个,求大神给解答下,如果调用api怎么调用啊.. 用的xcode,可我确实是太菜了,用不明白啊,哪位大牛推荐个网站,帖子,视频之类的, 让我学习学习,不胜感激-- 解决方案 可以的,使用qt.http://blog.csdn.net/libaineu2004/article/details

单片机编程 keil-关于c语言写的单片机程序

问题描述 关于c语言写的单片机程序 if(k2==0&&flg_start==1) { if(deng==0xfe||deng==0xfd) flg_zy=0; if(YDX==YD&&k2==0)//这里运行不是很流畅,到了后面的程序运行不起来 Mode=1; else if(YDX==TD&&k2==0) Mode=2; else if(YDX==SD&&k2==0) Mode=3; while(k2==0); } ... if(flg_