11

我想制作一个可以从网站捕获页面的 php 脚本。想想file_get_contents($url)

但是,本网站要求您在访问任何页面之前填写用户名/密码登录表格。我想,一旦登录,网站会向您的浏览器发送一个身份验证 cookie,并且在随后的每个浏览器请求中,会话信息都会传回网站以验证访问权限。

我想知道如何使用 php 脚本模拟浏览器的这种行为,以便从该网站获得访问权限并捕获页面。

更具体地说,我的问题是:

  1. 如何发送包含我的登录详细信息的请求,以便网站回复会话信息/cookie
  2. 我如何读取会话信息/cookie
  3. 我如何将这个会话信息与每个后续请求(file_get_contentscurl)传回网站。

谢谢。

4

2 回答 2

19

卷曲非常适合这样做。CURLOPT_COOKIEJAR除了设置和CURLOPT_COOKIEFILE选项之外,您不需要做任何特别的事情。一旦您通过从站点传递表单字段登录,cookie 将被保存,Curl 将自动将相同的 cookie 用于后续请求,如下例所示。

请注意,下面的函数会保存 cookie,cookies/cookie.txt以确保目录/文件存在并且可以写入。

$loginUrl = 'http://example.com/login'; //action from the login form
$loginFields = array('username'=>'user', 'password'=>'pass'); //login form field names and values
$remotePageUrl = 'http://example.com/remotepage.html'; //url of the page you want to save  

$login = getUrl($loginUrl, 'post', $loginFields); //login to the site

$remotePage = getUrl($remotePageUrl); //get the remote page

function getUrl($url, $method='', $vars='') {
    $ch = curl_init();
    if ($method == 'post') {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies/cookies.txt');
    $buffer = curl_exec($ch);
    curl_close($ch);
    return $buffer;
}
于 2009-07-04T15:37:18.833 回答
0

http pecl 扩展可以做到这一点,还有PEAR ::HTTP_ClientSnoopy和许多其他库/类。如果您(无论出于何种原因)想要使用 实现此目的file_get_contents,您可以使用http 包装器的流上下文选项来设置 POST 和 cookie 参数,并使用stream_get_meta_data来读取包括 cookie 的响应标头。

于 2009-07-04T15:13:32.063 回答