PHP CURL Bot可能的cookie问题?

问题描述:

我正致力于制作一个从网站上提取数据的网络爬虫程序,并且几乎在主页上,但我遇到了一个问题。我可以很好地登录/检索cookie,但是当以这种方式登录时,网站反应异常。 (参考屏幕截图)PHP CURL Bot可能的cookie问题?

一旦页面被初始加载(cookie仍然存在,我检查过),它几乎看起来好像cookie变得无用。任何人都知道我在做什么错了?我试过四处寻找类似的问题无济于事。

代码:

<? 
session_write_close(); 
$ch = curl_init(); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, getcwd().'/cookie.txt'); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, getcwd().'/cookie.txt'); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_REFERER, "http://www.callofduty.com/"); 
curl_setopt($ch, CURLOPT_URL,"https://profile.callofduty.com/elite/login"); 
curl_exec($ch); 

curl_setopt ($ch, CURLOPT_REFERER, "https://profile.callofduty.com/elite/login"); 
curl_setopt($ch, CURLOPT_URL, 'https://profile.callofduty.com/elite/do_login'); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'j_username=USERNAME&j_password=PASSWORD'); 
echo "Initial Dump: <p>"; 
echo curl_exec($ch); 

curl_setopt($ch, CURLOPT_URL,"https://elite.callofduty.com/career/xbox/54d10030cc86b1b9c3162b395d46bffe#/playercardmw3"); 
curl_exec($ch); 
echo "<hr/>Second Dump: <p>"; 
var_dump(curl_getinfo($ch)); 
?> 

注:本网页的作品更好,如果我定期在另一个背景窗口登录。有更多的信息加载。这让我困惑,因为不是服务器上PHP脚本处理的cookie? O_O

--- UPDATE --- 好吧,我不知道为什么,因为我没有改变什么,但现在当我加载网站,它看起来正常,只是没有我想要的信息(http://gyazo.com/e326f2f4cdac3e6a4a20fdc9afc62f2d.png?1340088915)。但是,它显示我已注销。 (注意:在注销无法查看配置文件,它迫使你登录屏幕)

这里是请求的两个回波和后续代码var_dump打印输出:http://gyazo.com/ded134560cdf6c6ecf0b27221f35e32b.png?1340110136

至于我可以告诉,即使我已经收到cookie,该网站仍然认为我已注销。

在此先感谢!

+0

盗取别人IP的方式。 – 2012-06-19 04:33:42

+0

没有IP被盗。我刚刚搜索“乔”作为测试简介,这是第一个出现:P – user1462569

+0

我应该澄清,IP在这种情况下是知识产权。 – 2012-06-19 04:36:15

当你跳转到网站的其他部分做这样的事情时,你需要指定cookie。

function login(){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//add this line 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//add this line 
    curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
    curl_setopt ($ch, CURLOPT_COOKIEJAR, getcwd().'/cookie.txt'); 
    curl_setopt ($ch, CURLOPT_COOKIEFILE, getcwd().'/cookie.txt'); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_REFERER, "http://www.callofduty.com/"); 
    curl_setopt($ch, CURLOPT_URL,"https://profile.callofduty.com/elite/login"); 
    curl_exec($ch); 

    curl_setopt ($ch, CURLOPT_REFERER, "https://profile.callofduty.com/elite/login"); 
    curl_setopt($ch, CURLOPT_URL, 'https://profile.callofduty.com/elite/do_login'); 
    curl_setopt ($ch, CURLOPT_POST, 1); 
    curl_setopt ($ch, CURLOPT_POSTFIELDS, 'j_username=USERNAME&j_password=PASSWORD'); 
    echo "Initial Dump: <p>"; 
    echo curl_exec($ch); 
} 

function getPlayer(){ 
    login(); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_URL,"https://elite.callofduty.com/career/xbox/54d10030cc86b1b9c3162b395d46bffe#/playercardmw3"); 
    curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookies.txt");//add this line 
    curl_exec($ch); 
    echo "<hr/>Second Dump: <p>"; 
    var_dump(curl_getinfo($ch)); 
} 

我还没有测试过这个,因为你的代码是一团糟,但试一试。