由于web前端技术的日新月异,传统爬虫对页面的爬取结果愈发不能满足用户的需求。对于安全领域来讲,如果关注网站安全,那么获取页面的内容信息是第一步需要做的事情,所以开发出一款能够获取基于ajax实现的动态页面的爬虫是很有必要的。
在写爬虫之前,我们首先需要了解爬虫的原理。对于我们需要获取页面内容的目标网站而言,其页面内容可以看做是从首页扩展出来的一张图,而爬虫要做的事情就是遍历这一张图的每个节点,获取节点的页面信息。利用数据结构的知识我们知道,只需要利用最简单的宽度优先算法就可以实现。广度优先算法的算法原理如下所示:
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();
}
}