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

yizhihongxing

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面向对象全攻略 (四)构造方法与析构方法

    下面我将为你详细讲解“php面向对象全攻略(四)构造方法与析构方法”的完整攻略。 一、什么是构造方法和析构方法? 在面向对象编程中,构造方法和析构方法是两个重要的概念。 构造方法 构造方法是一种特殊的方法,它在对象创建时被调用。它用于对新创建的对象进行初始化操作,比如给成员变量赋初值等。 在PHP中,构造方法的函数名必须是__construct,它没有任何返…

    PHP 2023年5月25日
    00
  • PHP新手上路(八)

    PHP新手上路(八)攻略 题目简介 本文是《PHP新手上路》系列的第八篇文章,主要介绍PHP常见的读写文件操作。 读文件操作 PHP提供了多种方法读取文件,可通过readfile函数和file_get_contents函数实现。 readfile函数 readfile("file.txt"); readfile函数直接输出文件内容,适合读…

    PHP 2023年5月23日
    00
  • PHP 身份验证方面的函数

    Sure! PHP 提供了许多身份验证相关的函数,可以用于验证用户的身份,并确保其权限。下面是一些常用的函数: password_hash 该函数用于将密码散列并保存到数据库中,常用于用户注册和更改密码的场景。它接收两个参数:密码(字符串)和散列算法(例如 PASSWORD_BCRYPT),并返回一个散列后的密码字符串。 // 生成密码散列 $hashed_…

    PHP 2023年5月27日
    00
  • php打乱数组二维数组多维数组的简单实例

    当需要对数组进行随机打乱时,可以使用shuffle函数。该函数可以随机打乱给定数组中的元素顺序,适用于一维、二维和多维数组。以下是一个针对不同类型数组的简单实例说明: 一维数组乱序 假设有一个包含10个元素的一维数组,需要对其进行随机打乱。可以使用以下代码: <?php $myArray = array(‘a’, ‘b’, ‘c’, ‘d’, ‘e’,…

    PHP 2023年5月26日
    00
  • php 实现收藏功能的示例代码

    要实现网站的收藏功能,需要前端和后端的配合。前端需要设置一个“收藏”按钮,用户点击后将文章ID发送到后端,后端接收并处理,将用户ID和文章ID存入数据库中。下面是实现收藏功能的示例代码: 前端代码 <button data-id="123" class="btn-favorites">收藏</butt…

    PHP 2023年5月27日
    00
  • PHP单文件上传原理及上传函数的封装操作示例

    PHP单文件上传原理及上传函数的封装操作示例 什么是文件上传? 文件上传指将本地文件通过互联网传输到服务器上的指定目录中。 文件上传的原理 在服务器端,所有的文件都以二进制的形式存储。当客户端上传文件时,服务器会在内存中开辟一块空间,将上传的文件保存在该空间中,然后将这个文件从内存中保存到服务器的硬盘上。 文件上传的过程中,主要的参数如下: 文件名 文件类型…

    PHP 2023年5月26日
    00
  • linux轻量级 Web 服务器第2/2页

    针对“linux轻量级 Web 服务器第2/2页”的完整攻略,我会给出详细的讲解以及两个示例说明。 概述 “linux轻量级 Web 服务器第2/2页”是一篇介绍如何使用轻量级的Linux Web服务器部署Web应用程序的教程。文章通过介绍轻量级Web服务器、配置Web服务器、生成SSL证书、发布静态网站以及使用代理服务等方面的知识,帮助读者实现一个相对完善…

    PHP 2023年5月27日
    00
  • php网络安全中命令执行漏洞的产生及本质探究

    下面是“PHP网络安全中命令执行漏洞的产生及本质探究”的完整使用攻略,包括漏洞描述、漏洞分析、漏洞利用和两个示例说明。 漏洞描述 命令执行漏洞是一种常见的Web应用程序漏洞,攻击者可以通过Web应用程序中注入恶意代码来执行任意命令。这种漏洞通常是由于Web应用程序未正确验证用户输入而导致的。 漏洞分析 PHP是一种常用的Web编程语言,它具有强大的功能和灵活…

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