php 网页内容抓取(牛逼闪闪的curl也束手无策了,你想采集这些处理过后的内容 )

优采云 发布时间: 2021-09-11 23:14

  php 网页内容抓取(牛逼闪闪的curl也束手无策了,你想采集这些处理过后的内容

)

  对于一般的页面数据,我们可以很方便的抓取带有querylist的页面,分析里面的dom树,抓取我们需要的数据,存入数据库,但是有时候我们会遇到我们想通过JavaScript抓取的数据渲染,这次

  Puppeteer 插件派上用场,

  composerrequirenesk/puphpeteer

  npminstall@nesk/puphpeteer --->cnpminstall@nesk/puphpeteer

  供参考,按照文档做的时候发现

  错误:无法下载 Chromium r672088!设置“PUPPETEER_SKIP_CHROMIUM_DOWNLOAD”环境变量以跳过下载。错误,

  解决方案

  采集Web 内容是一个很常见的需求,相比传统的静态页面,curl 可以处理。但是如果页面中有动态加载的内容,比如某些页面中通过ajax加载的文章body内容,并且如果某些页面经过一些额外的处理(图片地址替换等...)而你想要采集这些经过处理的内容。那么厉害的curl就无奈了。

  做过类似需求的人可能会说,老铁,去PhantomJS吧!

  是的,这是一种方式,长期以来,PhantomJS 是少数可以解决这种需求的工具之一。

  但是今天我要介绍一个更新的工具-puppeteer,它随着Chrome Headless 技术的兴起而迅速发展。而且非常重要的是,puppeteer 由 Chrome 官方团队开发和维护,可以说是相当可靠!

  puppeteer 是一个 js 包,如果你想在 Laravel 中使用它,你必须求助于另一个神器 spatie/browsershot。

  安装

  安装 spatie/browsershot

  Browsershot 是一个 Composer 包,来自大神团队的 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什么的。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线