天天看点

安全开发第一讲-如何利用java实现web2.0分布式爬虫引擎

由于web前端技术的日新月异,传统爬虫对页面的爬取结果愈发不能满足用户的需求。对于安全领域来讲,如果关注网站安全,那么获取页面的内容信息是第一步需要做的事情,所以开发出一款能够获取基于ajax实现的动态页面的爬虫是很有必要的。

在写爬虫之前,我们首先需要了解爬虫的原理。对于我们需要获取页面内容的目标网站而言,其页面内容可以看做是从首页扩展出来的一张图,而爬虫要做的事情就是遍历这一张图的每个节点,获取节点的页面信息。利用数据结构的知识我们知道,只需要利用最简单的宽度优先算法就可以实现。广度优先算法的算法原理如下所示:

安全开发第一讲-如何利用java实现web2.0分布式爬虫引擎
public void doCrawlProcess(){

  PriorityQueue<UrlNode> urlNodeQueue = new PriorityQueue<>(); // UrlNode是页面节点
  urlNodeQueue.add(rootNode);
  while (!urlNodeQueue.isEmpty()) {
    // 扩展下层节点
    ...
    // 将所有该层的节点加入到线程池中
    ExecutorService pool = new ThreadPoolExecutor(crawler.getThreadNumber(),
                    crawler.getThreadNumber(),
                    60,
                    TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>());
    for (UrlNode urlNode1 : nextFloorUrlNode) {
            callables.add(() -> {
                crawlUrlService.getChildUrl(crawler, urlNode1, uncheckedNextFloorUrlNodes);
                return 1;
            });
        }
        pool.invokeAll(callables); // 线程池执行所有的任务
        // 注意这里的代码不全,不能直接使用
  }
}      
async function crawl(url){
    if(typeof globalBrower == 'undefined' || globalBrower == 'undefine'){
        globalBrower = await puppeteer.launch({
            headless:true,
            executablePath:'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
        });
    }
    var page = await globalBrower.newPage();
    try{
        page.setDefaultNavigationTimeout(110 * 1000);
        page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36');
        page.setJavaScriptEnabled(true);
        page.setCacheEnabled(false);
        page.setRequestInterception(true);
        page.on('request', interceptedRequest => {
            let url = interceptedRequest.url();
            if(url.indexOf('.png') > -1 || url.indexOf('.jpg') > -1 
                                        || url.indexOf('.gif') > -1 
                                        || url.indexOf('.pdf') > -1
                                        || url.indexOf('.txt') > -1
                                        || url.indexOf('.mp4') > -1
                                        || interceptedRequest.resourceType() === 'image')
              interceptedRequest.abort();
            else
              interceptedRequest.continue();
          });
        await page.goto(url);
        await page.waitForSelector('html'); 
        let html = await page.content();
        return html;
    }catch(err){
    }
    finally{
        page.close();
    }
}      

继续阅读