php模拟登陆的实现方法分析

PHP模拟登录的实现方法分析

在爬取数据的过程中,很多时候需要进行模拟登录才能获取到需要的数据。本篇文章将从理论和实际两方面分析PHP模拟登录的实现方法。

理论分析

相关概念

Cookie

在HTTP协议中,cookie是服务器保存在客户端的一小段文本信息。每次客户端向服务器发送请求时,都会带上这个cookie。服务器通过这个cookie来识别客户端。

Session

在WEB开发中,session是一种记录当前用户状态的机制,是一种服务器端的机制。当用户在浏览网页时,其状态会被不断地记录与更新,如购物车中的商品列表,在后台用浏览器的TAB选项卡打开管理页面等。

实现流程

模拟登录的实现过程如下:

  1. 发送GET请求,获取登录页面的HTML代码;
  2. 从HTML代码中获取登录表单的信息,包括post的URL、表单数据(用户名和密码),以及需要的Cookie等;
  3. 发送POST请求,携带上一步获取到的表单数据和Cookie;
  4. 获取登录后的HTML代码,利用正则表达式或者XPath解析需要的数据;
  5. 退出登录或者保持登录状态。

实际操作

示例一:模拟登录GitHub

网站名称:GitHub

登录URL:https://github.com/login

实现步骤

  1. 使用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);
  1. 从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];
  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);
  1. 获取登录后的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

实现步骤

  1. 使用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);
  1. 从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) . ';';
}
  1. 发送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);
  1. 获取登录后的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技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP页面输出时js设置input框的选中值

    首先,我们需要明确需求,即在PHP页面输出时,使用JavaScript设置input框的选中值。这个过程可以分为以下几步: 在PHP页面中定义一个input标签,为其指定一个id,在代码中要使用echo输出。 echo ‘<input type="checkbox" id="myCheckbox" name=&q…

    PHP 2023年5月26日
    00
  • PHP导出带样式的Excel示例代码

    下面就为大家介绍一下如何使用 PHP 导出带样式的 Excel,并附上两个示例说明。 1. 准备工作 首先,你需要安装 PHPExcel 库,这是一个用于在 PHP 中操作 Excel 的优秀库,它可以直接生成带样式的 Excel 文件。你可以从 PHPExcel 官方网站下载并安装。 2. 示范代码 下面是一个简单的 PHP 导出带样式的 Excel 示例…

    PHP 2023年5月26日
    00
  • php字符串函数学习之substr()

    PHP字符串函数学习之substr() 在PHP字符串函数中,substr()是一个非常常用的函数,主要用于截取字符串的一部分。 语法 substr(string $string, int $start, int $length) 参数 string:必需。 要截取的字符串。 start:必需。 规定在字符串的何处开始截取,如果是负数,则从字符串结尾开始算起…

    PHP 2023年5月26日
    00
  • 详解PHP7开启OPcache和Swoole性能的提升对比

    下面是详解 “详解PHP7开启OPcache和Swoole性能的提升对比” 的完整攻略: 简介 在本篇攻略中,我们将通过开启OPcache和Swoole来提升PHP7的性能。OPcache是一个在PHP7中自带的缓存系统,可以将编译后的PHP代码存储在内存中,避免每次都进行编译,从而提高PHP程序的运行效率。Swoole是一个基于PHP开发的异步、高性能、可…

    PHP 2023年5月24日
    00
  • PHP设计模式之命令模式示例详解

    PHP设计模式之命令模式示例详解 命令模式是一种行为型模式,它允许你将请求封装成对象,这样就可以使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持撤销操作,因此被称为可撤销的操作。 示例1: 使用命令模式实现固定长度的文件备份 示例1中,我们将使用命令模式实现固定长度的文件备份。在此示例中,我们将使用一个Command接口来表示备份的命令,并让每个…

    PHP 2023年5月23日
    00
  • Windows Server 2008(R2) 一键安装PHP环境(PHP5.3+FastCGI模式)

    我会给出完整的攻略。以下是Windows Server 2008(R2)一键安装PHP环境的步骤和示例说明。 步骤一:下载并安装IIS 首先,你需要下载和安装IIS。在Windows Server 2008的控制面板中,选择“程序”-> “打开和关闭Windows功能”,勾选“IIS”即可。 步骤二:下载并运行一键安装PHP工具 接下来,你需要下载一键…

    PHP 2023年5月30日
    00
  • PHP 实现类似js中alert() 提示框

    要在 PHP 中实现类似 JavaScript 的 alert() 提示框,可以通过 PHP 中的 echo 函数输出 JavaScript 代码来实现。 下面是实现的具体步骤: 定义一个名为 alert() 的 PHP 函数,该函数接收一个字符串参数作为提示框中显示的文本。 在 PHP 函数中使用 echo 输出 JavaScript 代码,调用 aler…

    PHP 2023年5月27日
    00
  • 使用PHP导出Word文档的原理和实例

    使用PHP导出Word文档的原理和实例 前言 随着互联网的发展,更多的应用程序需要将数据以Word文档的形式导出,这就需要我们使用PHP来实现。而本文就是一份基于PHP导出Word文档的攻略,通过本文中的示例代码,你将会学会如何使用PHP来实现导出Word文档。 导出Word文档的原理 要将数据以Word文档的形式导出,需要从以下几个方面来考虑: Word文…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部