我想从我所属的phpBB论坛中抓取一些数据。但为此,需要登录。我可以使用cURL登录,但是如果我在使用cURL登录后尝试抓取数据,它仍然显示我需要在查看该页面之前登录。是否可以使用cURL登录并保留该会话以进行更远的工作?
另一方面,该论坛通常在登录后显示确认页面,然后在5秒后自动重定向到索引页面。问题是,如果我使用cURL登录,我的脚本也会按照该标题位置显示该页面..
有什么解决方法吗?
答案 0 :(得分:2)
这通常对我有用
$timeout=5;
$file='cookies.jar';
$this->handle=curl_init('');
curl_setopt($this->handle, CURLOPT_COOKIEFILE, $file);
curl_setopt($this->handle, CURLOPT_COOKIEJAR, $file);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)");
curl_setopt($this->handle, CURLOPT_TIMEOUT, round($timeout,0));
curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, round($timeout,0));
我通常会像这样使用它
$now=grab_first_page();
if(not_logged_in($now)) {
send_login_info();
}
if(not_logged_in()) { end_of_script_with_error(); }
// rest of script
通过这种方式,cookie可以跨会话保存,并且每次执行某些操作时脚本都不必登录。
---探索以下----
我正在使用一个对象,但你可以用一个名为$ mycurl的简单变量替换$ this->句柄,这些行就像
$mycurl=curl_init(''
curl_setopt($mycurl, CURLOPT_COOKIEFILE, $file)
以下代码的作用是: - 初始化“卷曲实例”(保持简单)(第3行) - 第4行和第5行:将cookie保存到文件中。 Curl就像浏览器一样工作,因此当您使用curl登录页面时,它会将带有身份验证数据的cookie保留在内存中。我告诉它将它保存到文件中,以便第二次运行脚本时它将具有相同的cookie,并且不需要再次进行身份验证。或者,您可以使用相同的cookie文件创建多个脚本,只需一个用于每24小时或每次注销时运行的登录... - 其他设置: * followlocation - 当curl收到http重定向时,它应该返回重定向到的页面,而不是重定向代码 * useragent - curl呈现为firefox *超时 - 等待连接建立的时间,通常为5或10绰绰有余
我在这里使用了一个简单的课程http://pastebin.com/Rfpc103X
你可以像这样使用它
// -- initialize curl
$ec=new easyCurl;
// -- set some options
//if the file you are in right now is named file_a.php it will create a file_a.jar cookie file
$ec->start(str_replace('.php','.jar',__FILE__));
$ec->headersPrepare(false);
$ec->prepareTimeOut(20);
$url='http://www.google.com/';
// --- set url
$ec->curlPrepare($url);
// --- get the actual data
$page=$ec->grab();
echo $page;
// to send GET data
$get_data=array('id'=>10);
$ec->curlPrepare($url,$get_data);
// and to post data
$post_data=array('user'=>'blue','password'=>'black');
$ec->curlPrepare($url,array(),$post_data);
它会自动处理POST / GET的设置以及我经常遇到的其他选项。我希望上面的例子对你有用。祝你好运。
答案 1 :(得分:0)
是的,你必须保存cookie。为此,您可以在登录时创建一个cookie jar,您可以在以后访问论坛时重复使用它。
curl --cookie-jar cjar -d "somelogindata" http://example.com/phpbb/login.php
这将创建一个cjar
cookie jar文件,然后您可以在以后的请求中重复使用该文件:
curl --cookie-jar cjar --cookie cjar http://example.com/phpbb/viewforum.php?foobar
--cookie-jar
选项指定保存cookie的文件;要使用它们,请使用--cookie
选项。要更新Cookie,您还应始终提供--cookie-jar
选项。