php通过cURL爬取数据的方法(ajax接口、cookie伪造爬取、文件头信息)

news2024/11/24 15:32:34

php通过curl爬取数据

  • 一、请求流程
    • 1.CURL请求步骤
    • 2.使用CURL发送GET请求
    • 3.使用CURL发送POST请求
  • 二、实战:curl通过ajax接口API爬取数据
    • 1.接口分析
    • 2.抓取分析
    • 3.构建curl
    • 4.结果呈现
  • 三、实战:curl添加cookie伪造登陆爬取数据
    • 1.注册用户,并记录信息;
    • 2.构建curl
    • 3.阻止cURL爬取

  • cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。当然,PHP也支持 cURL 库,用来模拟浏览器访问网页、上传文件、下载文件等操作。
  • cURL 通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。cURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

一、请求流程

使用CURL的PHP扩展完成一个HTTP请求的发送一般有四个步骤:

1.CURL请求步骤

  1. 初始化连接句柄;
  2. 设置CURL选项;
  3. 执行并获取结果;
  4. 释放VURL连接句柄

2.使用CURL发送GET请求

使用CURL来发送GET请求,发送GET请求的关键是拼装格式正确的URL。请求地址和GET数据由一个“?”分割,然后GET变量的名称和值用“=”分隔,各个GET名称和值由“&”连接。PHP为我们提供了一个函数专门用来拼装GET请求和数据部分——http_build_query,该函数接受一个关联数组,返回由该关联数据描述的GET请求字符串。

function get_Data($url, $data)
{
    $url = $url . '?' . http_bulid_query($data);
    //初始化
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //执行命令
    $result = curl_exec($curl);
    //关闭URL请求
    curl_close($curl);
    //显示获得的数据
    return $result;
}

3.使用CURL发送POST请求

使用CURL提供的选项CURLOPT_POSTFIELDS,设置该选项为POST字符串数据就可以把请求放在正文中。

/*
 * $url,获取地址;
 * $data,传输参数,array();
 * */

function post_Data($url, $post_data)
{
    //异常控制;
    if ($url == '' || $post_data == '') {
        return "传递参数错误,无法获取数据.";
    }
    //初始化
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置post方式提交
    curl_setopt($curl, CURLOPT_POST, 1);
    //设置post数据
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    //执行命令
    $result = curl_exec($curl);
    //关闭URL请求
    curl_close($curl);
    //显示获得的数据
    return $result;
}
  • curl_setopt($curl, CURLOPT_HEADER, 1);时,输出的内容带文件头信息。如果仅获取json格式,可以设置为curl_setopt($curl, CURLOPT_HEADER, 0);
