好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

爬虫开发(一)

爬虫开发(一)

爬虫开发(一)

爬虫主要用来做数据采集,又名网络蜘蛛,内容网站很多就是用爬虫来抓取数据的。本系列(现在还不知道有几篇)旨在实现一个基本的爬虫程序(框架)。开发语言:C#

  爬虫是要从源源不断的抓取到的页面中过滤出我需要的目标数据。既然要源源不断的抓取数据,那么我们就要有一个各个页面的URL的集合,去模拟访问这些URL,来分析返回的数据,从而再根据我们分析的HTML DOM结构获取到我们需要的数据。

  URL的获取,通常,我们应该有一个Root节点,也就是根URL,然后就像树形结构一样去遍历他的各个子节点。说的形象一点,比如,一个网站的首页,上面有各个导航的URL1、URL2,URL3……也就是说只要我们获取到了网站首页的数据,然后筛选出所有的URL,就能获取这个根URL的直接子节点。然后我们再获取URL1的数据,从而获取URL1的直接子节点,然后一直这样重复下去,最后我们就可以得到一个庞大的树形结构。

  数据的获取,每请求一个URL都会返回数据,也就是HTML文档的源码,我们要获取目标数据就要弄明白文档结构,而不同的页面有不同的文档结构。废话不多说了,程序员之间交流,还是直接上代码更容易理解。

  对于Http访问,这里使用WebClient。新建一个Crawler的类库,并且新建一个Crawler类,代码如下:

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   System.Net;
   6   using   System.IO;
   7  
  8   namespace   Crawler
   9   {
  10       ///   <summary> 
 11       ///   爬虫
  12       ///   </summary> 
 13       public   class   Crawler
  14       {
  15           ///   <summary> 
 16           ///   基URI
  17           ///   </summary> 
 18           public   string  BaseUri {  get ;  set  ; }
  19  
 20           ///   <summary> 
 21           ///   构造函数
  22           ///   </summary> 
 23           ///   <param name="url">  基URI  </param> 
 24           public  Crawler( string   baseUri)
  25           {
  26               this .BaseUri =  baseUri;
  27           }
  28  
 29           ///   <summary> 
 30           ///   构造函数
  31           ///   </summary> 
 32           public   Crawler() { }
  33  
 34           ///   <summary> 
 35           ///   保存数据处理程序
  36           ///   </summary> 
 37           public  Action< string >  SaveHandler;
  38  
 39           ///   <summary> 
 40           ///   采集数据
  41           ///   </summary> 
 42           public   void  Crawl( string   targetUri)
  43           {
  44              WebClient webClient =  new   WebClient();
  45  
 46               //   设置基URI 
 47              webClient.BaseAddress =  this  .BaseUri;
  48  
 49               //   获取流 
 50              StreamReader reader =  new   StreamReader(webClient.OpenRead(targetUri), Encoding.UTF8);
  51  
 52               //   读取数据 
 53               string  html =  reader.ReadToEnd();
  54  
 55               //   关闭流 
 56               reader.Close();
  57  
 58               //   保存结果 
 59               this  .Save(html);
  60  
 61           }
  62  
 63           ///   <summary> 
 64           ///   保存数据
  65           ///   </summary> 
 66           ///   <param name="html">  数据  </param> 
 67           private   void  Save( string   html)
  68           {
  69               SaveHandler(html);
  70           }
  71       }
  72  }

这样一个很简单的爬虫类就写完了,我们可以试着调用一下,新建一个控制台应用程序,代码如下:

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   Crawler;
   6  
  7   namespace   CrawlerConsole
   8   {
   9       class   Program
  10       {
  11           static   void  Main( string  [] args)
  12           {
  13  
 14              Crawler.Crawler crawler =  new  Crawler.Crawler( "  http://HdhCmsTestbaidu测试数据  "  );
  15  
 16              crawler.SaveHandler =  new  Action< string >(html =>  Console.WriteLine(html));
  17  
 18              crawler.Crawl( "  /  "  );
  19  
 20           }
  21       }
  22  }

然后我们Ctrl+F5运行一下,就可以看到我们爬到的百度首页的源码输出到控制台了。

简单介绍一下代码中几个需要注意的地方:

基URI:就是相对地址的主URI,我Crawl方法的参数就要要爬的地址,"/"相对于基URI"http://HdhCmsTestbaidu测试数据"来说就是本页面,也就是首页。看MSDN的解释, BaseAddress  属性包含一个组合了相对地址的基 URI。 调用上载或下载数据的方法时, WebClient  对象将此基 URI 与您在方法调用中指定的相对地址进行组合。 如果指定的是绝对 URI,则  WebClient  不使用  BaseAddress  属性值。 若要移除以前设置的值,请将  BaseAddress  设置为  null 引用(在 Visual Basic 中为  Nothing )  或空字符串 ("")。

WebClient.OpenRead():

OpenRead  方法创建一个  Stream  实例,该实例用于读取  address  参数指定的资源的内容。 此方法在打开流时阻止。 若要在等待流的同时继续执行,请使用  OpenReadAsync 方法之一。

如果  BaseAddress  属性不是空字符串 (""),且  address  不包含绝对 URI,则  address  必须是相对 URI,此 URI 与  BaseAddress  组合在一起构成所请求数据的绝对 URI。 如果 QueryString  属性不为  null 引用(在 Visual Basic 中为  Nothing ) ,则将它追加到  address 。

关于WebClient的更多信息请参照MSDN: http://msdn.microsoft测试数据/zh-cn/library/tt0f69eh(v=vs.100).aspx

先这样吧,我会尽量抓紧写后面的篇章,最近实在是忙,月底要离职了,还连加六天班。。。

 

 

分类:  爬虫

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于爬虫开发(一)的详细内容...

  阅读:39次