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 上运行。

我不确定的一件事是“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

您需要了解 Internet 和 http 的工作原理。你看,当你访问一个网站时,他们通常会给你 cookie 来跟踪你的状态。您也将以非登录成员的身份开始。在您点击登录按钮后,服务器会将您的状态更新为已登录并将此状态存储在服务器站点会话中或使用 cookie 存储在您的浏览器中。

回到您的问题,既然您要访问会员页面,这意味着您需要先执行以下步骤,了解 lynda.com 的工作原理。但是,我下面的步骤相当笼统:

  1. 加载登录页面并获取表单信息
  2. 使用您的登录信息注入表单信息并将表单发送回服务器
  3. 存储从服务器接收到的 cookie
  4. 加载成员页面(不要忘记包含步骤 4 中的 cookie 信息)并获取 html

有关更多信息,您可以查看以下资源:

于 2012-11-23T07:24:08.303 回答
0

也许您需要发送 Authorization 标头,其中包含您在 HTTP 标头部分中的站点的用户名和密码。

于 2012-11-23T07:13:28.070 回答
0

要获得会员页面,您需要在网站上登录。为此,您需要:

  1. 访问登录页面
  2. 发出与浏览器提交登录凭据相同的请求
  3. 获取会员页面

或者,您可以尝试在登录后从浏览器中提取 cookie 并在 curl 中使用它们curl_setopt($ch, CURLOPT_COOKIE, 'a=b;c=d');,但这可能不起作用,因为网站也可以使用 IP 或会话检查。

于 2012-11-24T09:36:33.950 回答