php如何抓取网页数据库( 一个采集网页内容的工具--puppeteer,可以说相当靠谱了!)
优采云 发布时间: 2021-11-29 23:07php如何抓取网页数据库(
一个采集网页内容的工具--puppeteer,可以说相当靠谱了!)
php抓取数据
时间:2019-07-10
本期文章为大家介绍php爬取数据,主要包括php爬取数据使用示例、应用技巧、基础知识点总结和注意事项。有一定的参考价值,有需要的朋友可以参考。
对于一般的页面数据,我们可以很方便的使用querylist抓取页面,分析其中的dom树,抓取我们需要的数据,存入数据库,但是有时候我们会遇到我们想要抓取的数据是通过JavaScript渲染的. 此时
Puppeteer 插件就派上用场了。作为参考,在遵循文档时,我发现
错误:无法下载 Chromium r672088!设置“PUPPETEER_SKIP_CHROMIUM_DOWNLOAD”环境变量以跳过下载。错误,
解决方案
采集 Web 内容是一个很常见的需求,相比传统的静态页面,curl 可以处理。但是如果页面中有动态加载的内容,比如有些页面通过ajax加载的文章 body内容,如果有些页面经过一些额外的处理(图片地址替换等...)而你想要采集这些处理过的内容。然后真棒卷曲也无奈。
做过类似需求的人可能会说,老铁,去PhantomJS吧!
没错,这是一种方式,长期以来 PhantomJS 是少数可以解决这种需求的工具之一。
但是今天我要介绍一个来自于behind puppeteer的工具,它随着Chrome Headless技术的兴起而迅速发展。而且非常重要的是,puppeteer 是由 Chrome 官方团队开发和维护的,可以说是相当靠谱!
Puppeteer 是一个 js 包,如果你想在 Laravel 中使用它,你必须求助于另一个神器 spatie/browsershot。
安装
安装 spatie/browsershot
browsershot 是来自 spatie 的 composer 包
$ 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什么的。