这几天自己写了个爬虫程序,感觉运行不快,同样一个网站,我用XENU采集,可达到1000页/分,自己写的却只能达到150页/分,估计是线程中的问题,同时开10个线程,在监测中平均只有3个处在Running状态中,其它都是处于WaitSleepJoin状态中,不知道哪位高手能帮忙看一下.//采集的主线程代码
#region 下载所有链接
        private string ReadUrl()
        {
            //读取待采集地址
            string url = null;
            for (int i = 0; i < lst.Items.Count; i++)
            {
                if (lst.Items[i].SubItems[3].Text == "等待")
                {
                    url = lst.Items[i].SubItems[2].Text;
                    return url;
                }
            }
            return url;
        }
        /// <summary>
        /// 开始下载所有链接
        /// </summary>
        private void GetLinks()
        {
            
            string url = ReadUrl();
            //读取URL,如果多次没有URL,则停止线程的运行
            if (url == null)
            {
                NoHref++;
                if (NoHref > ThreadNumber * 4)
                    Thread.CurrentThread.Abort();
                Thread.Sleep(1000);
                GetLinks();
            }
            //更新UI,和更改下载状态
            lst.Invoke(new WeiTuo(UpdateDowningStatus), new object[] { url, Thread.CurrentThread.Name, "下载中…" });
            string content = CaiJi.GetWebPage(url, Ecd);
            FileLength += content.Length;            DownedUrls = array.ArrayAddItem(DownedUrls, url);
            if (content.Length == 0)//如果返回内容为空,则递归
            {
                lst.Invoke(new WeiTuoError(DownError), new object[] { url, content });
                GetLinks();
            }
            if (content.IndexOf("Error:") != -1)
            {
                if (content.IndexOf("远程服务器") > 0)
                    content = "404";
                else
                    content = "TimeOut";
                lst.Invoke(new WeiTuoError(DownError), new object[] { url, content });
                GetLinks();
            }
            lst.Invoke(new WeiTuo(UpdateDowningStatus), new object[] { url, Thread.CurrentThread.Name, "完成" });
            ViewItemsAdd(content, url);
            Thread.Sleep(0);
            GetLinks();
        }
        #endregion//用于采集的程序

解决方案 »

  1.   


    只看到这些代码,不足以解决你的问题。
    谈谈自己的体会吧:
    (1) 网站是否允许你连这么多的线程 。作个对比试验, 再运行一个你这个程序的副本*共2个副本,也开10个线程,看几个在等待。如果都在等待,
    (2)你的带宽够吧,那三个线程把带宽占完了,后边的只有等待了,看下带宽有没有空余。
    (3) 一些“笨重”线程,会点用本机的大部分资源,其它的线程只能等待了。验证一下。
    (4)你有没有“重复”读取网页,你如果排除那些重复的? 如果它不读重复的,也不读未过期的,那他有3000页也不过分(3000页全是新抓下来的吗)确认下。管中窥豹,仅供参考 。
      

  2.   

    嗯,这个是重点,我把程序中耗内存的操作和许多不是采集必须的操作去掉后,快多了。
    谢谢。