質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Q&A

解決済

3回答

5725閲覧

プロキシ経由でWebスクレイピング

1nakaji

総合スコア187

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

0グッド

2クリップ

投稿2015/08/13 06:25

プロキシ経由でスクレイピングをしたいと考えています。

具体的には「A」というメインサーバーから
「B」というプロキシサーバー経由で
Googleの検索結果をスクレイピングしたいです。

PCを立ち上げずに、
CRONなどでAサーバー内のプログラムを実行し、
Bを通してスクレイピングするイメージです。

とりあえずYahoo!のトップページを取得する
以下のプログラムを書きました(Aサーバーに置くプログラムです)。
━━━━━━━━━━━━━━━━━━

<?php $proxy = array( "http" => array( "proxy" => "tcp://(プロキシサーバーのIPアドレス):9987", "request_fulluri" => true, ) ); $proxy_context = stream_context_create($proxy); $contnts = file_get_contents('http://www.yahoo.co.jp/', false, $proxy_context); echo $contnts; ?>

━━━━━━━━━━━━━━━━━━

すると以下のようなエラーが表示されました。
━━━━━━━━━━━━━━━━━━
Warning: file_get_contents(http://www.yahoo.co.jp/): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /home/xxx/www/proxy/index.php on line 20
━━━━━━━━━━━━━━━━━━

Bのプロキシサーバーは、
さくらVPSとSquidを使って自分で構築しています。

ブラウザでBプロキシ経由のアクセスに設定すると、
アクセスは正常にBのIPアドレスになりますので、
B自体は動作しているかと思います。

AサーバーでもBプロキシサーバーでも、
file_get_contentsは動作していました。

プロキシ経由で取得しようとすると、
このようなエラーが発生します。

こちら何か分かることはありますでしょうか。
何かあれば、教えていただけますと幸いです。

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

エラーメッセージの最後に

in /home/xxx/www/proxy/index.php on line 20

とありますが、これはプロキシ側のプログラムなのですよね?

その20行目でエラーが発生しているかのようなメッセージですけれども・・・
そこはYahoo!側にリクエストを投げる部分ですか?

もしそうなら、リクエストの為のパラメーターが想定通りに渡せていないというようなことはありませんか?

投稿2015/08/13 12:05

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/08/13 16:19

ご回答ありがとうございます。 なるほどですね。 その辺りも検証させていただきます。 ありがとうございます。
guest

0

file_get_contents関数よりもcURL関数の方が細かく設定ができます。cURL関数でもProxyを設定できるので、こちらをお試しください。

PHP cURLの色々な使い方

投稿2015/08/13 06:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/08/13 08:17

ご回答ありがとうございます。 cURLでも試していました。 そちらでもエラーになってました。 ヘッダーなどいじって試してみます。 ありがとうございます。
guest

0

ベストアンサー

txt

1Warning: file_get_contents(http://www.yahoo.co.jp/): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /home/xxx/www/proxy/index.php on line 20

ここに書いてある通りですよね。アクセスをYahooのサーバーが拒否しているということ以下でも以上でもないと思うのですが…。

get_headers

ストリームコンテキストを変更しながら、レスポンスヘッダを地道に解析して突破する以外に方法はないでしょうね。

投稿2015/08/13 06:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/08/13 08:17

やはり、そういうことなんですね。 それが分かっただけでも助かります。 地道にいろいろ試してみます。 ご回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2015/08/13 08:21

ライブラリを探したところで、きっと存在しないでしょう… そもそもYahooはそういったアクセスをされたくないから403 を返しているわけで、そんなライブラリが見つかれば、すぐに対策をとるはずです。
1nakaji

2015/08/13 16:18

ご返信ありがとうございます。 そのあたりは自分でなんとかしないとですね。 なんとか解決しそうですので、 アドバイスを元に努力します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問