Поиск по блогу

воскресенье, 24 мая 2015 г.

Посмотрел "Web Scraping in Node.js" by Smitha Milli и скопировал сюда код из видео

А как парсить 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

In [ ]:
 
In [14]:
%%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.
  }
})
Writing /home/kiss/Desktop/scr/g1.js

Этот код сработал и выдал страницу Google... Здесья я его приводить не буду

А вот далее возникли проблемы.

In [ ]:
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
In [23]:
%%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'));                             
        };
        
   
});
Overwriting /home/kiss/Desktop/scr/r0.js
In [27]:
%%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);
    }
});
Overwriting /home/kiss/Desktop/scr/r1.js

Для файлов картинок

In [ ]:
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);
     }
});

И все это можно (до)записывать в файл

In [ ]:
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'));    
            }
     }
});
In [2]:
!mkdir scr
In [3]:
!chcp 65001
!ls
/bin/sh: 1: chcp: not found
11_cpa.html   16_slimer.ipynb 19_cromium.ipynb  3_awk.ipynb
11_cpa.ipynb   16_ya.html  20_nodescr.ipynb  3_mysql.html
12_api.html   16_ya.ipynb  20_nwjs.html   3_mysql.ipynb
12_api.ipynb   17_ipytho_help.ipynb 20_nwjs.ipynb   3_php.html
12_java7.html   17_ph.html  21_psel.html   3_php.ipynb
12_java7.ipynb   17_ph.ipynb  21_psel.ipynb   5_lsof.html
12_rserver.html   18_npm.html  21_pyt.html   5_lsof.ipynb
12_rserver.ipynb  18_npm.ipynb  21_pyt.ipynb   6_wbench.html
12_sg.html   18_sv.html  24_mill.ipynb   6_wbench.ipynb
12_sg.ipynb   18_sv.ipynb  3_apache.html   8831.png
16_io.ipynb   19_crbug.html  3_apache.ipynb   node_modules
16_slimer.html   19_crbug.ipynb 3_awk.html   scr
In [ ]:
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:~$ 


Посты чуть ниже также могут вас заинтересовать

2 комментария:

  1. Видео 2013 года, в версии Cheerio 2015 синтаксис отличается

    Подробности здесь
    "Правим код к видео "Web Scraping in Node.js". Правило: Видео - документация - stakoverflow "
    http://pythonr.blogspot.com/2015/05/web-scraping-in-nodejs-stakoverflow.html

    ОтветитьУдалить
  2. Связка Request + Cheerio - это красиво..., но
    где паузы (хотя бы), или отслеживание событий (как в Casperjs) для загрузки javascript?

    Даже пример доделывать не буду... Там есть примеры в документации и в ссылках. Однако, запомню, что в Cheerio есть команды - адьтернативы Xpath?, и она быстрее jsdom (по словам авторов)

    ОтветитьУдалить