php 抓取网页内容(牛逼闪闪的curl也束手无策了,可以说相当靠谱了!)

优采云 发布时间: 2022-04-01 06:17

  php 抓取网页内容(牛逼闪闪的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爬取数据的文章已经写完了。如果不能解决您的问题,请参考以下文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线