码迷,mamicode.com
首页 > Windows程序 > 详细

C# 爬虫小程序

时间:2018-05-15 22:31:54      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:RoCE   获取   新建   创建线程   职责链   mat   dex   .config   项目   

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>[\s\S]*?)>|href=""(?<web_url>[\s\S]*?)""|href='(?<web_url>[\s\S]*?)'");
                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[\s\S]*?>(?<title>[\s\S]*?)</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)
            {
            }

C# 爬虫小程序

标签:RoCE   获取   新建   创建线程   职责链   mat   dex   .config   项目   

原文地址:https://www.cnblogs.com/bmbh/p/9042974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!