Laravel 手動搭建簡單的資料爬蟲

GitPush發表於2019-11-28

很多爬蟲都是使用 python 來寫的,其優勢是能簡單模仿各種請求,以及對文件解析有比較好的支援。

對PHP來說,寫一個爬蟲就有些麻煩了,不過也有很多強大的第三方庫來支撐。

比較知名的PHP爬蟲框架

phpspider

git 地址

https://github.com/owner888/phpspider

文件地址

https://doc.phpspider.org

其優點是,簡單配置就能直接執行,使用 xPath 選擇器一般能獲取想要的資訊。支援多程式,使用redis能支援斷點採集。自動掃描列表頁匹配規則連結,自動化比較好。

缺點是如果是採集比較大型網站,很容易被反爬蟲機制識別,導致無法獲取資料。對Ajax資料沒有比較好的處理方案,特別是使用POST方式獲取資料。

總結:適合爬取靜態頁面,沒有反爬蟲機制的中小型網站。

PHP Selenium

文件地址

https://www.kancloud.cn/wangking/selenium/...

嚴格來說,這並不屬於爬蟲。Selenium 是一款前端自動化測試框架。可以使用各種語言來執行 JS 指令碼來模擬使用者訪問介面。

比如提交,驗證,點選等等操作事件。因為模模擬實操作來執行資料收集,所以能很好的應對很多反爬蟲機制,也是很多人比較喜歡的工具。

其優點是,完美模仿使用者行為,能繞過一般反爬蟲機制。對資料來源沒有要求,只要是在頁面渲染的資料,都能獲取。表單填寫,註冊驗證也相對比較簡單。

缺點是,需要模擬執行瀏覽器,消耗資源過大。需要寫比較多的模擬操作程式碼來模擬行為。如果操作過於頻繁,也會觸發網站的機器人驗證。

總結:適合少量資料爬取,或者比較深層跳轉的頁面資料抓取。

自己手動寫一個爬蟲

PHP並不是特別適合做專業的爬蟲工具,但是如果上面兩款你都不太滿意,那就手動來寫一款簡易爬蟲吧,優點是能應對各種資料型別,能抓取任何你想抓取的頁面,缺點當然也很明顯,自動化程度並不是很高。

第一步,選擇你喜歡的 PHP 框架,我們這裡當然選擇 Laravel

第二部,安裝兩個必要的庫

Goutte 以及 Guzzle

composer require fabpot/goutte
composer require guzzlehttp/guzzle:~6.0

Goutte git 地址

https://github.com/FriendsOfPHP/Goutte

Guzzle git 地址

https://github.com/guzzle/guzzle

Guzzle 文件地址

https://guzzle-cn.readthedocs.io/zh_CN/lat...

Guzzle 庫是一套強大的 PHP HTTP 請求套件,能模擬各種請求,例如GET,POST,PUT等,如果你只是用來獲取請求的連結內容,例如json字串,頁面的文字資訊,那它就足夠了。

基本使用方法如下

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request as GuzzleRequest;

public function index()
{
    $url = "https://www.hao123.com/";
    $request = new GuzzleRequest('GET', $url);
    $response = $client->send($request, ['timeout' => 5]);
    $content = $response->getBody()->getContents();
    echo $content;
}

其他高階用法請參考文件。

Goutte 庫 其實依賴了 Guzzle 以及 DomCrawler

其原理是抓回來的頁面資料使用 DomCrawler 來處理,基本爬蟲也就是依靠這個來獲取資料。

use Goutte\Client as GoutteClient;

public function index()
{
    $client = new GoutteClient();
    $url = 'https://www.hao123.com/';
    $crawler = $client->request('GET', $url);
    //hao123 導航分類
    $navs = $crawler->filter('#menus')->html();
    echo $navs;
}

這段程式碼會返回 id 為 menus 的 html 結構,對的,它的filter選擇器和Jquery一樣,可以支援巢狀以及 each 迴圈,具體參考文件,我再貼一個迴圈程式碼

public function index()
{
    $client = new GoutteClient();
    $url = 'https://www.hao123.com/';
    $crawler = $client->request('GET', $url);
    //hao123 導航分類
    $navs = $crawler->filter('#menus li');

    $navs->each(function ($node) {
        echo $node->text().'<br>';
    });
}

可以列印出該導航下的 li 標籤內的每一個選項。其他高階用法請參考文件。

有這兩個功能,分析一下需要抓取資料的規律,就可以去寫一個自己的爬蟲了。

當然,這個Url需要注意的是,並不能只是單純的填寫頁面地址,這樣可能什麼也獲取不到。

ajax 資料需要開啟開發者皮膚,去檢視獲取資料的實際 url,這樣就能直接獲取結果了。

也有很多網站做了防 curl 獲取原始碼,那就需要另闢蹊徑,比如用 wget 命令直接把頁面下載到本地,再用 DomCrawler 去擷取資料。

參考文章

https://phpartisan.cn/?keyword=laravel%E7%...

部落格:PHP 爬蟲爬取社群文章內容

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章