PHP爬蟲技術(一)

摘要:本篇文章介紹PHP抓取網頁內容技術,利用PHP cURL擴展獲取網頁內容,還能夠抓取網頁頭部,設置cookie,處理302跳轉。php

1、cURL安裝css

採用源碼安裝PHP時,須要在configure時添加配置項,html

cd phpchrome

./configure --with-curl瀏覽器

安裝完畢,能夠利用php -m命令查看,是否已經支持cURL擴展。安全

php -m | grep curlcookie

也能夠利用phpinfo查看,是否已經支持cURL擴展。網絡

 

 

2、獲取網頁內容curl

cURL支持不少網絡協議,如HTTPHTTPSFTP等。普通網頁採用HTTP協議,一些安全性高的網頁採用HTTPSHTTPS協議採用數據加密技術,經過公鑰技術交換密鑰,加密傳輸內容。所以採用HTTPS協議的網頁,在整個鏈路上傳輸的都是加密後的數據。例如Baidu採用HTTPS協議,你輸入的關鍵字被網絡傳輸協議加密,即便是運營商能夠得到所有數據,也沒法得到數據的內容。HTTPS協議也有缺點,就是加解密須要耗費計算時間,所以HTTPS網站會慢一些,而大多數網站都是採用HTTP協議)。HTTP協議中,定義了兩種方法GETPOSTPOST方法一般用於表單提交,可以提交文件等大數據。GET方法用來獲取網頁數據,也能夠提交少許數據。本文主要介紹利用GET協議獲取網頁數據,未來再詳細講解cURL POST技術。工具

咱們先看一些瀏覽器是怎麼工做的,打開chrome瀏覽器,F12進入開發者模式,將工具欄切換到network,以下圖,利用chrome工具能夠查看每一個文件的傳輸信息。

瀏覽器要加載一個網頁,首先下載html文件,再下載jscss、圖片等資源文件再進行渲染加載。一般數據抓取只須要抓取html文件,下圖是chrome工具顯示下載http文件的內容。

 

3、PHP實現 

<?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);
?>

基本設置,返回網頁內容。

4、得到HTTP頭部設置cookie

有些網站,會採用cookie技術。當採集程序沒帶有相關cookie時,很容易被網站認定是「機器人」,拒絕對其服務。經過chrome調試www.sogou.com,發現cookie是包含在網頁頭信息中的。所以,咱們須要兩個步驟(1HTTP頭信息中獲取cookie2)發送請求時添加cookie

頭信息包含設置cookie

 

刷新網頁,查看頭信息,請求包含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) {
      // 第一個參數是curl資源,第二個參數是每一行獨立的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;
?>

 

返回結果

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

設置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);

?>

5、抓取302跳轉

在Baidu中搜索關鍵詞,返回的結果連接是一個Baidu加密過的連接,經過二次跳轉纔是真正的網址。(Baidu爲了防止360抓取,把結果都加密了)。

咱們能夠抓取頭部中的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) {
      // 第一個參數是curl資源,第二個參數是每一行獨立的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跳轉還有另一種方式,利用ob重定向流的方式,而且設置容許curl跳轉到新地址。代碼以下

<?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);  //能沒法 抓取跳轉後的頁面
      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; 
?>
相關文章
相關標籤/搜索