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

时间:2021-08-27 21:22:12
是这样的,公司要我做个采集,采集一些关于我们网站相关的资料
采集是会做了,可是只能输入一个地址,然后采集那个地址
第一个问题:怎么只要输入一个地址,然后采集这个网页,还采集这一页网页的上一页下一页的链接,
如果这页采集完了就自动到下一页的链接采集呢?
第二个问题:怎么采用多线程采集呢?查了下资料说多线程可以很好的利用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事件里的 这样可以吗?

35 个解决方案

#1


这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html

#2


该回复于2010-11-03 13:29:25被版主删除

#3


开个公司好累

#4


使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));

#5


用HttpRequest实现,不要用HttpWebRequest  

#6


采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧

#7


该回复于2010-12-02 16:57:01被版主删除

#8


该回复于2010-11-03 16:27:09被版主删除

#9


用采用线程池

#10


引用 4 楼 sp1234 的回复:
使用系统线程池来执行一个任务,就是这样一句话:

C# code
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));

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);

#11


自动重定向。

#12


引用 5 楼 panzhige 的回复:
用HttpRequest实现,不要用HttpWebRequest
为什么不要用HttpWebrequest呢?有什么坏处吗?

#13


最好能在网上找个例子。先读读吧....csdn下载里面应该很多。

#14



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();  
   }  

#15


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

#16


多线程不会的路过...

#17


该回复于2010-12-02 17:19:01被版主删除

#18


按照ls的大侠们试了一下线程池的,可是只采集到18个,总共有241个的,用单线程的话就可以全部采集到,
这是为什么呢?而且屏幕右下角端口号会自己掉下来

        protected void Button5_Click(object sender, EventArgs e)
        {
            DateTime star = DateTime.Now;
            StringBuilder sb = new StringBuilder();
            foreach (string result in ilist)//ilist是链接的集合
            {
                ThreadPool.QueueUserWorkItem(delegate(object param)
                {
                    Save2(result);
                });
            }
            DateTime end = DateTime.Now;
            Response.Write((end - star).TotalMilliseconds);
        }

#19


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

#20


每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分


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

#21


该回复于2010-11-03 16:50:48被版主删除

#22


问大家一个有关多线程的问题,帮顶有分SOS紧急求救!

#23


多线程不咋的会  帮你顶

#24


没有这方面的经验 帮顶

#25


该回复于2010-12-02 17:19:02被版主删除

#26


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

#27


谢谢大家!继续等待!

#28



一页一页的抓取,主要是变化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();

多线程多声明几次就可以。

#29


大侠在来帮帮忙!

#30


多线程,网上很多例子

#31


可以 参考 火车头 软件

简单点 网页源码分析呢

#32


该回复于2010-11-04 09:56:11被版主删除

#33


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

#34




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


#35


学习,顺便帮顶!人家说了,帮顶有分地.....

#1


这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html

#2


该回复于2010-11-03 13:29:25被版主删除

#3


开个公司好累

#4


使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));

#5


用HttpRequest实现,不要用HttpWebRequest  

#6


采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧

#7


该回复于2010-12-02 16:57:01被版主删除

#8


该回复于2010-11-03 16:27:09被版主删除

#9


用采用线程池

#10


引用 4 楼 sp1234 的回复:
使用系统线程池来执行一个任务,就是这样一句话:

C# code
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));

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);

#11


自动重定向。

#12


引用 5 楼 panzhige 的回复:
用HttpRequest实现,不要用HttpWebRequest
为什么不要用HttpWebrequest呢?有什么坏处吗?

#13


最好能在网上找个例子。先读读吧....csdn下载里面应该很多。

#14



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();  
   }  

#15


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

#16


多线程不会的路过...

#17


该回复于2010-12-02 17:19:01被版主删除

#18


按照ls的大侠们试了一下线程池的,可是只采集到18个,总共有241个的,用单线程的话就可以全部采集到,
这是为什么呢?而且屏幕右下角端口号会自己掉下来

        protected void Button5_Click(object sender, EventArgs e)
        {
            DateTime star = DateTime.Now;
            StringBuilder sb = new StringBuilder();
            foreach (string result in ilist)//ilist是链接的集合
            {
                ThreadPool.QueueUserWorkItem(delegate(object param)
                {
                    Save2(result);
                });
            }
            DateTime end = DateTime.Now;
            Response.Write((end - star).TotalMilliseconds);
        }

#19


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

#20


每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分


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

#21


该回复于2010-11-03 16:50:48被版主删除

#22


问大家一个有关多线程的问题,帮顶有分SOS紧急求救!

#23


多线程不咋的会  帮你顶

#24


没有这方面的经验 帮顶

#25


该回复于2010-12-02 17:19:02被版主删除

#26


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

#27


谢谢大家!继续等待!

#28



一页一页的抓取,主要是变化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();

多线程多声明几次就可以。

#29


大侠在来帮帮忙!

#30


多线程,网上很多例子

#31


可以 参考 火车头 软件

简单点 网页源码分析呢

#32


该回复于2010-11-04 09:56:11被版主删除

#33


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

#34




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


#35


学习,顺便帮顶!人家说了,帮顶有分地.....