苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4420|回复: 2

[其他] C# 爬虫的多线程问题

[复制链接]
发表于 2013-5-1 16:49:00 | 显示全部楼层 |阅读模式
  最近尝试做一个爬虫软件,根据关键字进行抓取页面。其他方面还好,查了不少资料都还弄得比较像样。但是我对多线程这块实在是拙计... 看了书也还是调试不出来,很是着急啊... 下面我给出一个我用来下载页面的类的原型,希望有热心的前辈能根据这个类写一个多线程下载的示例,能注释一下就更好了。感激不尽!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;

namespace 多线程爬虫_test01
{
    public class Crawler
    {
        //基地址
        public static Uri baseUri;
        public static string baseHost = string.Empty;

        /// <summary>
        /// 工作队列
        /// </summary>
        public static Queue<string> todo = new Queue<string>();

        //已访问的队列
        public static HashSet<string> visited = new HashSet<string>();
   
        public Crawler(string url)
        {
            baseUri = new Uri(url);

            //基域
            baseHost = baseUri.Host.Substring(baseUri.Host.IndexOf('.'));

            //抓取首地址入队
            todo.Enqueue(url);
        }

        public void DownLoad()
        {

            while (todo.Count > 0)
            {
              
                {
                    var currentUrl = todo.Dequeue();
         
                    visited.Add(currentUrl);
               
               
                 try
                    {
                        var request = WebRequest.Create(currentUrl) as HttpWebRequest;

                        var response = request.GetResponse() as HttpWebResponse;

                        var sr = new StreamReader(response.GetResponseStream());
                         RefineUrl(sr.ReadToEnd());
                    }
                    catch (WebException e)
                    {
                        System.Console.WriteLine("下载失败,错误:" + e);

                    }
                    catch (IOException e)
                    {
                        System.Console.WriteLine("下载失败,错误:" + e);
                    }
                    //提取url,将未访问的放入todo表中
                }
            }

        }

        /// <summary>
        /// 提取Url
        /// </summary>
        /// <param name="html"></param
        public void RefineUrl(string html)
        {
            // Monitor.Enter(this);
      

                {
                    Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(??!</?a\b).)*)</a>");

                    MatchCollection mc = reg.Matches(html);

                    foreach (Match m in mc)
                    {
                        var url = m.Groups["url"].Value;

                        if (url == "#")
                            continue;

                        //相对路径转换为绝对路径
                        Uri uri = new Uri(baseUri, url);

                        //剔除外网链接(获取顶级域名)
                        if (!uri.Host.EndsWith(baseHost))
                            continue;
                        if (uri.Host.StartsWith("ftp"))
                            continue;
                        if (!visited.Contains(uri.ToString()) && !todo.Contains(uri.ToString()))
                        {
                       
                            todo.Enqueue(uri.ToString());
                     
                        }
                    }
                  
                }
            }
        }
    }              


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-5-1 16:52:08 | 显示全部楼层
你搜多线程,有例子
 楼主| 发表于 2013-5-1 17:17:47 | 显示全部楼层
站长苏飞 发表于 2013-5-1 16:52
你搜多线程,有例子

感谢您的回复,找到问题了。我需要补充的知识太多了。今天晚上好好研究一下这个。到时如果实在不行的话,还望得到您的指教。感谢。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-26 03:04

© 2014-2021

快速回复 返回顶部 返回列表