2015年11月9日月曜日

取得したHTMLから画像ファイルだけを抽出してダウンロードする

このエントリーをはてなブックマークに追加


取得したHTMLから画像リンクだけを抽出する。

これはリンクを抽出をした場合とほぼ一緒。aタグかimgタグかだけの違い。

var client = require('cheerio-httpcli');
var URL = require('url');

var url = "http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%8C";
var param = {};

/**
 * client.fetch:指定されたURLからHTMLを取得する
 * コールバックfunction:
 *   err:エラー情報
 *   $:取得データ
 *   res:サーバレスポンス
 */
client.fetch(url, param, function(err, $, res){
 if(err){
  console.log("Error", err);
  return;
 }
 $("img").each(function(idx){
  var src = $(this).attr('src');
  
  console.log(src);
 });
});

結果はこんな感じで上手く取得できた。

//upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Disambig_gray.svg/25px-Disambig_gray.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Coat_types_3.jpg/240px-Coat_types_3.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Samoyed_600.jpg/180px-Samoyed_600.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/5/52/Rousou1.jpg/120px-Rousou1.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Shiba_inu_zad_rybnik-kamien_pl.jpg/120px-Shiba_inu_zad_rybnik-kamien_pl.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/a/af/Golden_retriever_eating_pigs_foot.jpg/200px-Golden_retriever_eating_pigs_foot.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Shiba_inu_profile_01.jpg/200px-Shiba_inu_profile_01.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/0/00/Shiba_inu_eyes.jpg/200px-Shiba_inu_eyes.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Canine_reproduction.jpg/200px-Canine_reproduction.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Pregnant_female_dog_bitch_mongrel_Jan_2008_Shot_in_Jalandhar_Punjab_India_by_gopal1035_017.jpg/200px-Pregnant_female_dog_bitch_mongrel_Jan_2008_Shot_in_Jalandhar_Punjab_India_by_gopal1035_017.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Wilde_huendin_am_stillen.jpg/200px-Wilde_huendin_am_stillen.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Shiba_inu_Boston_Terrier_greetings.jpg/200px-Shiba_inu_Boston_Terrier_greetings.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Tesem.jpg/200px-Tesem.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/d/da/%E7%8A%AC-oracle.svg/26px-%E7%8A%AC-oracle.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/2/21/Dog_-_Hata_Rokurozaemon_with_his_dog.jpg/150px-Dog_-_Hata_Rokurozaemon_with_his_dog.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Grande_Boucherie_Canine_a_Paris.jpg/220px-Grande_Boucherie_Canine_a_Paris.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Boldini_-_Madame_Rejane.jpg/215px-Boldini_-_Madame_Rejane.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/8/87/Jomon_People_and_Jomon_Dog.jpg/180px-Jomon_People_and_Jomon_Dog.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/0/02/Inu_ou_mono00.jpg/250px-Inu_ou_mono00.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Tsunyaoshi.jpg/250px-Tsunyaoshi.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/5/52/Border_Collie_sheepdog_trial.jpg/260px-Border_Collie_sheepdog_trial.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Defense.gov_News_Photo_120318-M-MM918-007_-_U.S._Marine_Lance_Cpl._Evan_Frickey_a_dog_handler_with_3rd_Marine_Regiment_plays_with_Cookie_an_improvised_explosive_device_detection_dog_while.jpg/250px-thumbnail.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Dog_attack_%28USAF%29.jpg/220px-Dog_attack_%28USAF%29.jpg
//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikiquote-logo.svg/34px-Wikiquote-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Edit-clear.svg/40px-Edit-clear.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/8/89/Labrador_Retriever_babies.jpg/250px-Labrador_Retriever_babies.jpg
//upload.wikimedia.org/wikipedia/commons/9/91/Dog_galloping.gif
//upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Wiktionary_small.svg/25px-Wiktionary_small.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikibooks-logo.svg/23px-Wikibooks-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/24px-Wikisource-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/22px-Commons-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/2/24/Wikinews-logo.svg/27px-Wikinews-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Wikiversity-logo.svg/25px-Wikiversity-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/25px-Wikidata-logo.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikispecies-logo.svg/25px-Wikispecies-logo.svg.png
//ja.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1
/static/images/wikimedia-button.png
/static/1.27.0-wmf.5/resources/assets/poweredby_mediawiki_88x31.png

画像の一括ダウンロード

しかし、これも画像ファイルが相対パスなので絶対パスへ変更してあげる。
変更後、これらをすべて一括でダウンロードしてみる。

その時requestモジュールがあると便利なのでインストールしておく。
# /usr/local/node/bin/npm install request
request@2.65.0 ../../node_modules/request
├── aws-sign2@0.6.0
├── forever-agent@0.6.1
├── tunnel-agent@0.4.1
├── caseless@0.11.0
├── oauth-sign@0.8.0
├── stringstream@0.0.5
├── isstream@0.1.2
├── json-stringify-safe@5.0.1
├── extend@3.0.0
├── tough-cookie@2.2.0
├── node-uuid@1.4.3
├── qs@5.2.0
├── combined-stream@1.0.5 (delayed-stream@1.0.0)
├── mime-types@2.1.7 (mime-db@1.19.0)
├── form-data@1.0.0-rc3 (async@1.5.0)
├── http-signature@0.11.0 (assert-plus@0.1.5, ctype@0.5.3, asn1@0.1.11)
├── hawk@3.1.1 (cryptiles@2.0.5, boom@2.10.1, sntp@1.0.9, hoek@2.16.3)
├── bl@1.0.0 (readable-stream@2.0.4)
└── har-validator@2.0.2 (pinkie-promise@1.0.0, commander@2.9.0, chalk@1.1.1, is-my-json-valid@2.12.3)

ソースはこんな感じ、ドメイン以降のパスは_に置換して保存するようにしている。
var client = require('cheerio-httpcli');
var URL = require('url');
var fs = require('fs');
var request = require('request');

var savedir = __dirname + "/img";
if(!fs.existsSync(savedir)){
 fs.mkdirSync(savedir);
}

var url = "http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%8C";
var param = {};

/**
 * client.fetch:指定されたURLからHTMLを取得する
 * コールバックfunction:
 *   err:エラー情報
 *   $:取得データ
 *   res:サーバレスポンス
 */
client.fetch(url, param, function(err, $, res){
 if(err){
  console.log("Error", err);
  return;
 }
 $("img").each(function(idx){
  var src = $(this).attr('src');
  src = URL.resolve(url, src);
  var fname = URL.parse(src).pathname;
  fname = savedir + "/" + fname.replace(/[^a-zA-Z0-9\.]+/g, '_');
  request(src).pipe(fs.createWriteStream(fname));
  console.log(src);
 });
});

これで実行ディレクトリ配下にimgフォルダを作成して、そのフォルダにダウンロードした画像が保存される。
_static_1.27.0_wmf.5_resources_assets_poweredby_mediawiki_88x31.png
_static_images_wikimedia_button.png
_wiki_Special_CentralAutoLogin_start
_wikipedia_commons_9_91_Dog_galloping.gif
_wikipedia_commons_thumb_0_00_Shiba_inu_eyes.jpg_200px_Shiba_inu_eyes.jpg
_wikipedia_commons_thumb_0_02_Inu_ou_mono00.jpg_250px_Inu_ou_mono00.jpg
_wikipedia_commons_thumb_1_1e_Pregnant_female_dog_bitch_mongrel_Jan_2008_Shot_in_Jalandhar_Punjab_India_by_gopal1035_017.jpg_200px_Pregnant_female_dog_bitch_mongrel_Jan_2008_Shot_in_Jalandhar_Punjab_India_by_gopal1035_017.jpg
_wikipedia_commons_thumb_2_21_Dog_Hata_Rokurozaemon_with_his_dog.jpg_150px_Dog_Hata_Rokurozaemon_with_his_dog.jpg
_wikipedia_commons_thumb_2_24_Wikinews_logo.svg_27px_Wikinews_logo.svg.png
_wikipedia_commons_thumb_4_4a_Commons_logo.svg_22px_Commons_logo.svg.png
_wikipedia_commons_thumb_4_4c_Wikisource_logo.svg_24px_Wikisource_logo.svg.png
_wikipedia_commons_thumb_5_52_Border_Collie_sheepdog_trial.jpg_260px_Border_Collie_sheepdog_trial.jpg
_wikipedia_commons_thumb_5_52_Rousou1.jpg_120px_Rousou1.jpg
_wikipedia_commons_thumb_5_5f_Disambig_gray.svg_25px_Disambig_gray.svg.png
_wikipedia_commons_thumb_5_5f_Dog_attack_28USAF_29.jpg_220px_Dog_attack_28USAF_29.jpg
_wikipedia_commons_thumb_8_87_Jomon_People_and_Jomon_Dog.jpg_180px_Jomon_People_and_Jomon_Dog.jpg
_wikipedia_commons_thumb_8_89_Labrador_Retriever_babies.jpg_250px_Labrador_Retriever_babies.jpg
_wikipedia_commons_thumb_9_91_Shiba_inu_zad_rybnik_kamien_pl.jpg_120px_Shiba_inu_zad_rybnik_kamien_pl.jpg
_wikipedia_commons_thumb_9_91_Wikiversity_logo.svg_25px_Wikiversity_logo.svg.png
_wikipedia_commons_thumb_9_9a_Boldini_Madame_Rejane.jpg_215px_Boldini_Madame_Rejane.jpg
_wikipedia_commons_thumb_a_a1_Canine_reproduction.jpg_200px_Canine_reproduction.jpg
_wikipedia_commons_thumb_a_a1_Samoyed_600.jpg_180px_Samoyed_600.jpg
_wikipedia_commons_thumb_a_ae_Wilde_huendin_am_stillen.jpg_200px_Wilde_huendin_am_stillen.jpg
_wikipedia_commons_thumb_a_af_Golden_retriever_eating_pigs_foot.jpg_200px_Golden_retriever_eating_pigs_foot.jpg
_wikipedia_commons_thumb_b_b1_Defense.gov_News_Photo_120318_M_MM918_007_U.S._Marine_Lance_Cpl._Evan_Frickey_a_dog_handler_with_3rd_Marine_Regiment_plays_with_Cookie_an_improvised_explosive_device_detection_dog_while.jpg_250px_thumbnail.jpg
_wikipedia_commons_thumb_b_b3_Shiba_inu_profile_01.jpg_200px_Shiba_inu_profile_01.jpg
_wikipedia_commons_thumb_c_c6_Tesem.jpg_200px_Tesem.jpg
_wikipedia_commons_thumb_d_d9_Tsunyaoshi.jpg_250px_Tsunyaoshi.jpg
_wikipedia_commons_thumb_d_da_E7_8A_AC_oracle.svg_26px_E7_8A_AC_oracle.svg.png
_wikipedia_commons_thumb_d_df_Wikispecies_logo.svg_25px_Wikispecies_logo.svg.png
_wikipedia_commons_thumb_e_e3_Coat_types_3.jpg_240px_Coat_types_3.jpg
_wikipedia_commons_thumb_e_eb_Shiba_inu_Boston_Terrier_greetings.jpg_200px_Shiba_inu_Boston_Terrier_greetings.jpg
_wikipedia_commons_thumb_e_ec_Grande_Boucherie_Canine_a_Paris.jpg_220px_Grande_Boucherie_Canine_a_Paris.jpg
_wikipedia_commons_thumb_f_f2_Edit_clear.svg_40px_Edit_clear.svg.png
_wikipedia_commons_thumb_f_f9_Wiktionary_small.svg_25px_Wiktionary_small.svg.png
_wikipedia_commons_thumb_f_fa_Wikibooks_logo.svg_23px_Wikibooks_logo.svg.png
_wikipedia_commons_thumb_f_fa_Wikiquote_logo.svg_34px_Wikiquote_logo.svg.png
_wikipedia_commons_thumb_f_ff_Wikidata_logo.svg_25px_Wikidata_logo.svg.png
こんな感じ。うまいこといった。

0 件のコメント:

コメントを投稿