zoukankan      html  css  js  c++  java
  • C# 爬虫小程序

    设计思路

    主要基于Http Get请求网页数据,进行分析。涉及递归调用,多线程提高效率,守护线程等。
    

    相关技术

    • 抽象类
    • 多线程
    • 队列
    • Http Get请求
    • 字符串解析

    项目结构

    • AbsChain

    职责链抽象类,负责定义HTML处理方法,定义递归处理方法等

    • AbsThreadManager

    线程管理抽象类,负责定义守望线程,管理多线程

    • UrlQueue

    URL队列对象,管理URL队列

    • Crawl

    爬虫对象,负责结合URL队列与职责链,运行爬取功能

    • HttpGet

    HTTP GET请求类,负责获取HTML文本

    • ThreadEntity

    爬虫线程,实体对象

    简单爬虫示例

    以下示例为一个简单的获取HTML页面文本示例,可以做到下载文本,并进行分析,可以说是最简单的爬虫
    
                WebClient wc = new WebClient();
                byte[] response = wc.DownloadData("http://www.weather.com.cn/weather/101120501.shtml");
                string ss = Encoding.UTF8.GetString(response);
    

    项目代码调用示例

    • 创建继承类,继承职责链,负责具体爬虫方法
        public class NodeChain : AbsChain
        {
            #region 去除头部的'与"
            /// <summary>
            /// 去除头部的'与"
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            private string RemoveQuotation(string url)
            {
                if ((url.IndexOf("'") == 0) || (url.IndexOf(""") == 0))
                {
                    url = url.Remove(0, 1);
                    if (url.IndexOf("'") != -1)
                    {
                        url = url.Remove(url.IndexOf("'"), 1);
                    }
                    if (url.IndexOf(""") != -1)
                    {
                        url = url.Remove(url.IndexOf("""), 1);
                    }
                }
                if (url.IndexOf(" ") != -1)
                {
                    url = url.Remove(url.IndexOf(" "));
                }
                return url;
            }
            #endregion
    
            #region 处理网页
            /// <summary>
            /// 处理网页
            /// </summary>
            /// <param name="html"></param>
            protected override void Process(string html)
            {
                try
                {
                    Regex re = new Regex(@"href=(?<web_url>[sS]*?)>|href=""(?<web_url>[sS]*?)""|href='(?<web_url>[sS]*?)'");
                    MatchCollection mc = re.Matches(html);
                    foreach (Match m in mc)
                    {
                        string url = m.Groups["web_url"].ToString();
                        url = this.RemoveQuotation(url);
                        if (url.IndexOf("http://") != -1)
                        {
                            UrlQueue.GetInstance().Enqueue(url);
                        }
                    }
                    string title = string.Empty;
                    re = new Regex(@"<title[sS]*?>(?<title>[sS]*?)</title>");
                    Match temp = re.Match(html.ToLower());
                    title = temp.Groups["title"].ToString();
                    if (!string.IsNullOrEmpty(title))
                    {
                        Console.WriteLine(string.Format("网页标题:{0}",title));
                        Console.WriteLine(string.Format("网页URL:{0}", this.Url));
                    }
                }
                catch
                {
                }
            }
            #endregion
        }
    
    • 创建线程管理继承类,负责重写新建职责链对象
        public class ThreadManager:AbsThreadManager
        {
            protected override AbsChain GetChainHeader()
            {
                return new NodeChain();
            }
        }
    
    • 设置URL入口,运行爬虫
                try
                {
                    Console.Title = System.Configuration.ConfigurationManager.AppSettings["Title"].ToString();
                    Console.WriteLine("Process is running!");
                    
                    string url = System.Configuration.ConfigurationManager.AppSettings["URL"].ToString();
                    UrlQueue.GetInstance().Enqueue(url);
                    ThreadManager thread = new ThreadManager();
                    thread.Start();
                }
                catch (Exception ex)
                {
                }
    

    GitHub

    .NET-App/NetSpider/

  • 相关阅读:
    [Hadoop 周边] Hadoop和大数据:60款顶级大数据开源工具(2015-10-27)【转】
    [Nginx] 关键概念解读
    [随想感悟] 研究技术的方法
    [Hadoop 周边] 浅谈大数据(hadoop)和移动开发(Android、IOS)开发前景【转】
    [优化] 数据库优化基础
    [随想感悟] 面试时,问哪些问题能试出一个 Android 应用开发者真正的水平?【转自知乎】
    258. Add Digits
    257. Binary Tree Paths
    256. Paint House
    255. Verify Preorder Sequence in Binary Search Tree
  • 原文地址:https://www.cnblogs.com/bmbh/p/9042974.html
Copyright © 2011-2022 走看看