PHP使用Headless Chrome制作网页爬虫

随着这几年前端的迅速发展,目前的前端趋势都是使用一些JS框架来开发,比如大家熟知的React , Angular和Vue 。有些媒体网页为了防止内容被copy走,他们在网页上使用ajax或是使用js插入cookie,然后再来ajax判断。

正所谓道高一尺魔高一丈,所以今天教教大家如何用php抓取网页上的数据。

通常一般用PHP抓取网页的数据不外乎是CURL或使用file_get_contents , 或是使用了封装好的simple html dom。这样的话确实是能够抓取数据但是并无法等待网页上的js加载后才进行数据的抓取。

所以网上便有了phantomjs这个方案来使用php抓取js加载的网页。但是在我使用了发现到有些网站会使用js插入cookie,然后验证cookie。但是phantomjs并无法保存cookie , 加上phantomjs的作者放弃维护这个项目了,可能是因为chrome在59版本开始推出了headless功能。

什么是headless chrome?

Headless Chrome 是Chrome 浏览器的无界面形态,php使用headless chrome加载网页,然后能够得到网页上的内容,截图,或是把截图转化成PDF

接下来就是干货了!教你如何使用Headless chrome抓取网页内容。

首先我们使用Github上的chrome php , 这是人家封装好的库,那我们就不用自己再特地去写了,直接就能拿来用

https://github.com/chrome-php/headless-chromium-php

这篇文章主要就教大家怎么抓取内容,Headless Chrome还有其他的功能可以看下这个chrome php的文档使用其他的API

use HeadlessChromium\BrowserFactory;

    $browserFactory = new BrowserFactory('/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome');

    // starts headless chrome
    $browser = $browserFactory->createBrowser();

    // creates a new page and navigate to an url
    $page = $browser->createPage();
    $page->navigate('http://example.com')->waitForNavigation('networkIdle');
    
    // get page content
    $pageTitle =  $page->evaluate('document.documentElement.innerHTML')->getReturnValue();
    
    // bye
    $browser->close();

BrowserFactory 内传的参数就是我本机上的chrome , 以上是mac的配置

如果是windows的用户的话就找一下自己chrome的路径,如果是linux 服务器的话就写上google-chrome的命令

Windows配置
new BrowserFactory(‘ C:\Program Files (x86)\Google\Chrome\Application\chrome’);

CentOS配置
new BrowserFactory(‘ google-chrome ‘);

Windows和CentOS的配置我没试过,Windows配置是网上找到的,CentOS的话我还没把代码放上服务器上试跑,理论上应该不是什么大问题,如果有任何问题欢迎在以下留言交流,但是以下在CentOS上安装Chrome确实是没问题的。

CentOS安装Google Chrome

1.下载chrome最新的rpm

wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

2.下载完毕之后就直接安装

yum localinstall google-chrome-stable_current_x86_64.rpm

3.安装完毕查看版本

google-chrome -version

4.能够测试截图 , 必须写上–no-sandbox,否则无法正常运行

google-chrome --no-sandbox --headless --disable-gpu --screenshot https://www.chromestatus.com/

没写上–no-sandbox ,就报错了,就是以下的错误信息
[0714/013139.867781:ERROR:zygote_host_impl_linux.cc(89)] Running as root without –no-sandbox is not supported. See https://crbug.com/638180.

Loading

Facebook评论