爬蟲不是一個小眾的場景,所以無論是哪個語言,都有很多相應的生態庫.這里介紹一下PHP的技術方案和代碼量。
關鍵能力
對頁面的解析能力
PHP的官方擴展中有Dom擴展,但是我建議使用electrolinux/phpquery這個庫,他相當于一個PHP版的JQ.
算上加載文件,只要三行就能獲取title標簽內容.
<?php
include 'phpQuery-onefile.php';$file = 'test.html'; // 加載文件
phpQuery::newDocumentFileHTML($file);// 加載之后就可以使用JQ的操作方法去解析.$titleElement = pq('title'); // 也可以使用對象的操作方式
$title = $titleElement->html();
對數據庫的操作能力
PHP對數據庫的操作能力不是吹的,原生擴展中支持PDO,這里可以嘗試ThinkPHP的think-orm.
簡簡單單一學就會.
use think\facade\Db;
// 數據庫配置信息設置(全局有效)
Db::setConfig([// 默認數據連接標識'default' => 'mysql',// 數據庫連接信息'connections' => ['mysql' => [// 數據庫類型'type' => 'mysql',// 主機地址'hostname' => '127.0.0.1',// 用戶名'username' => 'root',// 數據庫名'database' => 'demo',// 數據庫編碼默認采用utf8'charset' => 'utf8',// 數據庫表前綴'prefix' => 'think_',// 數據庫調試模式'debug' => true,],],
]);// 查詢
Db::name('user')->where('id', 1)->find();
// 新增
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data);
//更新
Db::name('user')->update(['id' => 1, 'name' => 'thinkphp']);
// 刪除
Db::table('think_user')->where('id', 1)->delete();
爬蟲效率
PHP對于性能的優化有很多很深的解決方案,包括使用協程等,這里只介紹最簡單的的一種方式,使用guzzle這個庫(他使用curl 的并行加載特性).
use GuzzleHttp\Client;
use GuzzleHttp\Promise;$client = new Client(['base_uri' => 'http://httpbin.org/']);// 發起不阻塞的請求
$promises = ['image' => $client->getAsync('/image'),'png' => $client->getAsync('/image/png'),'jpeg' => $client->getAsync('/image/jpeg'),'webp' => $client->getAsync('/image/webp')
];// 等待所有請求完成
$responses = Promise\Utils::settle($promises)->wait();
代碼量
如上面例子所示,代碼量并不多,去掉配置文件,只有十幾行代碼,最關鍵的是我們需要的特性并沒有削弱.
比如:
- 極簡的DOM解析
- 健壯的SQL操作
- 發起并行請求
解析JS
有時候我們要抓取的頁面是依賴JS執行的,這是需要一個無頭瀏覽器,此時介紹這樣一個庫,他能夠很簡單的完成對phantomjs的操作.
PHP PhantomJS 是一個靈活的 PHP 庫,讓PHP通過很簡單的代碼來操作 PhantomJS 無頭瀏覽器加載頁面。 讓PHP加載的網頁地址執行JS/頁面截圖/導出PDF.
他可以非常方便的實現這些功能:
- 使用無頭瀏覽器PhantomJS加載請求
- 查看詳細的響應數據,包括頁面內容、標題、狀態 代碼等
- 處理重定向
- 查看JS控制臺輸出報錯
- 查看詳細的PhantomJS調試信息
- 保存頁面的截圖
- 將頁面導出為PDF
- 設置瀏覽窗口大小
- 為PDF導出設置頁眉頁腳
- 指定截圖位置x,y和寬高
- 延遲頁面渲染(等待頁面加載完成)
- 輕松構建和運行PhantomJS腳本
PHP PhantomJS 只要求 PHP 5.4.0 或以上即可。
基本用法
使用phantomjs發起一個請求非常簡單:
<?phpuse JonnyW\PhantomJs\Client;$client = Client::getInstance();/*** @see JonnyW\PhantomJs\Http\Request**/$request = $client->getMessageFactory()->createRequest('http://phpreturn.com', 'GET');/*** @see JonnyW\PhantomJs\Http\Response**/$response = $client->getMessageFactory()->createResponse();// Send the request$client->send($request, $response);if($response->getStatus() === 200) {// Dump the requested page contentecho $response->getContent();}
使用PHP總是更舒服,更簡單.
原文標題: PHP在做爬蟲時的解決方案
原文地址: https://phpreturn.com/index/a62235bdfe4e70.html
原文平臺: PHP武器庫
版權聲明: 本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturn(PHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。