使用以采集今日頭條手機版頁(yè)面文章為例(組圖)
優(yōu)采云 發(fā)布時(shí)間: 2021-07-31 07:43
使用以采集今日頭條手機版頁(yè)面文章為例(組圖)
采集Web 內容是一個(gè)很常見(jiàn)的需求,相比傳統的靜態(tài)頁(yè)面,curl 可以處理。但是如果頁(yè)面中有動(dòng)態(tài)加載的內容,比如某些頁(yè)面中通過(guò)ajax加載的文章body內容,并且如果某些頁(yè)面經(jīng)過(guò)一些額外的處理(圖片地址替換等...)而你想要采集這些經(jīng)過(guò)處理的內容。那么厲害的curl就無(wú)奈了。
做過(guò)類(lèi)似需求的人可能會(huì )說(shuō),老鐵,去PhantomJS吧!
是的,這是一種方式,長(cháng)期以來(lái),PhantomJS 是少數可以解決這種需求的工具之一。
但是今天我要介紹一個(gè)更新的工具-puppeteer,它隨著(zhù)Chrome Headless 技術(shù)的興起而迅速發(fā)展。而且非常重要的是,puppeteer 由 Chrome 官方團隊開(kāi)發(fā)和維護,可以說(shuō)是相當可靠!
puppeteer 是一個(gè) js 包,如果你想在 Laravel 中使用它,你必須求助于另一個(gè)神器 spatie/browsershot。
安裝
安裝 spatie/browsershot
Browsershot是一個(gè)composer包,來(lái)自大神團隊的spatie
$ composer require spatie/browsershot
安裝 puppeteer
$ npm i puppeteer --save
也可以全局保護puppeteer,但從個(gè)人經(jīng)驗來(lái)看,建議安裝在項目中,因為不同的項目不會(huì )同時(shí)受到全局安裝的puppeteer的影響,在項目中安裝是使用phpdeployer升級也很方便(phpdeploy升級不會(huì )影響線(xiàn)上項目的運行。要知道升級/安裝puppeteer很費時(shí)間,有時(shí)還不能保證一次成功)。
安裝 puppeteer 后,將下載 Chromium-Browser。由于我們特殊的國情,很可能無(wú)法下載。為此,請施展你的魔法……
使用
以采集今日頭條手機版頁(yè)面文章內容為例。
use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
$newsUrl = 'https://m.toutiao.com/i6546884151050502660/';
$html = Browsershot::url($newsUrl)
->windowSize(480, 800)
->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36')
->mobile()
->touch()
->bodyHtml();
\Log::info($html);
}
運行后可以在日志中看到如下內容(截圖只是其中的一部分)
此外,您可以將頁(yè)面另存為圖片或 PDF 文件。
use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
$newsUrl = 'https://m.toutiao.com/i6546884151050502660/';
Browsershot::url($newsUrl)
->windowSize(480, 800)
->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36')
->mobile()
->touch()
->setDelay(1000)
->save(public_path('images/toutiao.jpg'));
}
圖中方框與系統字體有關(guān)。代碼中使用 setDelay() 方法在內容加載后截取屏幕截圖。它既簡(jiǎn)單又粗魯,可能不是最好的解決方案。
可能出現的問(wèn)題總結
puppeteer 用于測試、采集 等場(chǎng)景。這是一個(gè)非常強大的工具。對于溫和的采集 任務(wù),就足夠了。比如一些像采集這樣的小頁(yè)面在本文的Laravel(php)中使用,但是如果你需要快速采集很多內容,那就是Python什么的。