zoukankan      html  css  js  c++  java
  • 爬虫开发(一)

    爬虫开发(一)

    爬虫主要用来做数据采集,又名网络蜘蛛,内容网站很多就是用爬虫来抓取数据的。本系列(现在还不知道有几篇)旨在实现一个基本的爬虫程序(框架)。开发语言: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://www.baidu.com");
    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://www.baidu.com"来说就是本页面,也就是首页。看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.com/zh-cn/library/tt0f69eh(v=vs.100).aspx

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

     
     
    分类: 爬虫
  • 相关阅读:
    k8s 组件介绍-kube-controller-manager
    k8s 组件介绍-API Server
    ELK+filebeat+redis 日志分析平台
    Logstash配置文件详情
    Logstash,Fluentd, Logtail对比伤害
    公司redis
    Linux之网络ping(unknown host)故障及yum no more mirrors to try
    Linux思维导图之计划任务
    Linux思维导图之进程管理
    Linux思维导图之网络管理
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2979441.html
Copyright © 2011-2022 走看看