milivojsa/chrome-php

Chrome Headless 的 PHP 包装器。获取任何网页的 DOM。

v3.0.2 2019-04-18 21:15 UTC

This package is auto-updated.

Last update: 2024-09-19 09:59:52 UTC


README

Version Build Status StyleCI

使用无头 Chrome 通过 headless Chrome 获取任何网页的 DOM。受 Browsershot 启发。

要求

此包需要 Puppeteer Chrome Headless Node 库。如果您想在 Ubuntu 16.04 上安装它,可以这样做

sudo apt-get update
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
sudo npm install --global --unsafe-perm puppeteer
sudo chmod -R o+rx /usr/lib/node_modules/puppeteer/.local-chromium

安装

要将此包添加到您的项目,您可以通过 composer 安装,运行

composer require milivojsa/chrome-php

使用方法

以下是一个快速示例,说明如何使用此包

use ChromeHeadless\ChromeHeadless;

$html = ChromeHeadless::url('https://example.com')->getHtml();

除了以字符串形式获取 DOM,您还可以使用 getDOMCrawler() 方法,它将返回一个 Symfony\Component\DomCrawler\Crawler 实例。

use ChromeHeadless\ChromeHeadless;

$dom = ChromeHeadless::url('https://example.com')->getDOMCrawler();
    
$title = $dom->filter('title')->text();

这使得过滤 DOM 以获取特定元素变得很容易。请参阅完整的文档 此处

超时

您可以指定一个超时时间,在此时间后进程将被终止。超时时间应以秒为单位给出。

ChromeHeadless::url('https://example.com')
                ->setTimeout(10)
                ->getDOMCrawler();

如果进程耗尽时间,将抛出 Symfony\Component\Process\Exception\ProcessTimedOutException

自定义 Chrome 路径

您可以指定 Chrome 安装的路径。

ChromeHeadless::url('https://example.com')
                ->setChromePath('/path/to/chrome')
                ->getDOMCrawler();

自定义用户代理

您可以指定自定义用户代理。默认情况下,将使用标准的 Chrome Headless 用户代理。

ChromeHeadless::url('https://example.com')
                ->setUserAgent('nice-user-agent')
                ->getDOMCrawler();

自定义头部

您可以指定用于请求的自定义头部。

ChromeHeadless::url('https://example.com')
                ->setHeaders([
                    'DNT' => 1 // DO NOT TRACK
                ])
                ->getDOMCrawler();

黑名单

您可以为在请求网站时不应加载的文件指定正则表达式列表。这些表达式将与文件的 URL 进行检查。方法 setBlacklist(array $blacklist, $clean = false) 的默认行为是将作为 $blacklist 传递的数组与当前的 blacklist 属性合并。如果您想覆盖此默认行为,可以将参数 $clean 设置为 true

ChromeHeadless::url('https://example.com')
                ->setBlacklist([
                    'www.example.com'
                ])
                ->setBlacklist([
                    'www.google-analytics.com',
                    'analytics.js'
                ]) // property blacklist now will have www.example.com and those two
                ->getDOMCrawler();
ChromeHeadless::url('https://example.com')
                ->setBlacklist([
                    'www.google-analytics.com',
                    'analytics.js'
                ])
                ->setBlacklist([
                    'www.example.com'
                ], true) // property blacklist now will only have www.example.com 
                ->getDOMCrawler();

排除

您可以为在请求网站时不应加载的资源类型指定列表。这些资源类型将与文件的资源类型进行检查。您可以通过传递值:document, stylesheet, image, media, font and script。方法 setExcluded(array $excluded, $clean = false) 的默认行为是将作为 $excluded 传递的数组与当前的 excluded 属性合并。如果您想覆盖此默认行为,可以将参数 $clean 设置为 true

ChromeHeadless::url('https://example.com')
                ->setExcluded([
                    'document'
                ])
                ->setExcluded([
                    'stylesheet',
                    'image'
                ]) // property excluded now will only have document and those two
                ->getDOMCrawler();
ChromeHeadless::url('https://example.com')
                ->setExcluded([
                    'stylesheet'
                    'image'
                ]) 
                ->setExcluded([
                    'document'
                ], true) // property excluded now will only have only document
                ->getDOMCrawler();

视口

您可以在进行请求时指定一个自定义视口。默认情况下,将使用 Chrome Headless 标准的 800x600px。

ChromeHeadless::url('https://example.com')
                ->setViewport([
                    'width' => 1920,
                    'height' => 1080
                ])
                ->getDOMCrawler();

测试

您可以通过使用以下命令来运行测试

composer test