1028.us

管理ページへ

ログアウト

Webサイトのダウンロード

// ダウンロード元URLの指定
const url = "http://kujirahand.com/"
// 保存先のパスを指定
const savepath = "test.html"

// 利用モジュールの取り込み
const http = require('http') // HTTPのモジュール
const fs = require('fs')     // ファイル関連モジュール

// 出力先を指定
const outfile = fs.createWriteStream(savepath)

// 非同期でURLからファイルをダウンロード
http.get(url, function(res) {
  // resにoutfileをパイプする(保存先の指定)
  res.pipe(outfile) 
  
  // ダウンロード完了後の処理
  // on(addListener)メソッドでイベントハンドラを登録している
  res.on('end', function () {
    outfile.close()
    console.log("ok")
  });
});

Webサイトを全てダウンロードする

// ---モジュールの取り込み ---
const client = require('cheerio-httpcli')
const request = require('request')
const URL = require('url')
const fs = require('fs')
const path = require('path')

// --- 共通の設定 ---
// 階層の指定
let LINK_LEVEL = 3
// 基準となるページURL
let TARGET_URL = "http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/"
// 連想配列
let list = {}

// メイン処理
downloadRec(TARGET_URL, 0)

// 指定のurlを最大レベルlevelまでダウンロード
function downloadRec(url, level) {
  // 最大レベルチェック
  if (level >= LINK_LEVEL) return

  // 既出のサイトは無視する
  if (list[url]) return
  list[url] = true

  // URLを「/」で区切る。
  // [ 'http:','','nodejs.jp','nodejs.org_ja','docs','v0.10','api','' ]
  let us = TARGET_URL.split("/")
  // 末尾を削除
  us.pop()
  // 「/」で連結
  let base = us.join("/")
 // indexOf
  // 対象の文字列の中に指定した文字列が含まれるかどうか検索し、含まれていた場合は最初の見つかった位置を返す。
  if (url.indexOf(base) < 0) return

  // HTMLを取得する
  client.fetch(url, {}, function(err, $, res) {
    // リンクされているページを取得
    $("a").each(function(idx) {
      // タグのリンク先を得る
      let href = $(this).attr('href')
      if (!href) return
      // 絶対パスを相対パスに変更
      href = URL.resolve(url, href)
      // '#' 以降を無視する(a.html#aa と a.html#bb は同じもの)
      href = href.replace(/\#.+$/, "") // 末尾の#を消す
      downloadRec(href, level + 1)
    });
    // ページを保存(ファイル名を決定する)
    if (url.substr(url.length-1, 1) == '/') {
      url += "index.html" // インデックスを自動追加
    }
    let savepath = url.split("/").slice(2).join("/")
    checkSaveDir(savepath)
    console.log(savepath)
    fs.writeFileSync(savepath, $.html())
  });
}

// 保存先のディレクトリが存在するか確認
function checkSaveDir(fname) {
  // ディレクトリ部分だけ取り出す
  let dir = path.dirname(fname)
  // ディレクトリを再帰的に作成する
  let dirlist = dir.split("/")
  let p = ""
  for (let i in dirlist) {
    p += dirlist[i] + "/"
    if (!fs.existsSync(p)) {
      fs.mkdirSync(p)
    }
  }
}