很多爬蟲都是使用 python 來寫的,其優勢是能簡單模仿各種請求,以及對文件解析有比較好的支援。
對PHP來說,寫一個爬蟲就有些麻煩了,不過也有很多強大的第三方庫來支撐。
比較知名的PHP爬蟲框架
phpspider
git
地址
https://github.com/owner888/phpspider
文件地址
其優點是,簡單配置就能直接執行,使用 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%...
本作品採用《CC 協議》,轉載必須註明作者和本文連結