http://www.cnblogs.com/FengYan/archive/2012/11/27/2788369.html#2566041
ZeroCrawler V0.1 是一只简单的多线程爬虫,其基本架构如下:
整个程序是这样运作的:Scheduler 不断从 Queue 取出 URL,如果发现可用的爬虫(空
闲线程),那么就将 URL 分给一只爬虫。然后爬虫完成下载网页,抽取 URL,保存网页的工
作后就回归 Scheduler(变回空闲线程)。直到 Queue 没有待爬取的 URL,并且所有爬虫都
空闲下来,就停止程序。
Scheduler 的主要工作就是建立线程池,从 Queue 中取出 URL,分配 URL 给线程。容易
出错的地方是退出条件。如果只是判断 Queue 为空就退出是不行的。因为这时可能还有爬虫
在工作中,而它可能提取到新的 URL 加到 Queue 中。所以退出条件应该是 Queue 为空且线
程池的线程全部空闲。Scheduler 实现如下:
View Code
public static void Crawl(String url, String savePath) {
int cnt = 1;
long startTime = System.currentTimeMillis();
AtomicInteger numberOfThreads = new AtomicInteger(); //记录当前使用
的爬虫数
ThreadPoolExecutor executor = new ThreadPoolExecutor(m_maxThreads,
m_maxThreads,
3, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
//建立线程池
Queue.Add(UrlUtility.Encode(UrlUtility.Normalizer(url))); //添加初
始 URL 到 Queue 中
try {
while ((url = Queue.Fetch()) != null) {