HTTP/1.1 100 Continue HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Server: Microsoft-IIS/8.5 X-Powered-By: PHP/5.4.45 Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/ Date: Thu, 27 Apr 2023 04:21:44 GMT Content-Length: 2722 {"res":[{"id":"1","code":"shinan","name":"\u60a6\u9014","longitude":"108.721996","latitude":"34.090917","resourceAmount":"0","url":"#"},
  • 文件流输出:curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。

**但具体文件流输出和直接输出的区别在哪里?**暂时没有找到具体的资料。直接输出,是不能数据结构化的,这个是目前发现的唯一区别。

二、实战:curl通过ajax接口API爬取数据

1.接口分析

分析某文件ajax接口,通过post获取后端数据
在这里插入图片描述

2.抓取分析

  • 获取方法: type: “post”,
  • 获取地址:url: ‘php/index.php’,
  • 传输参数:data: {“caozuo”:“gethouse”,“search_name”:search_name},

3.构建curl

/*
 * $url,获取地址;
 * $data,传输参数,array();
 * */
function postContent($url, $data)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

//执行操作
$url = "http://test.com/php/index.php";
$data = array('caozuo' => 'getarea', 'search_name' => '');

4.结果呈现

在这里插入图片描述

三、实战:curl添加cookie伪造登陆爬取数据

1.注册用户,并记录信息;

2.构建curl

function get_cookies_content($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    $header = array();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_COOKIE, 'db_user_name=楚云飞;PHPSESSID=343qv378qug069rv7uu1hk5mj6;admin_id=1;admin_roles=0;admin_menu=1;');
    $content = curl_exec($ch);
    echo $content;
    echo "<pre>错误信息:";
    print_r(curl_error($ch));
    echo "</pre>";
    echo "<pre>内容:";
    print_r(curl_getinfo($ch));
    echo "</pre>";
    echo "<pre>标题头:";
    print_r($header);
    var_dump(curl_version());
}
  • 传递cookies的方式:curl_setopt($ch, CURLOPT_COOKIE, 'db_user_name=楚云飞;PHPSESSID=343qv378qug069rv7uu1hk5mj6;admin_id=1;admin_roles=0;admin_menu=1;');
  • cookies的写法:db_user_name=楚云飞;PHPSESSID=343qv378qug069rv7uu1hk5mj6;admin_id=1;admin_roles=0;admin_menu=1;将使用到的cookies值通过=赋值,;进行分割传递即可。

3.阻止cURL爬取

在实战中发现,如果要想阻止爬取,增加判断盐值是SESSION即可:$row['user_salt'] !== session_id()

  //判断session_id是否一致,强制退出;
    global $db;
    dbc();
    $user_id = AuthCode($_COOKIE['db_user_id'], 'DECODE', '', '');
    $row = $db->fetch('user', 'user_salt', array('user_id' => trim(addslashes($user_id))), ' user_id DESC');
    if ($row['user_salt'] !== session_id()) {
        redirect('?m=Login&a=loginDeal&act=LoginOut');
    }
  • $user_id = AuthCode($_COOKIE['db_user_id'], 'DECODE', '', '');对cookies中的明文$user_id加密处理,防止越权使用或通过漏洞进行渗透;
  • 设置登录权限,判断当前登录用户是否和浏览器使用一致,防止通过curl等工具进行爬取操作;

@漏刻有时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【老王读SpringMVC-4】请求参数是如何绑定到Controller method参数对象上的?

前面我们分析了&#xff0c;如果我们自己要实现 spring mvc 框架的话&#xff0c;大致需要实现如下功能&#xff1a; 0、将 url 与 Controller method 的对应关系进行注册1、通过请求的 url 找到 Controller method (即 url 与 Controller method 的映射)2、将请求参数进行绑定…

FPGA时序约束(四)主时钟和虚拟时钟的约束

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 FPGA时序约束&#xff08;三&#xff09;时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…

计算机网络【2】 子网掩码

学习大佬记下的笔记 https://zhuanlan.zhihu.com/p/163119376 "子网"掩码&#xff0c;顾名思义&#xff0c;它就是拿来划分子网的&#xff0c;更准确的说&#xff0c;划分子网的同时&#xff0c;还能通过它知道主机在子网里面的具体ip的具体地址。 子网掩码只有一个…

聊聊「低代码」的实践之路

区块链、低代码、元宇宙、AI智能&#xff1b; 01 【先来说说背景】 这个概念由来已久&#xff0c;但是在国内兴起&#xff0c;是最近几年&#xff1b; 低代码即「Low-Code」&#xff1b; 指提供可视化开发环境&#xff0c;可以用来创建和管理软件应用&#xff1b; 简单的说…

中英文切换,vue项目国际化使用教程(国际化使用详细,i18n国际化)

简述&#xff1a;在工作中&#xff0c;我们难免会遇到把文字切换成外语的需求&#xff0c;这里来记录下如何在项目中点击切换成英语&#xff0c;这里会用到i18n&#xff0c;它是一个支持国际化功能的插件&#xff0c;这里来分享下它的使用过程。 1、首先&#xff0c;我们需要在…

idea使用 ( 四 ) 插件

5.插件 5.1.idea数据库连接 5.1.1.打开配置界面 5.1.2.选择MySQL 点击 号 > Data Source > MySQL 5.1.3.配置数据库驱动jar 先在左边选择 MySQL 再点击 号 > Custom JARs… 在 弹出的窗口中选择 已经存在的 jar位置 就导入 MySQL 的驱动文件 5.1.4.配置连库…

记录一次在x86 软件中使用dpdk 的历程(Makefile gcc改成g++)

我们一台服务器上原本是用grub下预留内存的方式, 然后把物理地址在板卡上的配置文件中传给L1. 但是在客户的环境上服务器windriver上不是能预留内存的. 所以服务器上需要在testMxx程序中用dpdk的方式分配出内存, 然后, 把物理地址通过sdp虚拟的网口&#xff0c; 用socket 传…

为什么要清除浮动?清除浮动的方式

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 浮动的定义浮动的工作原理浮动的特性为什么要清除浮动清除浮动的方式利用clear样式…

vue3 vite typescript volar element-plus element标签报红问题的解决

故障就这样的&#xff1a; 模块 ""element-plus"" 没有导出的成员 "FormInstance" 至于原因咱也不知道&#xff0c;也没搞明白&#xff0c;一直以为是volar校验的问题&#xff0c;能开发咱就接着干&#xff0c;到了发布的时候傻眼了。所有这种…

API低代码平台介绍1-功能概述

API低代码平台之ADI平台 ADI平台是指Application data integration&#xff0c;即“应用数据集成”&#xff0c;使用springboot开发&#xff0c;并通过springcloud实现微服务&#xff0c;是一个动态定义Http API接口的“零代码”或“低代码”平台&#xff0c;支持GET(查)、POST…

Java 实现 YoloV7 人体姿态识别

1 OpenCV 环境的准备 这个项目中需要用到 opencv 进行图片的读取与处理操作&#xff0c;因此我们需要先配置一下 opencv 在 java 中运行的配置。 首先前往 opencv 官网下载 opencv-4.6 &#xff1a;点此下载&#xff1b;下载好后仅选择路径后即可完成安装。 此时将 opencv\b…

30基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序

资源地址&#xff1a; 30基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序资源-CSDN文库 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 仿真平台&#xff1a;MATLAB CPLEXMOSEK/IPOPT 主要内容&#xff1a; 主要做的是…

优思学院|精益生产为企业带来革命性转变的效益

企业的成长和发展需要不断的变革和创新&#xff0c;而精益生产则成为了这个时代的代名词。精益生产不仅仅是一个生产方式&#xff0c;更是一种革命性的转变&#xff0c;为企业带来了无限的效益。 什么是精益生产&#xff1f; 精益生产是一种基于持续改进的生产方式&#xff0…

基于matlab的混合波束成形仿真

一、前言 本示例介绍了混合波束成形的基本概念&#xff0c;并展示了如何仿真此类系统。 二、介绍 现代无线通信系统使用空间复用来提高散射体丰富的环境中系统内的数据吞吐量。为了通过通道发送多个数据流&#xff0c;从通道矩阵中导出一组预编码和组合权重。然后&#xff0c;可…

lammps教程:聚合物压缩,避免“bond atoms missing”

本文介绍聚合物的压缩方法。 lammps模拟聚合物体系时&#xff0c;最常见的一个错误是“bond atoms missing”,其中一个原因是建模方法不对。 这个原理在之前的专栏文章中已经详细介绍。 如果使用ms建模&#xff0c;聚合物的链会伸出到盒子外面&#xff0c;在导出data文件后&…

MindFusion.Diagramming for WinForms 6.8.6

您现在可以指定在修改项目时要显示的视觉效果。 2023 年 4 月 26 日 - 15:55新版本 特征 您现在可以指定在修改项目时要显示的视觉效果。新的 Opacity 属性允许您创建半透明的 DiagramItem。添加了新的 CopySelection 重载&#xff0c;它允许您复制项目列表而无需选择它们。您现…

OrbStack

OrbStack 是一个可以在 macOS 上快速运行 Docker 容器&#xff0c;和 Linux 虚拟机的工具&#xff0c;资源占用率低&#xff0c;高效&#xff0c;快速。 macOS 上的 Parallels Desktop 和 Docker Desktop 一直是饱受诟病&#xff0c;慢、重、资源消耗巨大。OrbStack 的出现就是…

goroutine和channel

进程与线程 进程就是程序执行在操作系统中的一次在执行过程&#xff0c;是系统进行资源分配的基本单位。 线程就是进程的一个执行实例&#xff0c;是程序的最小执行单元&#xff0c;是比进程更小的独立运行的单位。 一个进程可以创建多个线程&#xff0c;同一一个进程中的多…

如何在C中动态分配二维数组

在C语言中如何动态申请连续的二维数组。可以采用多申请一些指针&#xff0c;然后这一些指针分别指向后面数据区中对应的位置&#xff0c;如一个3*4的int类型数组&#xff0c;我们先申请大小为sizeof(int*) * 3 3 * 4 * sizeof(int)的一维数组设为arr。然后arr[0]存放指向arr …

OpenAirInterface通过docker build方式构建images

本文主要讲解如何通过build方式构建各个网元的image&#xff0c;因为直接pull的image无法对其进行更改&#xff0c;而build的镜像可以对其源代码进行编辑更改后生成镜像。 参考链接&#xff1a;OAI build iamges 1.获取正确的网络功能分支 此存储库仅包含教程和持续集成脚本…