最近准备入手 PHP 爬虫,发现 PHP 的 cURL 这一知识点不可越过。本文探讨基础实战,须要提早了解命令行的使用并会进行 PHP 的环境搭建。php
cURL,Client URL Library Functions,是利用 URL 语法在命令行方式下工做的开源文件传输工具,被普遍应用在 Unix、 Linux 发行版本中,而且有 Win3二、Win64 下的移植版本。经常使用的 cURL 库 libcurl 支持 http、https、ftp、gopher、telnet、dict、file 和 ldap 协议。libcurl 同时也支持 HTTPS 认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能经过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies 和用户名+密码的认证。html
[图片上传失败...(image-cc9fed-1513766114783)]](//upload-images.jianshu.io/upload_images/2558748-f4dcbe5d6e4e7097.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)git
简而言之,cURL 即是客户端发起的,支持绝大多数互联网协议族的,能对网络文件进行下载或上传的管理程式。github
打开命令行,输入以下命令,能够向百度服务器发送获取首页源代码的请求,>
命令将源代码输出保存到当前目录的 baidu.html 下。web
curl https://www.baidu.com > baidu.html
网页中的 <form> 标签经常使用来生成一个表单。当咱们点击表单中的提交按钮时,浏览器会讲全部表单中填入的参数分析并包装,最终用指定的 HTTP 方式发送到目标网络地址。apache
以下所示代码将用户在输入框填写的参数信息 加入 URL 地址以后,并向目标服务器下的 judge.php 发送 GET 方法。GET 方法中,值和表单内各个字段一一对应。网页爬虫
<form method="GET" action="judge.php"> <input type=text name="year"> <input type=submit name=press value="OK"> </form>
GET 方法中的参数会出如今 URL 地址中,所以,咱们一样在基于命令行 cURL 下模拟这一点。浏览器
curl www.example.com/judge.php?year=1997&press=ok
URL 语法指明,一个通用的 URL 地址格式以下,不难看出,上例代码中的 year 字段及其取值是 <params> 的实例。服务器
<scheme>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
与 GET 方法不一样的是,HTTP 中的 POST 求求向服务器传送数据,因为常有帐号密码等私密信息,这些数据一般加入 HTML Header,而在 URL 地址中不可见,并向目标服务器传送数据。微信
命令行中 cURL 对 POST 方法的处理方法为 -d
参数。
curl -d "year=1997&press=OK" www.example.com/judge.php
1995年年底,RFC 1867 定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:
<form method="POST" enctype='multipart/form-data' action="upload.php"> <input type=file name=upload> <input type=submit name=press value="OK"> </form>
对应的 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 支持的由 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)]](//upload-images.jianshu.io/upload_images/2558748-d0b8cacdffe9766e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Mac 下自带的 PHP 环境对 cURL 提供了良好的支持。若是不是 Macintosh,或许这些能有所帮助:
得到安装包,从网上直接下载或者其余途径,这里直接 wget
# wget http://curl.haxx.se/download/curl-7.17.1.tar.gz
解压到当前目录并进入
# tar -zxf curl-7.17.1.tar.gz & cd curl-7.17.1
配置,指定安装的目录,这里是 “/usr/local/curl”
# ./configure –prefix=/usr/local/curl
编译并安装
# make & make install
安装完毕,将 curl 命令加入环境变量中。
# export PATH=$PATH:/usr/local/curl/bin
Ubuntu 自带的 apt-get 包管理器能够帮咱们解决一切依赖。
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
而后重启服务器,这里是 apache 服务器。
sudo /etc/init.d/apache2 restart
在 Windows 下安装好 PHP 后,将PHP文件夹下的三个文件php_curl.dll , libeay32.dll , ssleay32.dll 复制到system32下,再将php.ini (c:WINDOWS 目录下) 中的 ;extension=php_curl.dll
中的分号去掉后,重启服务器便可。
这里从简单到较为复杂的小 Demo ,按部就班。
将以下 PHP 代码保存为 example1.php,并在命令行中执行。
<?php $curl = curl_init("https://www.baidu.com"); curl_exec($curl); curl_close($curl); ?>
php -f example1.php > baidu1.html
open baidu1.html
将以下 PHP 代码保存为 example2.php,并在命令行中执行。
<?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); // 将“百度”替换为"谷歌" ?>
php -f example2.php > baidu2.html
open baidu2.html
将以下 PHP 代码保存为 example2.php,并在命令行中执行。
<?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); // 不显示 Header curl_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 Header curl_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); } ?>
php -f example2.php > weather.html
open weather.html
本文介绍了 cURL 的基础知识和 PHP 中 cURL 的基础实战,对于更高阶的用法,尽请期待。
- Hello,我是韩亦乐,现任本科软工男一枚。软件工程专业的一路学习中,我有不少感悟,也享受持续分享的过程。若是想了解更多或能及时收到个人最新文章,欢迎订阅个人我的微信号:韩亦乐。个人简书我的主页中,有个人订阅号二维码和 Github 主页地址;个人知乎主页 中也会坚持产出,欢迎关注。
- 本文内部编号经由个人 Github 相关仓库统一管理;本文可能发布在多个平台但仅在上述仓库中长期维护;本文同时采用【知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议】进行许可。
![]()
原文地址:https://www.jianshu.com/p/95b4858f0aa4