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,该网站仍然认为我已注销。
在此先感谢!
答
当你跳转到网站的其他部分做这样的事情时,你需要指定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));
}
我还没有测试过这个,因为你的代码是一团糟,但试一试。
盗取别人IP的方式。 – 2012-06-19 04:33:42
没有IP被盗。我刚刚搜索“乔”作为测试简介,这是第一个出现:P – user1462569
我应该澄清,IP在这种情况下是知识产权。 – 2012-06-19 04:36:15