java多线程抓取新闻

任务描述:
    有个信息发布网站,按照条件会查询出数据,按页显示,每页15条,每条信息为一个url链接。点击链接再打开一个页面,显示这条的详细信息。

    我们需要做的是把每条的详细信息都抓取下来,保存到数据库中。

开始我做好了抓取的所有程序,保存到数据库中。
做完运行,发现速度很慢,因为数据量比较大,大约有30多万条详细信息需要抓取。

就想到这个用多线程来实现真是再好不过了,开15条线程,一次就把一页的详细信息都抓取下来,不是很快吗?

后来加上多线程后,一次开16线程,比原来快了很多,呵呵~!


因为这个工程是用java实现的,下面是java实现这个多线程的主要代码,用c#应该也是一样的!有兴趣的可以翻译成c#的,厚厚~

  1. import java.util.ArrayList;  
  2.   
  3. public class Catcher  
  4. {  
  5.     private static ArrayList threads= new ArrayList();//存储未处理URL  
  6.     public static boolean isFinished=false;//是否已经把所有的链接存到threads了  
  7.      
  8.     public synchronized String  getUrl()  
  9.     {  
  10.         if(threads.size()>0)  
  11.         {  
  12.             String tmp = String.valueOf(threads.get(0));  
  13.             threads.remove(0);  
  14.             return tmp;  
  15.         }else  
  16.             return null;  
  17.     }  
  18.     public void process(){  
  19.         //处理预处理  
  20.        //下面开10个线程等待处理  
  21.      new Thread(new Processer(this)).start();  
  22.      new Thread(new Processer(this)).start();  
  23.      new Thread(new Processer(this)).start();  
  24.      new Thread(new Processer(this)).start();  
  25.      new Thread(new Processer(this)).start();  
  26.      new Thread(new Processer(this)).start();  
  27.      new Thread(new Processer(this)).start();  
  28.      new Thread(new Processer(this)).start();  
  29.      new Thread(new Processer(this)).start();  
  30.      new Thread(new Processer(this)).start();  
  31.   
  32.         //进入翻页的处理  
  33.         for(int j=0;j<10;j++)//从第一页翻到最后一页  
  34.         {  
  35.             for(int i = 0;i<15;i++)  
  36.             {  
  37.                 threads.add(sUrl);//把URL存进去  
  38.             }  
  39.         }  
  40.         isFinished=true;         
  41.     }  
  42.    
  43.      
  44. }  
  45.   
  46. class Processer implements Runnable  
  47. {  
  48.     Catcher c;  
  49.     public Processer(Catcher c)  
  50.     {  
  51.         this.c = c;  
  52.     }  
  53.     public void run()  
  54.     {  
  55.         String tmp = null;  
  56.         while((tmp=c.getUrl())!=null || !c.isFinished)  //当还有记录时就处理         
  57.         {  
  58.             if(tmp!=null)  
  59.             {  
  60.        //处理将一条信息保存到数据库  
  61.             }else//如果没标志处理则休眠一秒再重新开始处理  
  62.             {  
  63.                 try  
  64.                 {  
  65.                     Thread.sleep(1000);  
  66.                 } catch (InterruptedException e)  
  67.                 {  
  68.                     e.printStackTrace();  
  69.                 }  
  70.             }  
  71.         }  
  72.          
  73.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值