java多线程抓取新闻
2013-08-29 08:02
232 查看
任务描述:
有个信息发布网站,按照条件会查询出数据,按页显示,每页15条,每条信息为一个url链接。点击链接再打开一个页面,显示这条的详细信息。
我们需要做的是把每条的详细信息都抓取下来,保存到数据库中。
开始我做好了抓取的所有程序,保存到数据库中。
做完运行,发现速度很慢,因为数据量比较大,大约有30多万条详细信息需要抓取。
就想到这个用多线程来实现真是再好不过了,开15条线程,一次就把一页的详细信息都抓取下来,不是很快吗?
后来加上多线程后,一次开16线程,比原来快了很多,呵呵~!
因为这个工程是用java实现的,下面是java实现这个多线程的主要代码,用c#应该也是一样的!有兴趣的可以翻译成c#的,厚厚~
[java]
view plaincopy
import java.util.ArrayList;
public class Catcher
{
private static ArrayList threads= new ArrayList();//存储未处理URL
public static boolean isFinished=false;//是否已经把所有的链接存到threads了
public synchronized String getUrl()
{
if(threads.size()>0)
{
String tmp = String.valueOf(threads.get(0));
threads.remove(0);
return tmp;
}else
return null;
}
public void process(){
//处理预处理
//下面开10个线程等待处理
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
//进入翻页的处理
for(int j=0;j<10;j++)//从第一页翻到最后一页
{
for(int i = 0;i<15;i++)
{
threads.add(sUrl);//把URL存进去
}
}
isFinished=true;
}
}
class Processer implements Runnable
{
Catcher c;
public Processer(Catcher c)
{
this.c = c;
}
public void run()
{
String tmp = null;
while((tmp=c.getUrl())!=null || !c.isFinished) //当还有记录时就处理
{
if(tmp!=null)
{
//处理将一条信息保存到数据库
}else//如果没标志处理则休眠一秒再重新开始处理
{
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
有个信息发布网站,按照条件会查询出数据,按页显示,每页15条,每条信息为一个url链接。点击链接再打开一个页面,显示这条的详细信息。
我们需要做的是把每条的详细信息都抓取下来,保存到数据库中。
开始我做好了抓取的所有程序,保存到数据库中。
做完运行,发现速度很慢,因为数据量比较大,大约有30多万条详细信息需要抓取。
就想到这个用多线程来实现真是再好不过了,开15条线程,一次就把一页的详细信息都抓取下来,不是很快吗?
后来加上多线程后,一次开16线程,比原来快了很多,呵呵~!
因为这个工程是用java实现的,下面是java实现这个多线程的主要代码,用c#应该也是一样的!有兴趣的可以翻译成c#的,厚厚~
[java]
view plaincopy
import java.util.ArrayList;
public class Catcher
{
private static ArrayList threads= new ArrayList();//存储未处理URL
public static boolean isFinished=false;//是否已经把所有的链接存到threads了
public synchronized String getUrl()
{
if(threads.size()>0)
{
String tmp = String.valueOf(threads.get(0));
threads.remove(0);
return tmp;
}else
return null;
}
public void process(){
//处理预处理
//下面开10个线程等待处理
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
new Thread(new Processer(this)).start();
//进入翻页的处理
for(int j=0;j<10;j++)//从第一页翻到最后一页
{
for(int i = 0;i<15;i++)
{
threads.add(sUrl);//把URL存进去
}
}
isFinished=true;
}
}
class Processer implements Runnable
{
Catcher c;
public Processer(Catcher c)
{
this.c = c;
}
public void run()
{
String tmp = null;
while((tmp=c.getUrl())!=null || !c.isFinished) //当还有记录时就处理
{
if(tmp!=null)
{
//处理将一条信息保存到数据库
}else//如果没标志处理则休眠一秒再重新开始处理
{
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
相关文章推荐
- java新闻抓取程序代码
- 使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO
- Java广度优先爬虫示例(抓取复旦新闻信息)
- 使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO
- Java网络爬虫(八)--使用多线程进行百度图片的抓取
- [置顶] Java数据采集-3.抓取开源中国新闻(新版)
- java爬虫Gecco工具抓取新闻实例
- 【多线程数据采集之三】java抓取数据+破解屏蔽ip访问 .
- java抓取数据+破解屏蔽ip访问【多线程数据采集之三】
- java 网络爬虫之多线程抓取文件
- java实现抓取某公司官网新闻
- java 多线程,android 移动开发,日语学习,各项新闻RSS吐血分享
- 【新闻】本人新书《Java多线程编程实战指南(核心篇)》已出版上市
- java抓取数据+破解屏蔽ip访问【多线程数据采集之三】
- 用JAVA实现简单爬虫多线程抓取
- java抓取数据+破解屏蔽ip访问【多线程数据采集之三】
- 新浪新闻页面抓取(JAVA-Jsoup)
- php使用pthreads v3多线程的抓取新浪新闻信息
- Java 根据关键字抓取google 新闻 网络数据 .*
- Java多线程之----Phaser