最近准备入手 PHP 爬虫,发现 PHP 的 cURL 这一知识点不可越过。本文探讨基础实战,需要提前了解命令行的使用并会进行 PHP 的环境搭建。

cURL 的概念

cURL,Client URL Library Functions,是利用 URL 语法在命令行方式下工作的开源文件传输工具,被广泛应用在 Unix、 Linux 发行版本中,并且有 Win32、Win64 下的移植版本。常用的 cURL 库 libcurl 支持 http、https、ftp、gopher、telnet、dict、file 和 ldap 协议。libcurl 同时也支持 HTTPS 认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies 和用户名+密码的认证。

[图片上传失败...(image-cc9fed-1513766114783)]](http://upload-images.jianshu.io/upload_images/2558748-f4dcbe5d6e4e7097.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

简而言之,cURL 便是客户端发起的,支持绝大多数互联网协议族的,能对网络文件进行下载或上传的管理程式。

命令行下的 cURL 能做什么

爬取网页源代码

打开命令行,输入如下命令,可以向百度服务器发送获取首页源代码的请求,> 命令将源代码输出保存到当前目录的 baidu.html 下。


curl https://www.baidu.com > baidu.html

获取表单 · GET 或 POST 方法

网页中的 <form> 标签常用来生成一个表单。当我们点击表单中的提交按钮时,浏览器会讲所有表单中填入的参数分析并包装,最终用指定的 HTTP 方式发送到目标网络地址。

如下所示代码将用户在输入框填写的参数信息 加入 URL 地址之后,并向目标服务器下的 judge.php 发送 GET 方法。GET 方法中,值和表单内各个字段一一对应。


&lt;form method="GET" action="judge.php"&gt;&lt;input type=text name="year"&gt;&lt;input type=submit name=press value="OK"&gt;
&lt;/form&gt;

GET 方法中的参数会出现在 URL 地址中,因此,我们同样在基于命令行 cURL 下模拟这一点。


curl www.example.com/judge.php?year=1997&amp;press=ok

URL 语法指明,一个通用的 URL 地址格式如下,不难看出,上例代码中的 year 字段及其取值是 <params> 的实例。

&lt;scheme&gt;://&lt;user&gt;:&lt;password&gt;@&lt;host&gt;:&lt;port&gt;/&lt;path&gt;:&lt;params&gt;?&lt;query&gt;#&lt;frag&gt;

与 GET 方法不同的是,HTTP 中的 POST 求求向服务器传送数据,由于常有账号密码等私密信息,这些数据通常加入 HTML Header,而在 URL 地址中不可见,并向目标服务器传送数据。

命令行中 cURL 对 POST 方法的处理方法为 -d 参数。


curl -d "year=1997&amp;press=OK" www.example.com/judge.php

上传文件 · POST 或 PUT 方法

1995年年末,RFC 1867 定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:


&lt;form method="POST" enctype='multipart/form-data' action="upload.php"&gt;&lt;input type=file name=upload&gt;&lt;input type=submit name=press value="OK"&gt;
&lt;/form&gt;

对应的 cURL 命令中用 -F 作为命令参数如下。


curl -F upload=@localfilename -F press=OK URL

HTTP协议文件上传的标准方法是使用 PUT,此时 cURL 命令使用 -T 参数:


curl -T uploadfile www.uploadhttp. com/receive.php

伪装成指定的客户端

有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。此时curl可以把自己“伪装”成任何其他浏览器:


curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" URL

这个指令表示 cURL 伪装成了 IE5.0,用户平台是 Windows 2000。


curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" URL

此时 cURL 变成了 Netscape,运行在 PIII 平台的 Linux 上了。

以及更多

正如 cURL 的概念一节所说,cURL 的功能除了请求网页、上传文件和伪装,还包括携带 cookie 访问目标服务器(参数 -b)、访问加密的 HTTP 页面(HTTPS)、用本地证书访问需要证书认证的 HTTP 地址(参数 -E)、授权、断点续传、设置代理与网络限速等等,所有网络上的资源都可以用 cURL 访问和下载到。

在 PHP 中使用 cURL

PHP 支持的由 Daniel Stenberg 创建的 libcurl 库允许我们与各种的服务器使用各种类型的协议进行连接和通讯。

为了使用 cURL 函数你需要安装 cURL 包。PHP 需要我们使用 cURL 7.0.2-beta 或更高版。如果 cURL 的版本低于 7.0.2-beta,PHP 将不工作。

要使用 PHP 的 CURL 支持,我们必须用带有 --with-curl[=DIR] 参数重新编译 PHP ( DIR 是包含库和头文件的目录)。

在之前讲到的命令行下 cURL 的实现,我们不难理解 PHP 中 cURL 函数:首先使用 curl_init() 函数初始化 cURL 会话,而后可以设置有关此次 cURL 过程的所有选项,通过 curl_exec() 函数执行,最后我们可以用 curl_close() 函数来结束当前会话,节省资源。以下是慕课网上有关 PHP 中 cURL 过程的图解。

[图片上传失败...(image-1c28eb-1513766114784)]](http://upload-images.jianshu.io/upload_images/2558748-d0b8cacdffe9766e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

安装 cURL

Mac 下自带的 PHP 环境对 cURL 提供了良好的支持。如果不是 Macintosh,或许这些能有所帮助:

通用 Linux 下的 cURL 安装

获得安装包,从网上直接下载或者其他途径,这里直接 wget


# wget http://curl.haxx.se/download/curl-7.17.1.tar.gz

解压到当前目录并进入


# tar -zxf curl-7.17.1.tar.gz &amp; cd curl-7.17.1

配置,指定安装的目录,这里是 “/usr/local/curl”


# ./configure –prefix=/usr/local/curl

编译并安装


# make  &amp; make install

安装完毕,将 curl 命令加入环境变量中。


# export PATH=$PATH:/usr/local/curl/bin

Ubuntu 小的 cURL 安装

Ubuntu 自带的 apt-get 包管理器可以帮我们解决一切依赖。


sudo apt-get install curl libcurl3 libcurl3-dev php5-curl

然后重启服务器,这里是 apache 服务器。


sudo /etc/init.d/apache2 restart

Windows 下的拓展

在 Windows 下安装好 PHP 后,将PHP文件夹下的三个文件php_curl.dll , libeay32.dll , ssleay32.dll 复制到system32下,再将php.ini (c:WINDOWS 目录下) 中的 ;extension=php_curl.dll 中的分号去掉后,重启服务器即可。

开始实战

这里从简单到较为复杂的小 Demo ,循序渐进。

用 cURL 做一个简单的网页爬虫

将如下 PHP 代码保存为 example1.php,并在命令行中执行。


&lt;?php$curl = curl_init("https://www.baidu.com");curl_exec($curl);curl_close($curl);
?&gt;

php -f example1.php &gt; baidu1.html

open baidu1.html

用 cURL 抓去网页信息并替换部分内容

将如下 PHP 代码保存为 example2.php,并在命令行中执行。


&lt;?php$curlobj = curl_init();curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com");curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // 只是下载页面内容,不直接
打印$output = curl_exec($curlobj);echo str_replace("百度", "谷歌", $output); // 将“百度”替换为"谷歌"
?&gt;

php -f example2.php &gt; baidu2.html

open baidu2.html

用 cURL 获取天气信息

将如下 PHP 代码保存为 example2.php,并在命令行中执行。


&lt;?php$data = "theCityName=西安";$curlobj = curl_init();curl_setopt($curlobj, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName");curl_setopt($curlobj, CURLOPT_HEADER, 0); // 不显示 Headercurl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); // 只是下载页面内容,不直接打印curl_setopt($curlobj, CURLOPT_POST, 1); // 此请求为 post 请求curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data); // 传递 post 参数curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8","Content-length: ".strlen($data))); // 设置 HTTP Headercurl_setopt($curlobj, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'); // 伪造一个 HTTP_USER_AGENT 信息,解决为将对象引用设置到对象的实例问题$rtn = curl_exec($curlobj);if(!curl_errno($curlobj)) {// $info = curl_getinfo($curlobj);// print_r($info);echo $rtn;} else {echo 'Curl error: ' . curl_error($curlobj);}
?&gt;

