最近学习了慕课网Scott老师的nodeJs教程,实现了一个单页面爬取所有url地址的一个nodeJs小程序(我尝试过用爬取到的url再次循环往下爬,但没有成功,请有经验的小伙伴分享一下思路,谢谢),分享给大家;
测试地址:http://www.360.com/
废话不多说,上代码!
var https = require('https')
var http = require('http')
var fs = require('fs')
var Promise = require('bluebird')
var cheerio = require('cheerio')
var baseUrl = 'http://www.360.com/' //输入你要查询的URL地址就可获取当前页面的所有连接地址
var html = ''
var temp = ''
var arr = []
var num = 0
function findUrl(html){
var $ = cheerio.load(html)
var href_url_a = $('html').find('a')
for (var i = 0; i < href_url_a.length; i++) {
if ($(href_url_a[i]).attr('href') == '' || $(href_url_a[i]).attr('href') == null) {
}else{
if ($(href_url_a[i-1]).attr('href') == $(href_url_a[i]).attr('href')) {
}
else{
var Str = $(href_url_a[i]).attr('href')
if (Str.substring(0,4) == 'http') {
arr.push($(href_url_a[i]).attr('href'))
temp += $(href_url_a[i]).attr('href')+'\n'
num++
}
}
}
}
fs.writeFile('url.txt','【抓取到<'+baseUrl+'>页面数: '+num+' 个】:'+'\n'+'\n'+temp,function(err){
if (err)
throw err
})
console.log('\n'+'||这个页面一共有'+num+'链接.')
}
(function web_crawler(url){
if (url.substring(0,5) == 'https') {
https.get(url,function(res){
res.on('data',function(chunk){
html += chunk
console.log('正在爬取...')
})
res.on('end',function(){
findUrl(html)
console.log('抓取完毕!')
}).on('error',function(e){
console.log('错误访问...')
})
})
}else{
http.get(url,function(res){
res.on('data',function(chunk){
html += chunk
console.log('正在爬取...')
})
res.on('end',function(){
console.log('抓取完毕!')
findUrl(html)
}).on('error',function(e){
console.log('错误访问...')
})
})
}
})(baseUrl)
效果图:
代码肯定还有很多不足的地方,希望大家多多指点!