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

2ic8powd  于 2022-11-13  发布在  PHP
关注(0)|答案(3)|浏览(137)

我正在尝试登录到一个网站,并从一个页面抓取内容,您必须通过身份验证才能看到。我做了一些研究,并看到了一些使用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); 
?>

干杯,
安东尼

weylhg0b

weylhg0b1#

安东尼,前一段时间我不得不建立这样的东西。你需要关注的是,在饼干。
Curl处理cookies,你需要做的是确保你先登录,并在同一个连接中加载数据。如果你不能使用同一个连接,你可以使用opts CURLOPT_COOKIE或CURLOPT_COOKIEFILE来帮助你。更多信息:http://ar2.php.net/manual/en/function.curl-setopt.php

a8jjtwal

a8jjtwal2#

如果你看一下How to post data in PHP using file_get_contents?,你可能会得到你所需要的。
(我猜你需要做的是登录时的帖子,并从那里继续会话)
编辑(作为对以下问题的回答)
在第一个请求中,客户端在登录后会用一些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);

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

hgc7kmma

hgc7kmma3#

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

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

应该是

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

相关问题