这几天自己写了个爬虫程序,感觉运行不快,同样一个网站,我用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//用于采集的程序
#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) 网站是否允许你连这么多的线程 。作个对比试验, 再运行一个你这个程序的副本*共2个副本,也开10个线程,看几个在等待。如果都在等待,
(2)你的带宽够吧,那三个线程把带宽占完了,后边的只有等待了,看下带宽有没有空余。
(3) 一些“笨重”线程,会点用本机的大部分资源,其它的线程只能等待了。验证一下。
(4)你有没有“重复”读取网页,你如果排除那些重复的? 如果它不读重复的,也不读未过期的,那他有3000页也不过分(3000页全是新抓下来的吗)确认下。管中窥豹,仅供参考 。
谢谢。