Node.js
スクレイピング
ダウンロード
cheerio-httpcli

cheerio-httpcli でログインした後にファイルをダウンロードする

cheerio-httpcli でログインした後にファイルをダウンロードする

cheerio-httpcliというスクレイピングライブラリを使って、会員制のアップローダーにログインした後にファイルをダウンロードしたかったけど、ライブラリ自体にはダウンロード機能がなくて躓いたので、ここにメモを残しておきます。

ライブラリ自体の使い方の説明はしないので、大雑把に雰囲気をつかみたい人は、作者の紹介記事、詳しい使い方を知りたい人は、README.mdを読んで下さい

ログインする

const client = require('cheerio-httpcli')

client.fetch('http://example.com/login').then(result => {
  result.$('form[name=login]').submit({
    user: 'hoge',
    pass: 'fuga',
  }, (err, $, res, body) => {
    // フォーム送信後に移動したページ取得後の処理
  })
})

普通にログインするだけで、作者の紹介記事や、リポジトリにもサンプルがあるので説明は割愛。

ファイルをダウンロードする

前提としてログインしないと、ファイルがダウンロードできず、エラーページに飛ばされるのでCookieをセットする必要があるので、res.cookiesでCookieを取得して、リクエスト時にヘッダーにつける。

const fs = require('fs')
const request = require('request')
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // フォーム送信後に移動したページ取得後の処理(続き)
    const cookies = res.cookies
    request({
      url: 'http://example.com/example.zip',
      headers: {
        Cookie: Object.keys(cookies).map(e => e + '=' + cookies[e]).join('; '),
      },
      timeout: 60000,
      encoding: null,
    }).pipe(fs.createWriteStream('./example.zip'))

ポイントとしては

  • Cookieが変わっても動作するように直指定ではなく、全てのCookieをつなげている
  • バイナリデータを返すようにするためにencoding: nullを指定している