LoginSignup
26
23

More than 3 years have passed since last update.

cheerio-httpcli で簡単スクレイピングして、Google検索一覧取得

Last updated at Posted at 2016-08-20

Node.js に初挑戦。題材はスクレイピング。

Node.js に興味が沸いたので、挑戦してみた。
題材は、以前から興味のあった『Webスクレイピング』。
Google検索結果を「タイトル」「URL」「概要」で一覧表示、にトライ。
私自身の勉強メモ。

Windows環境への Node.js をインストール。

Node.js は「コマンドライン上でのJavaScript実行環境」。
Windows環境への Node.js は、インストーラー実行で一発。
npmでの追加モジュールのインストール方法を含めて、
下記のページが分かりやすかった。

◆Node.js の Windows へのインストールと npm の使い方
http://yohshiy.blog.fc2.com/blog-entry-307.html

Webスクレイピングは cheerio-httpcli を利用。

Node.jsの追加モジュール(として公開されている)cheerio-httpcli を使うと
簡単に出来るということで、これやってみた。
実際「npm install cheerio-httpcli」で、即利用可能になる。

参照したページは以下(本家様)。
◆Node.js用のスクレイピングモジュール「cheerio-httpcli」の紹介
http://qiita.com/ktty1220/items/e9e42247ede476d04ce2
>cheerio-httpcliの導入~使い方
>インストール

◆cheerio-httpcli > fetch()のプロミス形式での呼び出し
https://www.npmjs.com/package/cheerio-httpcli#fetchurl-get-param-encode-callback

非同期処理は Promise で実装。

私はjQueryから来た人なので「Deferred は何処?」となって、
「おや、Promiseなんて素敵なものが標準実装されたのね」と
今回から使い始めた。
以下のページが分かりやすかった。

◆JavaScript Promiseの本
http://azu.github.io/promises-book/

サンプルコード。

Google検索結果を「タイトル」「URL」「概要」で一覧表示するコード。
cheerio-httpcli で取得したjQueryライクなオブジェクトに対して、
検索結果のdiv要素配下の目的の内容だけ抜き出して、リストに再構成する。

なお、抜き出しは力技なので、Google様が仕様変更したらアウト。

scraping.js
/*
    [scraping.js]

    encoding=utf-8
*/

var cheerioClient = require('cheerio-httpcli');


// cheerio-cliでの検索結果(リスト型を想定)を
// 適当に要約して返却する。
// clearly = function( cheerio-httpcli::$ ); が要約する関数。
//
var searchClearly = function( url, request, clearly ){
    var promiseCheerio = cheerioClient.fetch( url, request );

    return new Promise(function (resolve, reject) {
        promiseCheerio.then( function( cheerioResult ){
            if( cheerioResult.error ){
                reject( cheerioResult.error );
            }else{
                // レスポンスヘッダを参照
                // console.log("レスポンスヘッダ");
                // console.log( cheerioResult.response.headers);

                // リンク一覧を生成
                var $ = cheerioResult.$;
                resolve({
                    "clearlyList" : clearly( $ ),
                    "cheerioJQuery" : $
                });
            }
        }, function( error ){
            reject( error );
        });
    });
}

// グーグル検索結果をリスト形式で取得する。
// request = 検索オブジェクト { q: "node.js" } の形式で指定。
//
var searchClearlyByGoogle = function( request ){
    return searchClearly( "http://www.google.com/search", request, function( $ ){
        var results = [];
        $("div[class='g']").each( function (idx) {
            var target = $(this);
            var anchor = target.find("a").eq(0);
            var summary = target.find("span[ class='st'] ").eq(0);

            results.push({
                "name" : anchor.text(), 
                "href" : anchor.attr("href"), 
                "summary" : summary.text()
            });
        });
        return results;
    });
};


// Googleで「node.js」について検索する。
// 
var request = { q: "node.js" };
var promise = searchClearlyByGoogle( request );

// 検索結果を「タイトル」「URL」「概要」で表示する。
// 
promise.then( function( result ){
    var list = result.clearlyList;
    var i, length = list.length;
    for( i=0; i<length; i++ ){
        console.log("---");
        console.log( list[i].name );
        console.log( list[i].href );
        console.log( list[i].summary );
        console.log("");
    }
}, function( error ){
    console.log( error );
});

実行結果

検索キーワードは「node.js」として
var request = { q: "node.js" };」にて指定。

上記のコードを「node scraping.js」で実行すると
以下のように、コマンドプロンプトに出力される。

---
Node.js 日本ユーザグループ
http://nodejs.jp/
Node.js 日本ユーザグループ ... Felix's Node.js Guide: Node.js の基本から
コーディングスタイル、上司を説得する方法まで解説しています。(英語) 
「Felix's Node.js Guide」の一部「Node.js Style Guide」の日本語訳もあります。
 How To Node: 世界中の?...

---
Node.js
https://nodejs.org/
Event-driven I/O server-side JavaScript environment based on V8. 
Includes API documentation, change-log, examples and announcements.

---
Node.js - Wikipedia
https://ja.wikipedia.org/wiki/Node.js
Node.js はイベント化された入出力を扱うUnix系プラットフォーム上の
サーバーサイドJavaScript環境である(V8 JavaScriptエンジンで動作する)。
Webサーバなどのスケーラブルなネットワークプログラムの記述を意図している。
ライアン・ダールによって2009年?...

---
Node.js を5分で大雑把に理解する - Qiita
http://qiita.com/hshimo/items/1ecb7ed1b567aacbe559
2013/11/25 - 随時更新します。 対象の人使ったことないけど、軽く理解は
しておきたい人本格的に勉強する前に、大まかな概要を知りたい人特徴
サーバーサイドのJavaScript 非同期 (I/Oの処理結果を待たず処理を進める) 
ノンブロッキングI/O (I/Oの結果を?...


(以下略)

未調査な事項

  1. node.jsが使える無料サーバー、もしくは格安でお試しが手軽に可能なサーバーは何処?
  2. スクレイピングで必要な情報の抜出は、やはり「力技」で拾うしかないのだろうか?
26
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23