ktty1220 / cheerio-httpcli

iconvによる文字コード変換とcheerioによるHTMLパースを組み込んだNode.js用HTTPクライアントモジュール
MIT License
262 stars 28 forks source link

プロキシを使いたいんですが、何か方法がありますでしょうか。 #13

Closed kxx129 closed 8 years ago

kxx129 commented 8 years ago

お疲れ様です、ゆです。 cheerio-httpcliモジュールのご提供、ありがとうございます。とても便利なモジュールと思ってます。 ご提供して頂いたcheerio-httpcliモジュールを使って、ウェブスクレイピングツールを作ると検討しています。 プロキシを使いたいんですが、何かいい方法がありますでしょうか。ご教示いただければ幸いと思います。 ちなみに、ベースモジュールのrequestの方はいくつ方法があるらしいです。 例えば: http://stackoverflow.com/questions/3862813/how-can-i-use-an-http-proxy-with-node-js-http-client https://github.com/request/request/issues/894 お手数済みませんがよろしくお願いいたします。

ktty1220 commented 8 years ago

requestモジュールをのぞいてみましたが、HTTP_PROXY環境変数が指定されていればそれを使用するみたいです。

ちょっと試してみました。

process.env.HTTP_PROXY = 'http://プロキシサーバーのアドレス:ポート/';

var client = require('cheerio-httpcli');
client.fetch('http://www.ugtop.com/spill.shtml', function (err, $, res, body) {
  console.log($('table').eq(1).find('tr').eq(3).find('td').eq(1).text().trim());
});

REMOTE_ADDRがプロキシサーバーのアドレスになっていたのでこれでいけそうな気がしますがどうでしょうか。

kxx129 commented 8 years ago

process.env.HTTP_PROXY = 'http://プロキシサーバーのアドレス:ポート/'; なるほど。大変助かりました。 ご教示を頂き、ありがとうございます。

tuclicks commented 4 years ago

上記の方法でプロキシがうまく動作しません。

firebase cloud function での basic認証付きのproxyについて

process.env.HTTP_PROXY = `http://${username}:${password}@${host}:${port}\
//or
process.env.HTTP_PROXY = `http://${host}:${port}`
client.set('headers', {
   Authorization: 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64')
})

いづれの方法でもbasic認証がかけられているプロキシからアクセスすることができませんでした。 環境はfirebase function (emulator or production) です。 process.env.HTTPS_PROXY でも試しましたが動作しませんでした。

process.envを直接いじれない環境なのかもしれません。その場合の解決策などありましたら教えていただけますと幸いです。

ktty1220 commented 4 years ago

調べてみた感じでは、process.env.HTTP_PROXY = http://${username}:${password}@${host}:${port}で設定は正しそうですが、いくつか確認点があります。

  1. Firebaseのプランは有料プランですか?無料プランだと外部ネットワークへのアクセスに制限があるそうです(参考)。
  2. Firebase上ではなく、ローカル環境で実行した場合にも失敗しますか?
  3. アクセスできなかったという状況の詳細について、エラーが発生している場合はエラーメッセージをお知らせください。エラーが出ていない場合は詳しい状況を教えてください(いつまで経ってもリクエスト処理が戻ってこない、処理結果が空になっている、など)。
tuclicks commented 4 years ago

ご返信ありがとうございます。 再度確認したところ正常に動作しておりました。 process.env.HTTP_PROXY = http://${username}:${password}@${host}:${port}

ESOCKETTIMEDOUTエラーが出ていたのですが、最初にhttp抜きのproxyを登録したので、以前のprocess.envのインスタンスが残ってた?せいかもしれません。 わざわざ調べていただきありがとうございます。助かりました。