php 抓取网页内容(牛逼闪闪的curl也束手无策了,可以说相当靠谱了!)
优采云 发布时间: 2022-04-01 06:17php 抓取网页内容(牛逼闪闪的curl也束手无策了,可以说相当靠谱了!)
关键词:数据获取
我的生命是有限的,但我的知识是无限的。本文章主要介绍php爬取数据相关的知识,希望对你有所帮助。
对于一般的页面数据,我们可以使用querylist轻松抓取页面并分析其中的dom树,抓取我们需要的数据,并存入数据库,但是有时候我们要抓取的数据是通过渲染来渲染的是的,这次
Puppeteer 插件派上用场了,
composerrequirenesk/puphpeteer
npminstall@nesk/puphpeteer
供参考,在按照文档做的时候,发现
错误:无法下载 Chromium r672088!设置“PUPPETEER_SKIP_CHROMIUM_DOWNLOAD”环境变量以跳过下载。错误,
解决方案
采集网页内容是一个很常见的需求。与传统的静态页面相比,curl 可以应付。但是如果页面中有动态加载的内容,比如在某些页面中通过ajax加载的文章body内容,并且如果在某些页面加载后进行了一些额外的处理(图片地址替换等),并且你想采集这些处理过的内容。然后真棒curl就束手无策了。
有类似需求的人可能会说,老铁,上PhantomJS吧!
是的,这是一个解决方案,在相当长的一段时间内,PhantomJS 是能够解决这种需求的少数工具中最好的。
但今天我要介绍一个后来居上的工具——puppeteer,它随着 Chrome Headless 技术的兴起而迅速发展。而且最重要的是,puppeteer是由Chrome官方团队开发维护的,可以说是相当靠谱了!
puppeteer 是一个 js 包。要在 Laravel 中使用它,您必须使用另一个工件 spatie/browsershot。
安装
安装 spatie/browsershot
browsershot 是来自伟大团队 spatie 的作曲家包
$ composer require spatie/browsershot
安装 puppeteer
$ npm i puppeteer --save
你也可以全局保护puppeteer,但是从个人经验来看,建议在项目中安装,因为不同的项目不会同时受到全局安装的puppeteer的影响,而且项目中的安装也是使用phpdeployer升级方便(phpdeploy升级时不会影响线上项目的运行,要知道升级/安装puppeteer是非常耗时的,有时也不能保证成功)。
安装 puppeteer 时会下载 Chromium-Browser。由于我国特殊的国情,很可能无法下载。在这方面,请大展身手……
使用
以采集今日头条手机页面文章的内容为例。
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);
运行后在日志中可以看到如下内容(截图只是部分内容)
或者,您可以将页面保存为图像或 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‘));
图片中的方框与系统字体有关。代码中使用了 setDelay() 方法,在内容加载完成后进行截图。它简单粗暴,可能不是最好的解决方案。
可能的问题
总结
puppeteer用于测试、采集等场景,是一个非常强大的工具。对于轻量级的采集任务来说已经足够了,比如这篇文章使用采集Laravel(php)中的一些小页面,但是如果需要快速采集大量的内容,或者python什么的。
这篇关于php爬取数据的文章已经写完了。如果不能解决您的问题,请参考以下文章: