使用PHP登录网站并从页面获取文本

使用PHP登录网站并从页面获取文本,php,curl,login,autologin,Php,Curl,Login,Autologin,我正在尝试登录到一个网站,并从一个页面抓取内容,你必须验证才能看到。我做了一些研究,并看到了一些使用cURL和stream_context_create的示例,但我无法找到任何一种方法。我有要登录的页面的url,以及包含我需要获取的数据的页面。非常感谢你的帮助 以下是我的工作内容: <?php $pages = array('home' => 'https://www.53.com/wps/portal/personal', 'login'

我正在尝试登录到一个网站,并从一个页面抓取内容,你必须验证才能看到。我做了一些研究,并看到了一些使用cURL和stream_context_create的示例,但我无法找到任何一种方法。我有要登录的页面的url,以及包含我需要获取的数据的页面。非常感谢你的帮助

以下是我的工作内容:

<?php 
    $pages = array('home' => 
'https://www.53.com/wps/portal/personal', 
               'login' => 
'https://www.53.com/wps/portal/personal', 
               'data' => 
'https://www.53.com/servlet/efsonline/index.html?Messages.SortedBy=DATE,REVERSE'); 
    $ch = curl_init(); 
    //Set options for curl session 
    $options = array(CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)', 
             CURLOPT_SSL_VERIFYPEER => FALSE, 
             CURLOPT_SSL_VERIFYHOST => 2, 
             CURLOPT_HEADER => TRUE, 
             //CURLOPT_RETURNTRANSFER => TRUE, 
             CURLOPT_COOKIEFILE => 'cookie.txt', 
             CURLOPT_COOKIEJAR => 'cookies.txt'); 

    //Hit home page for session cookie 
    $options[CURLOPT_URL] = $pages['home']; 
    curl_setopt_array($ch, $options); 
    curl_exec($ch); 

    //Login 
    $options[CURLOPT_URL] = $pages['login']; 
    $options[CURLOPT_POST] = TRUE; 
    $options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx'; 
    $options[CURLOPT_FOLLOWLOCATION] = FALSE; 
    curl_setopt_array($ch, $options); 
    curl_exec($ch); 

    //Hit data page 
    $options[CURLOPT_URL] = $pages['data']; 
    curl_setopt_array($ch, $options); 
    $data = curl_exec($ch); 

    //Output data
    echo $data; 

    //Close curl session 
    curl_close($ch); 
?>

干杯

安东尼

如果你看一看,你可能会得到你需要的东西

(我猜你需要做与登录时相同的帖子,然后从那里继续会话)

编辑(作为对以下问题的回答)

在第一个请求中,客户端将在登录后使用一些cookie进行响应。您必须在第二个请求中将此cookie设置为标头

如果您收到500个错误,则可能是服务器拒绝了您的请求,因为您没有向其发送足够的头。拒绝你并不少见。请尝试以下操作:

$opts = array('http' =>
array('method' => 'Get',
        'Header' => "Host: www.someserver.com\r\n".
        "User-Agent: Mozilla\r\n",
    'user_agent' => 'Mozilla'));

$context = stream_context_create($opts);

$fp = fopen('http://www.someserver.no', 'r', false, $context);
fpassthru($fp);
fclose($fp);

。。。您可能需要设置的标题因服务器而异。

Anthony,不久前我不得不构建类似的东西。你需要关注的是饼干


Curl处理cookies,您需要做的是确保首先登录,并在同一连接中加载数据。如果您不能使用相同的连接,您可以使用opts CURLOPT_COOKIE或CURLOPT_COOKIE文件来帮助您。更多信息:

您使用的是登录字段ID而不是名称:

$options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx'; 
应该是

$options[CURLOPT_POSTFIELDS] = 'UserName=xxx&Password=xxx'; 

显示你无法使用的代码,肯定有人能帮助你超越请检查[link][1]和帮助我[1]:没错,但我认为我的问题是我需要在单独的页面上进行身份验证,然后将会话转到包含我想要的内容的第二页。我尝试了这个例子,两次调用file_get_contents,一次用于身份验证,一次用于从第二页获取内容。但我得到的只是“…[function.file get contents]:无法打开流:HTTP请求失败!HTTP/1.1 500内部服务器错误…”500内部服务器错误是来自您的服务器还是您将查询发送到的服务器=如果您要使用“file\u get\u contents”,那么您需要自己提取cookie头并对其进行解析,我不建议这样做。我试过了,在网上找到了一些例子,查看原始帖子以获取更新的代码,但它正在输出登录页面,并从网站上发出消息说cookies未启用。