PHP 爬蟲體驗(一) - 使用dom-crawler和guzzle實現基本的爬蟲


網絡爬蟲在大數據時代可以非常高效地自動進行數據的收集處理,而傳統爬蟲最簡單也是最基本的功能實現原理即是下載網頁,然后通過抽取頁面元素來達到收集信息的目的。

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
        )

)

得到這樣格式化的數據就很方便進行進一步的處理了,而最基礎的爬蟲功能也就實現了,實際上是非常簡單的。


免責聲明!

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



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