昨天没有写日志,基本昨天的任务是完成了单个页面获取符合正则的内容(其实是偷懒没时间写太多)。

今天更新的内容比较多,将Download类作为多线程实现类,由TaskHandler类调用,并且创建了静态变量提供线程的数目属性,可以自定义线程的数量。线程之间同步两个存储队列,避免出现死锁。

TaskHandler.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.nickzy.dspider;


/**
 * @author zynick
 *
 */
public class TaskHandler {
    int threads = FunctionKit.threads;//默认线程数
    Spider spider;
    public TaskHandler(Spider spider){
        this.spider = spider;
        UnreadQuee.addElem(spider.getStart_url());
        System.out.println("------------------一个线程开始:"+Thread.currentThread().getName()+"线程");
        System.out.println("------------------检测到"+UnreadQuee.size()+"条url记录");
        threads = 3;
        start();
    }

    public void start() {

            for(int i=1;i<=threads;i++){
                Downloader downloader = new Downloader(spider);
                Thread thread = new Thread(downloader,String.valueOf(i));
                System.out.println("------------------创建线程"+i+"线程");
                thread.start();//调用下载器  
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } 
            }
            System.out.println("------------------"+threads+"个线程开启完毕");
            
    }
}
    

在开始测试的时候没有设置线程延时,最早创建的线程直接获取了队列里的starturl,其他线程因为没有队列里没有了值都自动退出了,导致了开了3个线程其实还是只有一个线程在工作。于是在创建多线程的时候添加了延时,2秒延迟后创建新线程,这样能保证新线程能读取到第一个线程匹配的新的队列值,因此在多网页情况下多线程能极大提高抓取速度,默认线程是1。

下一步待解决的问题:

  • 抓取多个正则表达式
  • 爬虫深度控制
  • 短链接补全
  • 多下载与数据处理分离