網絡爬蟲在大數據時代可以非常高效地自動進行數據的收集處理,而傳統爬蟲最簡單也是最基本的功能實現原理即是下載網頁,然后通過抽取頁面元素來達到收集信息的目的。
PHP作為一門靈活易用的腳本語言,實現這些功能自然是不在話下的。
這里實現爬蟲基於兩個組件:
guzzle:最好用的PHP HTTP客戶端,用來進行爬取頁面的請求,異步請求和並發請求功能可以用來實現一些后期的擴展功能。
dom-crawler:symphony的Dom分析組件,可以用來分析HTML頁面Dom元素和XML文件,用來進行頁面分析。
兩個組件在項目中都可以很方便地使用composer進行安裝,這里以博客園的文章為例,使用這兩個組件實現最簡單的頁面抓取,抓取我個人博客園首頁的文章摘要和鏈接。
代碼如下:
1 require_once __DIR__ . '/vendor/autoload.php'; 2 3 use GuzzleHttp\Client; 4 use Symfony\Component\DomCrawler\Crawler; 5 6 run(); 7 function run() 8 { 9 //要爬取的頁面地址為我的博客園主頁 10 $url = "http://www.cnblogs.com/jackiebao/"; 11 //偽造瀏覽器UA 12 $headers = [ 13 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 14 ]; 15 $client = new Client([ 16 'timeout' => 20, 17 'headers' => $headers 18 ]); 19 //發送請求獲取頁面內容 20 $response = $client->request('GET', $url)->getBody()->getContents(); 21 22 $data = []; 23 $crawler = new Crawler(); 24 $crawler->addHtmlContent($response); 25 26 //使用crawler進行頁面內容分析 27 try{ 28 //這里使用的是xpath語法,輪詢forFlow子類day中的元素,既頁面上每一篇文章的塊狀元素,並且進行內容獲取 29 $crawler->filterXPath('//div[contains(@class, "forFlow")]/div[contains(@class, "day")]')->each(function(Crawler $node, $i) use (&$data){ 30 $item = [ 31 'date' => $node->filterXPath('//div[contains(@class, "dayTitle")]/a')->text(), 32 'title' => $node->filterXPath('//div[contains(@class, "postTitle")]/a')->text(), 33 'abstract' => $node->filterXPath('//div[contains(@class, "postCon")]/div')->text(), 34 'url' => $node->filterXPath('//div[contains(@class, "postCon")]/div/a')->attr('href'), 35 ]; 36 $data[] = $item; 37 }); 38 }catch (\Exception $e){ 39 echo $e->getMessage() . PHP_EOL; 40 } 41 //打印結果 42 print_r($data); 43 }
打印出來的結果為:
Array ( [0] => Array ( [date] => 2018年4月27日 [title] => windows環境下給PHP增加rdkafka擴展 [abstract] => 摘要: 因為工作需要kafka作為消息中間件,所以在本地開發環境進行測試的時候需要給PHP添加rdkafka擴展,使用PHP作為producer或者cosumer,在此紀錄一下rdkafka的安裝過程。 擴展下載地址:http://pecl.php.net/package/rdkafka 根據自身PHP版本閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/8962804.html ) [1] => Array ( [date] => 2018年2月24日 [title] => 在亞馬遜aws服務器上添加Google BBR支持 [abstract] => 摘要: 參考文章: https://51.ruyo.net/2783.html http://blog.csdn.net/VgFengYe/article/details/78609040 官方 quick start文檔:https://github.com/google/bbr/blob/master/閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/8466232.html ) [2] => Array ( [date] => 2018年2月22日 [title] => PHP static關鍵字和self關鍵字的區別 [abstract] => 摘要: 在PHP的一個類中,帶有static關鍵字的方法和屬性被稱為靜態方法和靜態屬性,這樣的方法和屬性可以通過類直接訪問,而不需要通過類對應的實例來進行訪問,在類中訪問靜態變量以及靜態屬性的時候,可以使用self關鍵字和static關鍵字,兩種訪問方式看起來似乎沒有區別,但是實際上還是不一樣的 運行之后的閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/8459899.html ) [3] => Array ( [date] => 2018年2月6日 [title] => linux系統mysql忘記密碼處理 [abstract] => 摘要: 最近開始重新拾掇自己優惠時貪便宜買的一台京東雲主機,然而早已經將當年集成環境一鍵安裝時設置的mysql密碼給忘了。 於是度娘了解決辦法,大致分為以下步驟: 結果執行之后報這個錯誤 “Unknown column 'password' in 'field list'”。 后查詢得知mysql在5.7版閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/8424672.html ) [4] => Array ( [date] => 2018年1月25日 [title] => PHP7 新增加的兩種運算符 [abstract] => 摘要: 太空艙運算符: 空合並運算符:閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/8352383.html ) [5] => Array ( [date] => 2017年4月25日 [title] => PHP trait 特性 [abstract] => 摘要: trait是PHP自5.4版本之后加入的一種新的代碼復用機制,是一種細粒度代碼復用的方法。官方文檔對於trait給出的解釋是: 自 PHP 5.4.0 起,PHP 實現了一種代碼復用的方法,稱為 trait。 Trait 是為類似 PHP 的單繼承語言而准備的一種代碼復用機制。Trait 為了減少單閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/6763388.html ) [6] => Array ( [date] => 2017年1月23日 [title] => PHP 字符串拆分函數 [abstract] => 摘要: function str_split_utf8($str) { $split = 1; $array = array(); for ($i = 0; $i 127) { if ($value >= 192 && $value = 224 && $value = 240 && $value <= 247) { ...閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/6344173.html ) [7] => Array ( [date] => 2016年10月25日 [title] => Windows 環境下php安裝openssl證書 [abstract] => 摘要: 新的電腦安裝了PHP、設置好環境變量之后安裝了composer,想要通過composer安裝Yii2,結果出現了如下報錯: 檢查發現php.ini里面的extension=php_openssl.dll已開啟,如提示所說問題的原因是證書認證失敗。 解決方法: http://curl.haxx.se/閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/5996770.html ) [8] => Array ( [date] => 2016年7月21日 [title] => PHP 按照多個鍵值給數組分組合並 [abstract] => 摘要: 簡介: $array 為一堆數組,各數組鍵值為固定 $keys為分組依據,在$array中按照$keys所指定的鍵值將數組分組,並且將除$keys指定鍵值對應的值以外的值合並 輸出:閱讀全文 [url] => https://www.cnblogs.com/jackiebao/p/5691094.html ) )
得到這樣格式化的數據就很方便進行進一步的處理了,而最基礎的爬蟲功能也就實現了,實際上是非常簡單的。