基於nodejs網站爬蟲程式開發
基於nodejs網站爬蟲程式
yarn #npm install
+-- src
| HtmlDownloader //網頁下載器
| HtmlParser //網頁解析器
| Outputer //內容輸出
| UrlManager //url管理
| main //主入口和排程
//main.js
class ParserScheduler {
constructor() {
this.parseCount = 0;
this.urls = new UrlManager();
this.downloader = new HtmlDownloader();
this.outputer = new Outputer();
this.parser = new HtmlParser();
}
parse() {
const {urls, downloader, parser, outputer} = this;
let newUrl = urls.getNewUrl();
console.log('new url:' + newUrl);
return downloader
.download(newUrl)
.then(html => {
const [newUrls,content] = parser.parse(html);
urls.addNewUrls(newUrls);
outputer.collectData(content);
if(this.urls.hasNewUrl()) {
this.parse();
this.parseCount++;
}else{
console.log('complete!');
this.outputer.output();
}
});
}
start(count) {
this.urls.addNewUrl(rootUrl);
this.parse();
}
}
//parser
class HtmlParser {
parse(html) {
let aLinks = [];
let images = [];
const $ = cheerio.load(html);
$('.text-page-tag').each((index, item) => {
let href = item.attribs.href;
if (href.indexOf('/course/list') >= 0) {
aLinks.push(href);
}
});
$('.course-banner').each((index,item)=>{
const src = item.attribs.src;
const alt = $(item).closest('.course-card-container')
.find('.course-card-name').text();
if (src) {
images.push({src, alt});
}
});
return [aLinks, images];
}
}
//downloader
class HtmlDownloader {
download(url) {
return new Promise((resolve, reject) => {
request(url, {
headers: {
'User-Agent': 'Mozilla/5.0',
},
}, (error, response, body) => {
if (error) {
reject(error);
}
resolve(body);
});
});
}
}
//urlmanager
class UrlManager {
constructor() {
this.newUrls = [];
this.oldUrls = [];
}
hasNewUrl() {
return this.newUrls.length !== 0;
}
getNewUrl() {
const url = this.newUrls.shift();
if (!this.oldUrls.includes(url)) {
this.oldUrls.push(url);
}
return url;
}
addNewUrl(url) {
const {newUrls} = this;
url = (url.indexOf('http')>=0)?url:(''+url);
if (!newUrls.includes(url) && !this.oldUrls.includes(url)) {
newUrls.push(url);
}
}
addNewUrls(urls) {
if (Array.isArray(urls)) {
urls.forEach(url=>{
this.addNewUrl(url);
});
}
}
}
//outputer
class Outputer {
constructor() {
this.data = [];
}
_getImage(url, filename) {
console.log('寫入圖片檔案:'+filename);
url = url.indexOf('http:')>=0?url:('http:'+url);
let bufferArray = [];
const opts = {
headers: {
'User-Agent': 'Mozilla/5.0',
},
};
request(url).pipe(fs.createWriteStream('D:parser_pics\'+encodeURIComponent(filename)+'.jpg'))
}
collectData(datas) {
if (datas && Array.isArray(datas)) {
datas.forEach(data => {
this
.data
.push(data);
});
}
}
output() {
// console.log('output');
const {data} = this;
for (let i = 0, len = data.length; i
node main.js
目前支援的nodejs版本為node 10.0.0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2809152/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於nodejs編寫小爬蟲NodeJS爬蟲
- nodejs 爬蟲NodeJS爬蟲
- Reactjs前端、Python爬蟲、Nodejs後臺開發招聘React前端Python爬蟲NodeJS
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 一個基於 golang 的爬蟲電影站Golang爬蟲
- 基於 Lua 寫一個爬蟲程式爬蟲
- [Python3網路爬蟲開發實戰] 2-爬蟲基礎 2-網頁基礎Python爬蟲網頁
- 招聘網站爬蟲模板網站爬蟲
- scrapy + mogoDB 網站爬蟲Go網站爬蟲
- 基於Scrapy分散式爬蟲的開發與設計分散式爬蟲
- python3網路爬蟲開發實戰_Python 3開發網路爬蟲(一)Python爬蟲
- 網路爬蟲開發常用框架爬蟲框架
- C#網路爬蟲開發C#爬蟲
- 基於Python的簡單天氣爬蟲程式Python爬蟲
- Python爬蟲—爬取某網站圖片Python爬蟲網站
- 【VIP視訊網站專案上線】基於Nodejs的Express框架開發的VIP視訊網站專案及完整程式碼分享...網站NodeJSExpress框架
- 《Python3網路爬蟲開發實戰》教程||爬蟲教程Python爬蟲
- Python開發爬蟲專案+程式碼Python爬蟲
- 基於thinkphp 開發的兼職網站PHP網站
- 讀書筆記:《Python3網路爬蟲開發實戰》——第2章:爬蟲基礎筆記Python爬蟲
- .NET使用分散式網路爬蟲框架DotnetSpider快速開發爬蟲功能分散式爬蟲框架IDE
- [Python3網路爬蟲開發實戰] 分散式爬蟲原理Python爬蟲分散式
- python網路爬蟲(9)構建基礎爬蟲思路Python爬蟲
- 爬蟲開發技巧爬蟲
- 爬蟲:多程式爬蟲爬蟲
- 網路爬蟲專案開發日誌(三):爬蟲上線準備爬蟲
- 基於java的分散式爬蟲Java分散式爬蟲
- 基於 go + xpath 爬蟲小案例Go爬蟲
- Python 3網路爬蟲開發實戰Python爬蟲
- 教你用python爬蟲爬blibili網站彈幕!Python爬蟲網站
- 基於Node.js的裁判文書網爬蟲分析Node.js爬蟲
- 有道翻譯最新爬蟲程式碼-基於Python3爬蟲Python
- [Python3網路爬蟲開發實戰] 2-爬蟲基礎 1-HTTP基本原理Python爬蟲HTTP
- 爬蟲開發知識入門基礎(1)爬蟲
- nodejs + koa2 實現爬蟲NodeJS爬蟲
- nodejs eggjs框架 爬蟲 readhub.meNodeJS框架爬蟲
- python3網路爬蟲開發實戰_Python3 爬蟲實戰Python爬蟲
- 爬拉猴折折扣網 基於tp3.1.3開發