php -f example2.php &gt; weather.html

open weather.html

本文介绍了 cURL 的基础知识和 PHP 中 cURL 的基础实战,对于更高阶的用法,尽请期待。

  • Hello,我是韩亦乐,现任本科软工男一枚。软件工程专业的一路学习中,我有很多感悟,也享受持续分享的过程。如果想了解更多或能及时收到我的最新文章,欢迎订阅我的个人微信号:韩亦乐。我的简书个人主页中,有我的订阅号二维码和 Github 主页地址;我的知乎主页 中也会坚持产出,欢迎关注。
  • 本文内部编号经由我的 Github 相关仓库统一管理;本文可能发布在多个平台但仅在上述仓库中长期维护;本文同时采用【知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议】进行许可。

原文地址:https://www.jianshu.com/p/95b4858f0aa4

PHP 中的 cURL 爬虫实战基础相关推荐

  1. Python爬虫实战基础篇

    以下是一个示例程序,用于爬取京东电脑商品信息:首先,我们需要确认爬取的网站地址.在本例中,我们要爬取的是京东电脑商品信息,因此我们需要找到京东网站的搜索页面地址 https://search.jd.c ...

  2. python爬虫——实战篇

    python爬虫--实战篇 2021.7.20晚已更新 注:注释和说明已在代码中注释 python爬虫实战篇 笔趣阁小说及其网址爬取 4k图片网站图片爬取 简历模板爬取 自动填体温小程序 待补充 笔趣 ...

  3. python爬取喜马拉雅_Python爬虫实战案例之爬取喜马拉雅音频数据详解

    这篇文章我们来讲一下在网站建设中,Python爬虫实战案例之爬取喜马拉雅音频数据详解.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 喜马拉雅是专业的音频分享平台,汇集 ...

  4. python基础笔记,超详细,包含面向对象基础,爬虫实战【持续更新中...】

    前言: 本笔记中的函数和方法同义,面向python3 本笔记部分概念及代码由newbing搜集整理得出 本笔记适合有一定其他编程语言基础的同学,因为笔记中省略了部分基础概念(比如整型,浮点型等基本数据 ...

  5. qq纵横四海源码_【0基础】纵横中文网python爬虫实战

    原文在此~ [0基础]纵横中文网python爬虫实战​mp.weixin.qq.com 大家好,我是你们的机房老哥! 在粉丝群的日常交流中,爬虫是比较常见的话题.python最强大的功能之一也是爬虫. ...

  6. python基础代码大全-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)

    WechatSogou[1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典.[1]: https://github ...

  7. 基础爬虫实战案例之获取游戏商品数据

    文章目录 前言 一.爬虫是什么? 二.爬虫实战案例 1.引入库 2.请求网页处理 3.生成访问链接 4.读入数据到mongodb 5.获得数据 6.加入多线程 总结 前言 在想获取网站的一些数据时,能 ...

  8. 数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

    未经允许,请勿转载. 连载未完成状态 网址: [数据挖掘]2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili ...

  9. ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...

    ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性 <%@ Page Language="C#" Auto ...

  10. [爬虫实战]利用python快速爬取NCBI中参考基因组assembly的相关信息

    1.问题导向 最近在做某个课题的时候,按老师的要求需要从NCBI中批量下载不同物种的参考基因组,同时收集相应参考基因组的一些组装信息,基因组非常多,导致工作量巨大,一个一个手动收集的话,既费时又费力, ...

最新文章

  1. 命令行运行Python脚本时传入参数的三种方式
  2. yii2框架随笔29
  3. JS中简单原型的使用
  4. 利用Bandwidth Splitter限制带宽
  5. 易语言 图片插入超级列表框_是谁说图片排版很难?掌握这4个PPT图片排版技巧,1分钟全部搞定...
  6. 字符串操作之字符串连接
  7. 读书笔记_Effective_C++_条款十九:设计class犹如设计type
  8. javascript之嵌套函数
  9. 基于Cmail的邮件收发限制说明
  10. ubuntu 13.04安装注意事项和ROOT密码设置
  11. 10月份出版图书《玩转虚拟机基于VMware+Windows》
  12. java实现人脸识别(附源码)
  13. 卸载vuecli3_针对遇到安装或卸载vue-cli失败的解决方案
  14. java一元二次方程用if_用javascript写一个求一元二次方程的页面 用JAVA写一个求解一元二次方程的类...
  15. 【MATLAB】矩阵运算
  16. linux环境下questasim 10.7的安装总结
  17. Python爬虫,爬取快看漫画每日更新模块
  18. gnuplot命令大全
  19. 调取创蓝253国际短信验证码-代码示例2
  20. 工资计算器读写数据文件

热门文章

  1. 2019 计蒜之道 初赛 第一场(A. 商汤的AI伴游小精灵)
  2. html图片自动变大,使用CSS自动调整浏览器大小的图像大小
  3. 使用kodexplorer搭建私人云存储服务器
  4. [转]斗鱼大数据搭建的经验和坑
  5. move是MySQL命令_MOVE命令_视频讲解_用法示例-redis编程词典-php中文网
  6. rdt 可靠数据传输协议
  7. 计算机实验三——Rdt协议对比
  8. Vue2.x+Element UI 密码规则组件封装
  9. 蓝湖 Axure 墨刀
  10. vue实现列表无缝滚动