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.