2010-12-28 24 views
17

サイトクレーパを作成しようとしています。私は私のローカルマシンでそれを作った。私のサーバーで同じものを実行すると、403の禁止されたエラーが表示されます。 私はPHP Simple HTML DOM Parserを使用しています。私は、サーバー上で取得エラーは、このです:file_get_contentsが403を返すことを禁止しました

警告: のfile_get_contents(http://example.com/viewProperty.html?id=7715888) [function.file-getを-内容]: に失敗しましたストリームを開く:HTTP要求に失敗しました! HTTP/ ライン40

上 /home/scraping/simple_html_dom.phpで禁じ1.1 403コード、それをトリガーの行は次のとおりです。

$url="http://www.example.com/viewProperty.html?id=".$id; 

$html=file_get_html($url); 

私は上のphp.iniをチェックしてサーバーとallow_url_fopenはオンです。可能な解決策は、カールを使用することができますが、私はどこに間違っているのかを知る必要があります。

+0

サーバーはあなたのものですか?その場合、あなたまたはあなたのホスティングサービスは、廃棄されないようにセキュリティ設定を構成しているようです。 –

+0

それは「私の」サーバーではなく、専用のサーバーです。 – absk

+0

質問が間違っています。自分のサイト(つまり、あなたが明示的にスクレイプパーミッションを持っているサイト)を廃棄していると思いました。 @Pekkaは正しい。 –

答えて

13

これはあなたのスクリプトでは問題ありませんが、要求しているリソースを使用しています。 Webサーバーは「禁止された」状態コードを返しています。

これは、スクラップを防止するためにPHPスクリプトをブロックしたり、あまりにも多くのリクエストを行った場合はあなたのIPをブロックすることができます。

リモートサーバーの管理者に相談してください。

+2

しかし、同時に、私のlocalhost上で正常に動作します。問題は何とか私のサーバーの設定と思われる。 – absk

+4

@abskいいえ、 '403禁止されています 'は明らかにリモートサーバーからです。接続は正常に動作します - 確認するために別のIPを試してみてください。あなたのサーバーのIPがリモートサーバーのエンドでブロックされている可能性があります –

5

これはパーサークラスの35行目以降のように変更できます。

function curl_get_contents($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function file_get_html() 
{ 
    $dom = new simple_html_dom; 
    $args = func_get_args(); 
    $dom->load(call_user_func_array('curl_get_contents', $args), true); 
    return $dom; 
} 

他のサイトを試しましたか?

+1

しかし、これはどのようにリモート403を修正することになっていますか? –

+0

彼はcURLについて言及していたので、答えの最初の部分はそれと2番目の "他のサイトを試しましたか?"、または彼は私たちに確認するリンクを与えるかもしれません。私は403が遠いので、私は彼に他のサイトで試してみることを提案している理由を知っています。 –

+0

他のサイトからデータを取得します。私のIPがブラックリストに載ったようだ。どのような方法ですか? – absk

3

リモートサーバーには何らかの種類のブロックがあるようです。それはケースだ場合は、このようなWebブラウザのユーザーエージェントをシミュレートするためにカールを使用して試すことができ、ユーザーエージェントによるものであってもよい:

$url="http://www.example.com/viewProperty.html?id=".$id; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
$html = curl_exec($ch); 
curl_close($ch); 
0

、ファイル上の権限を確認しましたか?私は自分のファイルに777を設定しました(明らかにlocalhostで)、私は問題を解決しました。

3

はそれが私はそれはかなり古いスレッドが、いくつかのアイデアを共有するという考えであることを知っている

function curl_get_contents($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
$html = curl_exec($ch); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) 
{ 
    $dom = new simple_html_dom; 
    $args = func_get_args(); 
    $dom->load(call_user_func_array('curl_get_contents', $args), true); 
    return $dom; 
    //$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); 

} 
5

を働いていた私にとってsimple_html_dom.phpでこれを書きます。

ほとんどの場合、ウェブページにアクセスしているときにコンテンツを取得していないと、コンテンツを取得できない可能性があります。では、スクリプトが人間ではなくウェブページにアクセスしようとしていることをどのように識別していますか?一般的には、サーバーに送信されるHTTP要求内のヘッダーはUser-Agentです。

ウェブページにアクセスするスクリプトがであると考えるようにするには、リクエスト中にUser-Agentヘッダーを変更する必要があります。 User-Agentヘッダーをいくつかの一般的なWebブラウザーで使用される値に設定すると、ほとんどのWebサーバーが要求を許可する可能性があります。

ブラウザで使用される一般的なユーザーエージェントのリストを以下に示します。

  • クローム:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'

  • のFirefox:'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'

  • 等...


$context = stream_context_create(
    array(
     "http" => array(
      "header" => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 
     ) 
    ) 
); 

echo file_get_contents("www.google.com", false, $context); 

このコードは、ユーザーエージェントをフェイクして、https://google.comに要求を送信します。

参考文献:

乾杯!

2

は、私は、これは

ちょうどPHP7とLinux上で私の地元のサンドボックスを設定し、これに出くわしました...古い質問ですが、実現しています。ターミナル実行スクリプトを使用すると、phpはCLIのためにphp.iniを呼び出します。 "user_agent"オプションがコメントアウトされていることがわかりました。私はコメントを外し、Mozillaユーザエージェントを追加しました。今は動作します。

0

私は同じpbを持っています。これ以上の対象が償却されている場合、私は知らない

:-)禁じられて(私はちょうど... Googleのコンソールの開発者からYouTubeのAPIを起動していないし、それが働いていた、私はアイデアを共有するために考え ベスト

を希望します
関連する問題