PHP模拟登录的实现方法分析
在爬取数据的过程中,很多时候需要进行模拟登录才能获取到需要的数据。本篇文章将从理论和实际两方面分析PHP模拟登录的实现方法。
理论分析
相关概念
Cookie
在HTTP协议中,cookie是服务器保存在客户端的一小段文本信息。每次客户端向服务器发送请求时,都会带上这个cookie。服务器通过这个cookie来识别客户端。
Session
在WEB开发中,session是一种记录当前用户状态的机制,是一种服务器端的机制。当用户在浏览网页时,其状态会被不断地记录与更新,如购物车中的商品列表,在后台用浏览器的TAB选项卡打开管理页面等。
实现流程
模拟登录的实现过程如下:
- 发送GET请求,获取登录页面的HTML代码;
- 从HTML代码中获取登录表单的信息,包括post的URL、表单数据(用户名和密码),以及需要的Cookie等;
- 发送POST请求,携带上一步获取到的表单数据和Cookie;
- 获取登录后的HTML代码,利用正则表达式或者XPath解析需要的数据;
- 退出登录或者保持登录状态。
实际操作
示例一:模拟登录GitHub
网站名称:GitHub
登录URL:https://github.com/login
实现步骤
- 使用cURL发送GET请求,获取登录页面HTML代码
$url = "https://github.com/login";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($ch);
curl_close($ch);
- 从HTML代码中获取登录表单的信息,包括post的URL、表单数据(用户名和密码),以及需要的Cookie
preg_match('/<form accept-charset="UTF-8" action="([^"]+)" method="post">/', $html, $match);
$action_url = "https://github.com".$match[1];
preg_match('/<input type="hidden" name="authenticity_token" value="([^"]+)"/', $html, $match);
$authenticity_token = $match[1];
preg_match('/<input type="text" name="login" value="" placeholder="Username or email address"/', $html, $match);
$login_name = "your_login_name";
preg_match('/<input type="password" name="password" id="password" class="form-control input-block" tabindex="2" autocapitalize="off" autocorrect="off" autocomplete="current-password"/', $html, $match);
$login_password = "your_login_password";
preg_match('/(<input type=\"hidden\" name=\"value\" value=\"[a-zA-Z0-9]+\">)/', $html, $match);
$cookie = $match[1];
- 发送POST请求,携带上一步获取到的表单数据和Cookie
$data = [
'commit' => 'Sign in',
'utf8' => '%E2%9C%93',
'authenticity_token' => $authenticity_token,
'login' => $login_name,
'password' => $login_password
];
$header = [
"Referer: https://github.com/login",
"Content-Type:application/x-www-form-urlencoded",
"Cookie:$cookie"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $action_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
- 获取登录后的HTML代码,利用正则表达式或者XPath解析需要的数据
$url = "https://github.com/your_user_name/your_repository_name";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$html = curl_exec($ch);
curl_close($ch);
示例二:模拟登录新浪微博
网站名称:新浪微博
登录URL:https://passport.weibo.cn/signin/login
实现步骤
- 使用cURL发送GET请求,获取登录页面HTML代码
$url = "https://passport.weibo.cn/signin/login";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($ch);
curl_close($ch);
- 从HTML代码中获取登录表单的信息,包括post的URL、表单数据(用户名和密码),以及需要的Cookie
preg_match('/<form method="post" class="sigin-box" action="([^"]*)">/', $html, $match);
$post_url = "https://passport.weibo.cn".$match[1];
preg_match('/<input type="hidden" name="backURL" value="([^"]*)"\/>/', $html, $match);
$backURL = $match[1];
preg_match('/<input type="hidden" name="retcode" value="([^"]*)"\/>/', $html, $match);
$retcode = $match[1];
preg_match('/<input type="hidden" name="sentry" value="([^"]*)"\/>/', $html, $match);
$sentry = $match[1];
preg_match('/<input type="hidden" name="vt" value="([^"]*)"\/>/', $html, $match);
$vt = $match[1];
preg_match('/<input type="hidden" name="verifyToken" value="([^"]*)"\/>/', $html, $match);
$verifyToken = $match[1];
preg_match('/<input type="hidden" name="pagerefer" value="([^"]*)"\/>/', $html, $match);
$pagerefer = $match[1];
preg_match('/<input type="hidden" name="entry" value="([^"]*)"\/>/', $html, $match);
$entry = $match[1];
preg_match('/<input type="hidden" name="mainpageflag" value="([^"]*)"\/>/', $html, $match);
$mainpageflag = $match[1];
preg_match('/<button type="submit" class="btn_31px_2 btn_bgcolor_AW btn_block" disabled="disabled" node-type="submitBtn" tabindex="3">([^"]*)<\/button>/', $html, $match);
$login_button = $match[1];
$cookie = "";
preg_match_all('/Set-Cookie:(.*);/iU', $html, $cookies);
foreach ($cookies[1] as $c) {
$cookie .= trim($c) . ';';
}
- 发送POST请求,携带上一步获取到的表单数据和Cookie
$data = [
'username' => 'your_username',
'password' => 'your_password',
'savestate' => '1',
'ec' => '1',
'pagerefer' => $pagerefer,
'entry' => $entry,
'wentry' => '',
'loginfrom' => '',
'client_id' => '',
'code' => '',
'qq' => '',
'mainpageflag' => $mainpageflag,
'hff' => '',
'hfp' => '',
];
$header = [
"Referer:https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F",
"Content-Type:application/x-www-form-urlencoded",
"Cookie:$cookie"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $post_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
- 获取登录后的HTML代码,利用正则表达式或者XPath解析需要的数据
$url = "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D%E5%BE%AE%E5%8D%9A%E5%8D%81%E5%A4%A7%E5%B0%8F%E5%8A%A8%E6%80%81%26t%3D0&page_type=searchall";
$header = [
"Referer:https://m.weibo.cn/p/100103type%3D3%26q%3D%E5%BE%AE%E5%8D%9A%E5%8D%81%E5%A4%A7%E5%B0%8F%E5%8A%A8%E6%80%81%26t%3D0",
"Cookie:$cookie"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$html = curl_exec($ch);
curl_close($ch);
总结
模拟登录需要注意一些细节,比如获取Cookie和POST请求时需要设置请求头信息,否则很容易获取不到想要的数据。在实际操作中,可以借助Chrome浏览器的“开发者工具”获取上述信息,从而方便地进行模拟登录。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php模拟登陆的实现方法分析 - Python技术站