国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP爬蟲技術(shù)(一)

2020-03-22 19:44:36
字體:
供稿:網(wǎng)友
  • 摘要:本篇文章介紹PHP抓取網(wǎng)頁內(nèi)容技術(shù),利用PHPcURL擴展獲取網(wǎng)頁內(nèi)容,還可以抓取網(wǎng)頁頭部,設(shè)置cookie,處理302跳轉(zhuǎn)。

    一、cURL安裝

    采用源碼安裝PHP時,需要在configure時添加配置項,

    cdphp

    ./configure--with-curl

    安裝完畢,可以利用php-m命令查看,是否已經(jīng)支持cURL擴展。

    php-m|grepcurl

    也可以利用phpinfo查看,是否已經(jīng)支持cURL擴展。

    二、獲取網(wǎng)頁內(nèi)容

    cURL支持很多網(wǎng)絡(luò)協(xié)議,如HTTP、HTTPS、FTP等。普通網(wǎng)頁采用HTTP協(xié)議,一些安全性高的網(wǎng)頁采用HTTPS(HTTPS協(xié)議采用數(shù)據(jù)加密技術(shù),通過公鑰技術(shù)交換密鑰,加密傳輸內(nèi)容。因此采用HTTPS協(xié)議的網(wǎng)頁,在整個鏈路上傳輸?shù)亩际羌用芎蟮臄?shù)據(jù)。例如Baidu采用HTTPS協(xié)議,你輸入的關(guān)鍵字被網(wǎng)絡(luò)傳輸協(xié)議加密,即使是運營商可以獲得全部數(shù)據(jù),也無法獲得數(shù)據(jù)的內(nèi)容。HTTPS協(xié)議也有缺點,就是加解密需要耗費計算時間,因此HTTPS網(wǎng)站會慢一些,而大多數(shù)網(wǎng)站都是采用HTTP協(xié)議)。HTTP協(xié)議中,定義了兩種方法GET和Z喎?http://www.it165.net/pro/pkqt/" target="_blank" html' target='_blank'>class="keylink">QT1NUoaNQT1NUt723qM2os6PTw9Pase21pczhvbujrMTcubvM4b27zsS8/rXItPPK/b7doaNHRVS3vbeo08PAtLvxyKHN+NKzyv2+3aOs0rK/ydLUzOG9u8nZwb/K/b7doaOxvs7E1vfSqr3pydzA+9PDR0VU0K3S6bvxyKHN+NKzyv2+3aOsvavAtNTZz+rPuL2yveJjVVJMJm5ic3A7UE9TVLy8yvWhozwvcD4KPHA+ztLDx8/Iv7TSu9Cp5K/AwMb3ysfU9cO0uaTX97XEo6y08r+qY2hyb21l5K/AwMb3o6xGMTK9+Mjrv6q3otXfxKPKvaOsvau5pL7fwLjH0Lu7tb1uZXR3b3Jro6zI58/CzbyjrMD708NjaHJvbWW5pL7fv8nS1LLpv7TDv7j2zsS8/rXEtKvK5NDFz6KhozwvcD4KPHA+PGltZyBzcmM9"http://www.it165.net/uploadfile/files/2015/0605/20150605193650340.png" alt="" width="842" height="577" />

    瀏覽器要加載一個網(wǎng)頁,首先下載html文件,再下載js、css、圖片等資源文件再進行渲染加載。通常數(shù)據(jù)抓取只需要抓取html文件,下圖是chrome工具顯示下載http文件的內(nèi)容。

    三、PHP實現(xiàn)

    <?php$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "www.qq.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$html = curl_exec($ch);curl_close($ch);var_dump($html);?>

    基本設(shè)置,返回網(wǎng)頁內(nèi)容。

    四、獲得HTTP頭部設(shè)置cookie

    有些網(wǎng)站,會采用cookie技術(shù)。當(dāng)采集程序沒帶有相關(guān)cookie時,很容易被網(wǎng)站認定是“機器人”,拒絕對其服務(wù)。通過chrome調(diào)試www.sogou.com,發(fā)現(xiàn)cookie是包含在網(wǎng)頁頭信息中的。因此,我們需要兩個步驟(1)HTTP頭信息中獲取cookie(2)發(fā)送請求時添加cookie。

    頭信息包含設(shè)置cookie,

    刷新網(wǎng)頁,查看頭信息,請求包含cookie信息

    獲取cookie

    <?php    $url = "www.sogou.com";    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_NOBODY, true);    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$setcookie) {      // 第一個參數(shù)是curl資源,第二個參數(shù)是每一行獨立的header!      list ($name, $value) = array_map('trim', explode(':', $str, 2));      $name = strtolower($name);      if('set-cookie'==$name)      {        $setcookie[]=$value;      }      return strlen($str);    });    curl_exec($ch);    curl_close($ch);    $cookie = array();    foreach($setcookie as $c)    {      $tmp = explode(";",$c);      $cookie[] = $tmp[0];    }    $cookiestr = "Cookie:".implode(";", $cookie);    echo $cookiestr;?>

    返回結(jié)果

    Cookie:ABTEST=0|1433425917|v17;IPLOC=CN1100;SUID=3295CB6F1220920A00000000557057FD

    設(shè)置cookie

    <?php$url = "www.sogou.com";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$headers[] = $cookie;curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);$html = curl_exec($ch);curl_close($ch);var_dump($html);?>

    五、抓取302跳轉(zhuǎn)

    在Baidu中搜索關(guān)鍵詞,返回的結(jié)果鏈接是一個Baidu加密過的鏈接,通過二次跳轉(zhuǎn)才是真正的網(wǎng)址。(Baidu為了防止360抓取,把結(jié)果都加密了)。

    我們可以抓取頭部中的location信息找到真實地址,

    <?php    $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8";    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_NOBODY, true);    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$location) {      // 第一個參數(shù)是curl資源,第二個參數(shù)是每一行獨立的header!        list ($name, $value) = array_map('trim', explode(':', $str, 2));        $name = strtolower($name);        if('location'==$name)        {          $location = $value;          return 0;        }        return strlen($str);    });    curl_exec($ch);    curl_close($ch);    echo $location;?>

    抓取302跳轉(zhuǎn)還有另外一種方式,利用ob重定向流的方式,并且設(shè)置允許curl跳轉(zhuǎn)到新地址。代碼如下

    <?php      function getContents($url){       $header = array("Referer: http://www.baidu.com/");       $ch = curl_init();       curl_setopt($ch, CURLOPT_URL, $url);       curl_setopt($ch, CURLOPT_TIMEOUT, 30);       curl_setopt($ch, CURLOPT_HTTPHEADER,$header);       curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);  //能無法 抓取跳轉(zhuǎn)后的頁面      ob_start();       curl_exec($ch);       $contents = ob_get_contents();       ob_end_clean();       curl_close($ch);       return $contents;       }       $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&amp;wd=&amp;eqid=c89cf372000002cc0000000255705961&amp;ie=utf-8";      $contents = getContents($url);      echo $contents; ?>
    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 文水县| 南丰县| 宁武县| 深泽县| 奇台县| 汉阴县| 台中县| 丰县| 万安县| 阜康市| 凉城县| 增城市| 龙陵县| 商都县| 瑞昌市| 南阳市| 遂平县| 宜昌市| 巴彦淖尔市| 蒲江县| 瑞金市| 宜川县| 灵山县| 肇州县| 侯马市| 辽阳市| 安岳县| 凌海市| 宁远县| 大竹县| 赣榆县| 兰坪| 塔城市| 绥江县| 九江市| 石渠县| 平乡县| 莆田市| 汉源县| 金堂县| 禹城市|