А как парсить HTML страницы с Nodejs? Это вопрос не давал покоя. Здесь базовые видео Web Scraping in Node.js by Smitha Milli и ссылка на библиотеки. Идея с использованием nodejs + Request + Cheerio зацепила. Особенно после того, как в книге (Бибо, Каца) jQuery я обнаружил тот же код, что и в видео.
Ясно, что для моих нынешних задач лучше всего подходит Casperjs... Но прежде, чем начать плодить скрипты для конкретных задачек, хочу использовать сэкономленное время на прояснение вопросов о вариантах связок Python - Nodejs - Phantomjs. Вопрос о том, как лучше использовать Phantom (в связке Nodejs) остается открытым.
Request - Simplified HTTP client
htmlparser2
cheerio - Fast, flexible, and lean implementation of core jQuery designed specifically for the server.
.attr() - Get the value of an attribute for the first element in the set of matched elements or set one or more attributes for every matched element.
Web Scraping in Node.js by Smitha Milli¶
Опубликовано: 30 нояб. 2013 г.
A really easy, detailed beginner's guide to web scraping in node.js using reddit as an example. Make use of cheerio to use jQuery-esque manipulation of the DOM on the back-end!
Also, sorry I sound so sick! I made this video months ago, but never uploaded it because I didn't like the way I sounded. I realized I was never going to redo it though, so I finally just ended up uploading it.
Twitter: https://twitter.com/smithamilli Website: http://smithamilli.com Facebook: https://www.facebook.com/thisissmitha
Node.js & Socket.io Chat Part One: The Basics by Smitha Milli¶
Опубликовано: 9 июня 2013 г.
Create a basic chat application using node.js, socket.io, and express by the end of this video. Let me know what additional features you want in future videos!
Part two: http://www.youtube.com/watch?v=dOSIqJ... Download code: http://smithamilli.com/tuts/chat/part...
Twitter: https://twitter.com/smithamilli Website: http://smithamilli.com Facebook: https://www.facebook.com/thisissmitha
%%file /home/kiss/Desktop/scr/g1.js
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
Этот код сработал и выдал страницу Google... Здесья я его приводить не буду
А вот далее возникли проблемы.¶
kiss@kali:~/Desktop/scr$ node r1.js
TypeError: Object #<Object> has no method 'attr'
at Object.<anonymous> (/home/kiss/Desktop/scr/r1.js:10:28)
at exports.each (/home/kiss/node_modules/cheerio/lib/api/traversing.js:293:24)
at Request._callback (/home/kiss/Desktop/scr/r1.js:9:36)
at Request.self.callback (/home/kiss/node_modules/request/request.js:368:22)
at Request.emit (events.js:98:17)
at Request.<anonymous> (/home/kiss/node_modules/request/request.js:1219:14)
at Request.emit (events.js:117:20)
at IncomingMessage.<anonymous> (/home/kiss/node_modules/request/request.js:1167:12)
at IncomingMessage.emit (events.js:117:20)
at _stream_readable.js:943:16
%%file /home/kiss/Desktop/scr/r0.js
var request = require('request'),
cheerio = require('cheerio'),
urls = [];
request('http://www.reddit.com', function(error, response, body){
if(!error && response.statusCode == 200){
var $ = cheerio.load(body);
debugger;
console.log($('a.title', '#siteTable').attr('title'));
};
});
%%file /home/kiss/Desktop/scr/r1.js
var request = require('request'),
cheerio = require('cheerio'),
urls = [];
request('http://www.reddit.com', function(error, response, body){
if(!error && response.statusCode == 200){
var $ = cheerio.load(body);
$('a.title', '#siteTable').each(function(){
var url = this.href;
urls.push(url);
debugger;
});
console.log(urls.length);
console.log(urls);
}
});
Для файлов картинок
var request = require('request'),
cheerio = require('cheerio');
urls = [];
request('http://www.reddit.com', function(err, resp, body){
if(!err && resp.statusCode == 200){
var $ = cheerio.load(body);
$('a.title', '#siteTable').each(function(){
var url = this.attr('href');
if(url.indexOf('i.imgur.com')!= -1){
urls.push(url);
}
});
console.log(urls);
}
});
И все это можно (до)записывать в файл¶
var request = require('request'),
cheerio = require('cheerio'),
fs = reqire('fs')
urls = [];
request('http://www.reddit.com', function(err, resp, body){
if(!err && resp.statusCode == 200){
var $ = cheerio.load(body);
$('a.title', '#siteTable').each(function(){
var url = this.attr('href');
if(url.indexOf('i.imgur.com')!= -1){
urls.push(url);
}
});
console.log(urls);
for (var i =0; i < urls.length: i++){
request(url[i].pipe(fs.createWriteStream('img/' + i + '.jpg'));
}
}
});
!mkdir scr
!chcp 65001
!ls
kiss@kali:~$ npm install request cheerio
cheerio@0.19.0 node_modules/cheerio
├── entities@1.1.1
├── dom-serializer@0.1.0 (domelementtype@1.1.3)
├── css-select@1.0.0 (boolbase@1.0.0, css-what@1.0.0, nth-check@1.0.1, domutils@1.4.3)
├── htmlparser2@3.8.2 (domelementtype@1.3.0, domutils@1.5.1, entities@1.0.0, domhandler@2.3.0, readable-stream@1.1.13)
└── lodash@3.9.1
request@2.55.0 node_modules/request
├── caseless@0.9.0
├── aws-sign2@0.5.0
├── forever-agent@0.6.1
├── stringstream@0.0.4
├── oauth-sign@0.6.0
├── tunnel-agent@0.4.0
├── isstream@0.1.2
├── json-stringify-safe@5.0.1
├── node-uuid@1.4.3
├── qs@2.4.2
├── combined-stream@0.0.7 (delayed-stream@0.0.5)
├── form-data@0.2.0 (async@0.9.2)
├── mime-types@2.0.12 (mime-db@1.10.0)
├── http-signature@0.10.1 (assert-plus@0.1.5, asn1@0.1.11, ctype@0.5.3)
├── bl@0.9.4 (readable-stream@1.0.33)
├── tough-cookie@1.1.0
├── hawk@2.3.1 (cryptiles@2.0.4, sntp@1.0.9, boom@2.7.2, hoek@2.14.0)
└── har-validator@1.7.0 (commander@2.8.1, chalk@1.0.0, bluebird@2.9.25, is-my-json-valid@2.12.0)
kiss@kali:~$
Посты чуть ниже также могут вас заинтересовать
Видео 2013 года, в версии Cheerio 2015 синтаксис отличается
ОтветитьУдалитьПодробности здесь
"Правим код к видео "Web Scraping in Node.js". Правило: Видео - документация - stakoverflow "
http://pythonr.blogspot.com/2015/05/web-scraping-in-nodejs-stakoverflow.html
Связка Request + Cheerio - это красиво..., но
ОтветитьУдалитьгде паузы (хотя бы), или отслеживание событий (как в Casperjs) для загрузки javascript?
Даже пример доделывать не буду... Там есть примеры в документации и в ссылках. Однако, запомню, что в Cheerio есть команды - адьтернативы Xpath?, и она быстрее jsdom (по словам авторов)