问大家一个有关多线程的问题,帮顶有分

linnight 2010-11-03 08:48:53
是这样的,公司要我做个采集,采集一些关于我们网站相关的资料
采集是会做了,可是只能输入一个地址,然后采集那个地址
第一个问题:怎么只要输入一个地址,然后采集这个网页,还采集这一页网页的上一页下一页的链接,
如果这页采集完了就自动到下一页的链接采集呢?
第二个问题:怎么采用多线程采集呢?查了下资料说多线程可以很好的利用cpu,而且速度肯定比一篇一篇采集快

采集代码

string url = "http://www.qq.com/";
string path = Server.MapPath("index.html");
StringBuilder sb = new StringBuilder();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
WebResponse rep = req.GetResponse();
using (StreamReader sr = new StreamReader(rep.GetResponseStream())
{
sb.Append(sr.ReadToEnd());
}
using (StreamWriter sw = new StreamWriter(path,false))
{
sw.WriteLine(sb.ToString());
}
}

请教下该怎么改呢?还有我是写在button事件里的 这样可以吗?
...全文
228 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
U2008 2010-11-04
  • 打赏
  • 举报
回复


路过............................


linnight 2010-11-04
  • 打赏
  • 举报
回复
xu_diligent 2010-11-04
  • 打赏
  • 举报
回复
学习,顺便帮顶!人家说了,帮顶有分地.....
zhouxingyu896 2010-11-03
  • 打赏
  • 举报
回复
可以 参考 火车头 软件

简单点 网页源码分析呢
hch126163 2010-11-03
  • 打赏
  • 举报
回复
多线程,网上很多例子
村长_乐 2010-11-03
  • 打赏
  • 举报
回复
多线程不会的路过...
linnight 2010-11-03
  • 打赏
  • 举报
回复
大侠在来帮帮忙!
kkbac 2010-11-03
  • 打赏
  • 举报
回复
ajq1989 2010-11-03
  • 打赏
  • 举报
回复

class Program
{
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
actions.Add(() => Console.WriteLine("A1"));
actions.Add(() => Console.WriteLine("A2"));
actions.Add(() => Console.WriteLine("A3"));
actions.Add(() => Console.WriteLine("A4"));

foreach (var action in actions)
{
ThreadPool.QueueUserWorkItem(state => action(), null); }

Console.Read();
}
}
wuhongxa 2010-11-03
  • 打赏
  • 举报
回复
最好能在网上找个例子。先读读吧....csdn下载里面应该很多。
linnight 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 panzhige 的回复:]
用HttpRequest实现,不要用HttpWebRequest
[/Quote]为什么不要用HttpWebrequest呢?有什么坏处吗?
mark620 2010-11-03
  • 打赏
  • 举报
回复
自动重定向。
linnight 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sp1234 的回复:]
使用系统线程池来执行一个任务,就是这样一句话:

C# code
ThreadPool.QueueUserWorkItem(new Action(()=>{
//todo: 这里写你要执行的方法的代码
}));
[/Quote]
sp大哥自己做老板拉!

DateTime star = DateTime.Now;
StringBuilder sb = new StringBuilder();
Thread td = null;
foreach (string result in ilist)
{
td = new Thread(new ParameterizedThreadStart(Save2));
/*
为什么这里用多线程来采集的话总是没有采集完,只有7,8个
如果改用Save(result, Server.MapPath(@"collection/" + datetime + ".html"));这样直接保存的话是有全部采集到,总共241个,这是为什么呢?
*/

td.Start(result);
}
DateTime end = DateTime.Now;
Response.Write((end - star).TotalMilliseconds);
sunny_yu 2010-11-03
  • 打赏
  • 举报
回复
用采用线程池
一一一一 2010-11-03
  • 打赏
  • 举报
回复
采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧
panzhige 2010-11-03
  • 打赏
  • 举报
回复
用HttpRequest实现,不要用HttpWebRequest
  • 打赏
  • 举报
回复
使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
//todo: 这里写你要执行的方法的代码
}));
  • 打赏
  • 举报
回复
开个公司好累
damjmk2 2010-11-03
  • 打赏
  • 举报
回复
这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html
haa17 2010-11-03
  • 打赏
  • 举报
回复

一页一页的抓取,主要是变化url里面的参数。
比如:
http://www.baidu.com/s?wd=asd&pn=0&usm=2 第1页
http://www.baidu.com/s?wd=asd&pn=10&usm=2 第2页

生成对应的url即可,然后扔给采集代码里面的url

线程,声明下,然后调用对应方法就可以

Thread thread = new Thread(new ThreadStart(方法));
thread.Start();

多线程多声明几次就可以。
加载更多回复(8)

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