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

More than 1 year has passed since last update.


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を指定している