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 redis实现对200w用户的即时推送

    实现对200w用户的即时推送,需要使用PHP的Redis扩展。Redis是内存数据库,具有高效的读写速度和好的扩展性,非常适合处理实时数据,支持多种数据结构,如字符串、列表、集合、有序集合等。 下面是详细的攻略流程: 第一步:安装Redis 首先需要安装Redis服务端程序和Redis扩展包,可根据自己的操作系统类型进行安装。 第二步:连接Redis并设置参…

    PHP 2023年5月23日
    00
  • 微信会员卡开卡组件如何添加 微信会员卡开卡组件添加最全攻略教程

    微信会员卡开卡组件添加最全攻略教程 微信会员卡开卡组件是一款方便商家开卡的工具,可以通过简单的设置和添加,快速实现会员卡的开卡、领取、积分等功能。下面是微信会员卡开卡组件的添加步骤。 步骤一:申请微信公众平台 申请微信公众平台后,需要通过微信认证,得到公众号的开发者资质。认证完成后,可以进入“公众号设置”,开启“微信支付”。 步骤二:申请微信支付 进入“微信…

    PHP 2023年5月30日
    00
  • PHP 网络开发详解之远程文件包含漏洞

    PHP 网络开发详解之远程文件包含漏洞 远程文件包含(RFI)属于一种常见的漏洞类型,攻击者通过该漏洞可以执行任意代码,甚至获取控制权。以下将详细讲解如何利用RFI漏洞实现攻击,并给出两个实例: 概述 远程文件包含漏洞是指攻击者通过指定一段远程URL链接的方式,使服务器端动态脚本在执行时将含有攻击代码的远程文件包含进来,进而实现在服务器上执行恶意代码的行为。…

    PHP 2023年5月26日
    00
  • 企业级使用LAMP源码安装教程

    首先我们需要了解什么是LAMP。LAMP是一种非常流行的Web应用程序的体系结构,它包含Linux操作系统、Apache HTTP服务器、MySQL数据库和PHP编程语言。下面我们就来详细讲解企业级使用LAMP源码安装教程。 准备工作 在开始安装之前,我们需要先安装以下软件: Linux操作系统(通常选择CentOS或Ubuntu) Apache HTTP服…

    PHP 2023年5月24日
    00
  • Swoole 1.10.0新版本发布,增加了多项新特性

    Swoole 1.10.0是Swoole的一个新版本,带来了许多新特性和改进。下面将对这些新特性一一进行介绍,并提供相应的示例说明。 新特性1:基于stream_select和epoll边缘触发的高级事件驱动模型 Swoole 1.10.0引入了基于stream_select和epoll边缘触发的高级事件驱动模型,能够更加高效地进行网络编程。这一新特性能够让…

    PHP 2023年5月27日
    00
  • PHP实现网络请求的方法总结

    以下是“PHP实现网络请求的方法总结”的完整攻略。 一、背景知识 在进行网络请求前,需要了解HTTP协议相关知识,例如HTTP的请求方法、请求头、请求体以及响应头、响应体等内容。此外,还需要了解HTTP状态码的含义,例如200表示请求成功,404表示请求的资源未找到等。 二、实现方法 1. curl方法 curl是一种用于网络传输的工具,可以通过它发送各种H…

    PHP 2023年5月27日
    00
  • 男士减肥计划,男士轻松减肥方法使用教程(图)

    男士减肥计划:使用教程 简介 男士减肥计划是为男性用户制定的有效减肥方案。该计划包括了多种减肥方法和小技巧,可以轻松改善身体状况和外观。该教程分为三个部分:饮食、运动和生活方式。 饮食 1. 减少热量 要减肥,就必须减少热量。饮食方面,建议戒掉油炸类、甜食、饮料等高热量的食物。不要一次吃太多,多吃少吃是减肥的基本原则。注意膳食均衡,适当增加摄入蛋白质和膳食纤…

    PHP 2023年5月27日
    00
  • 浅谈php扩展imagick

    下面是关于“浅谈PHP扩展Imagick”的完整攻略: 1. 简介 Imagick扩展是PHP的一个扩展,它提供了对ImageMagick库的封装,可以让我们在PHP中更加方便地处理图像。Imagick支持将各种不同格式的图像转换为其他格式,对图像进行缩放,旋转,剪切等操作,还支持各种滤镜效果等高级特性。 2. 安装 使用Imagick扩展之前,我们需要安装…

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