PHP 中的 cURL 爬蟲實戰基礎

最近準備入手 PHP 爬蟲,發現 PHP 的 cURL 這一知識點不可越過。本文探討基礎實戰,須要提早了解命令行的使用並會進行 PHP 的環境搭建。php

cURL 的概念

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

命令行下的 cURL 能作什麼

爬取網頁源代碼

打開命令行,輸入以下命令,能夠向百度服務器發送獲取首頁源代碼的請求,> 命令將源代碼輸出保存到當前目錄的 baidu.html 下。web

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

獲取表單 · GET 或 POST 方法

網頁中的 <form> 標籤經常使用來生成一個表單。當咱們點擊表單中的提交按鈕時,瀏覽器會講全部表單中填入的參數分析幷包裝,最終用指定的 HTTP 方式發送到目標網絡地址。apache

以下所示代碼將用戶在輸入框填寫的參數信息 加入 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)]](//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); // 不顯示 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);
    }
?&gt;
php -f example2.php &gt; weather.html
open weather.html

本文介紹了 cURL 的基礎知識和 PHP 中 cURL 的基礎實戰,對於更高階的用法,盡請期待。

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

相關文章
相關標籤/搜索