php爬蟲入門


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

一、cURL安裝

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

cd php

./configure --with-curl

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

php -m | grep curl

也可以利用phpinfo查看,是否已經支持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文件的內容。

 

三、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); ?>
復制代碼

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

四、獲得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); ?>
復制代碼

五、抓取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; ?>
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM