2017-02-15 143 views
1

我想抓取标准登录表单后面隐藏的网站内容(通过HTTPS在我的网站和目标网站上,如果有的话)。PHP cURL - 来自同一个'用户'的多个请求

我可以成功登录到该页面通过做POST请求,就像这样:

include("inc/simple_html_dom.php"); 

$url = "https://account.tfl.gov.uk/Login"; 

$ch = curl_init();  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_URL, $url); 
$cookie = 'cookies.txt'; 
$timeout = 60; 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT,   10); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie); 
curl_setopt($ch, CURLOPT_COOKIEFILE,  $cookie); 

curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch,CURLOPT_POSTFIELDS,"UserName=USER&Password=PASSWORD&AppId=00000000-0000-0000-0000-000000000000&ReturnUrl=");  

$result = curl_exec($ch); 

然后我希望能够刮擦使用者的旅程历史,这可在https://oyster.tfl.gov.uk/oyster/journeyHistoryThrottle.do?_qs=_qv=[SESSION CODE]在一次登录。要获得会话代码我使用SimpleHTMLDom:

$html = str_get_html($result); 
$codeRaw = $html->getElementById('Oyster')->childNodes(1); 
$code1 = explode("?_o=",$codeRaw); 
$code2 = explode('"',$code1[1]); 
$codeReal = $code2[0]; 

我再试图做的是另卷曲请求访问该网页:

$url = "https://oyster.tfl.gov.uk/oyster/journeyHistoryThrottle.do?_qs=_qv=".$codeReal; 

echo $url; 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_URL, $url); 
$cookie = 'cookies.txt'; 
$timeout = 60; 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT,   10); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie); 
curl_setopt($ch, CURLOPT_COOKIEFILE,  $cookie); 

$result = str_replace('"/','"https://oyster.tfl.gov.uk/',curl_exec($ch)); 

curl_close($ch); 
echo $result; 

但我得到的是一个登录页面 - 我怀疑是因为两个cURL请求在TfL站点上生成不同的“会话”?

有没有办法强制cURL使用以前的会话?如果相关,那么在浏览历史记录分页时,我可能还需要做进一步的请求。

或者其他任何方式来实现这一目标? (TfL没有为此提供API)

+1

您不必一旦你这样做第二卷曲请求重新设置cookies,正好被清除的职位,更换URL – Faxsy

+0

如何取消设置的职位?哪些cookie相关行需要从第二次卷曲中删除? –

+0

您收到了@ miken32 – Faxsy

回答

1

对于简单的会话处理,您只需要将CURLOPT_COOKIEFILE选项设置为空字符串。详见。

我看到了一些可能的问题。您的两个网址位于不同的主机上,是否有意为之,如果是这样,您确定account.tfl.gov.uk中的cookies将在oyster.tfl.gov.uk上阅读?您没有将您的方法从第二个网址的POST设置为GET。我认为这是一个错误,因为没有关于第二次检索的发布数据,并在下面进行了更正。

另外值得一提的是,你可能没有想到以最有效的方式获取$codeReal,但我看不到你的HTML工作。所有explode()表明可能有更好的方法!

<?php 
include("inc/simple_html_dom.php"); 

$url = "https://account.tfl.gov.uk/Login"; 

$ch = curl_init();  
curl_setopt_array($ch, [ 
    CURLOPT_RETURNTRANSFER=>true, 
    CURLOPT_URL=>$url, 
    CURLOPT_FOLLOWLOCATION=>true, 
    CURLOPT_TIMEOUT=>10, 
    CURLOPT_CONNECTTIMEOUT=>60, 
    CURLOPT_COOKIEFILE=>"", 
    CURLOPT_POST=>true, 
    CURLOPT_POSTFIELDS=>[ 
     "UserName"=>"USER", 
     "Password"=>"PASSWORD", 
     "AppId"=>"00000000-0000-0000-0000-000000000000", 
     "ReturnUrl"=>"", 
    ], 
]; 
$result = curl_exec($ch); 

// get your code, be sure to escape it 
$html = str_get_html($result); 
$codeRaw = $html->getElementById('Oyster')->childNodes(1); 
$code1 = explode("?_o=",$codeRaw); 
$code2 = explode('"',$code1[1]); 
$codeReal = $code2[0]; 

$codeReal = urlencode($codeReal); 

$url = "https://oyster.tfl.gov.uk/oyster/journeyHistoryThrottle.do?_qs=_qv=$codeReal"; 

// most of your options are the same, just change URL and disable POST 
curl_setopt_array($ch, [ 
    CURLOPT_URL=>$url, 
    CURLOPT_POST=>false, 
]; 
$result = curl_exec($ch); 
curl_close($ch); 
+0

的回复谢谢。仍然没有快乐。我还添加了cookie文件,以便在服务器上重新生成cookie.txt并确认包含“oyster.tfl.gov.uk”。可能不得不放弃这一点。 –