1

私は Lynda.com のメンバーです。彼らのサイトから HTML ページを取得してディスクに保存したいと考えています。問題は、CURL 経由でページを取得しようとすると、非メンバー ページが表示されることです (サインアップするには)、メンバーページを取得できない理由がわかりません:(

私のコード:

get_remote_file_to_cache();

function get_remote_file_to_cache()
{

    $the_site = "http://www.lynda.com/AIR-3-0-tutorials/Flex-4-6-and-Mobile-Apps-New-Features/90366-2.html";

    $curl = curl_init();
    $fp = fopen("cache/temp_file.html", "w");
    curl_setopt($curl, CURLOPT_URL, $the_site);
    curl_setopt($curl, CURLOPT_COOKIE, '/cookie.txt');
    curl_setopt($curl, CURLOPT_FILE, $fp);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

    $http_headers = array(
        'Host: www.lynda.com',
        'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2',
        'Accept: */*',
        'Accept-Language: en-us,en;q=0.5',
        'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
        'Connection: keep-alive'
    );
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $http_headers);

    curl_exec($curl);



    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if($httpCode == 404)
    {
        touch('cache/404_err.txt');
    }
    else
    {
        $contents = curl_exec($curl);
        fwrite($fp, $contents);
    }


    curl_close($curl);
}

私は Windows 7 を使用しており、これを WAMP で実行しています。

私が確信していないことの1つは、「cookie.txt」ファイルが読み取られているかどうかです(パスが正しいかどうかわからないため、cookie.txtファイルをサーバーのルートとこのスクリプトを実行しているディレクトリ)。

前もって感謝します!

----------- オンラインマニュアルでいくつかのコードを見つけました ----------

// $url = page to POST data
// $ref_url = tell the server which page you came from (spoofing)
// $login = true will make a clean cookie-file.
// $proxy = proxy data
// $proxystatus = do you use a proxy ? true/false

function
curl_grab_page($url,$ref_url,$data,$login,$proxy,$proxystatus){
    if($login == 'true') {
        $fp = fopen("ryanCookie.txt", "w");
        fclose($fp);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "ryanCookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "ryanCookie.txt");
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($ch, CURLOPT_TIMEOUT, 40);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if ($proxystatus == 'true') {
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, $ref_url);

    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    ob_start();
    return curl_exec ($ch); // execute the curl command
    ob_end_clean();
    curl_close ($ch);
    unset($ch);
}

echo curl_grab_page("https://www.lynda.com/login/login.aspx", "http://www.lynda.com/", "simple_username=*******&simple_password=*******", "true",  "null", "false")."done!";

しかし、まだ動作しません:( これは、上記のコードを取得したページです: http://php.net/manual/en/function.curl-setopt.php

4

3 に答える 3

1

インターネットと http がどのように機能するかを理解する必要があります。ご覧のとおり、Web サイトにアクセスすると、通常、ステータスを追跡するために Cookie が提供されます。また、非ログイン会員として開始します。ログイン ボタンを押すと、サーバーはステータスをログイン済みに更新し、このステータスをサーバー サイト セッションまたは Cookie を使用してブラウザに保存します。

質問に戻りますが、会員ページにアクセスしたいので、まず次の手順を実行する必要があります。lynda.com の仕組みを学びます。ただし、以下の私の手順はかなり一般的です。

  1. ログインページを読み込んでフォーム情報を取得する
  2. ログイン情報を含むフォーム情報を挿入し、フォームをサーバーに送り返します
  3. サーバーから受け取った Cookie を保存する
  4. 会員ページを読み込み (ステップ 4 の Cookie 情報を含めることを忘れないでください)、html をフェッチします。

詳細については、次のリソースを参照してください。

于 2012-11-23T07:24:08.303 に答える
0

会員ページを取得するには、ウェブサイトにログインする必要があります。そのためには、次のことを行う必要があります。

  1. ログインページにアクセス
  2. ログイン認証情報を送信するためにブラウザが行うのと同じリクエストを行います
  3. 会員ページを取得する

または、ログイン後にブラウザーから Cookie を抽出し、curl で使用するcurl_setopt($ch, CURLOPT_COOKIE, 'a=b;c=d');こともできますが、Web サイトは IP またはセッション チェックも使用できるため、これは機能しない可能性があります。

于 2012-11-24T09:36:33.950 に答える
0

HTTP ヘッダー部分にサイトのユーザー名とパスワードを含む Authorization ヘッダーを送信する必要があるかもしれません。

于 2012-11-23T07:13:28.070 に答える