让你喜欢的八个 PHP 网页爬虫库与工具
21CTO导读:本文标题几乎解释了一切。如果您正在使用PHP进行页面抓取,可以阅读本文以获取特别好用的PHP框架之概述也!
网页抓取是开发人员每天遇到的常规操作,比如抓取文章,商品,股票,火车票,秒杀等数据。
在后端开发中,网页抓取非常受欢迎。
为什么要用PHP进行网页抓取?
PHP有不少网页爬虫库。虽然我并没有进行特别详细的搜索,但我肯定的没有比PHP更好的语言来做抓取了。
使用PHP 抓取的主要原因是我掌握并喜欢PHP这个语言。
如果应用程序的其余部分(将非常方便使用抓取的结果)也是用PHP写的,那么更应该用PHP进行抓取。使用PHP进行抓取也并非容易,例如,我曾经在Python Web项目中也使用PHP来抓取。
PHP Web抓取入门
虽然有许多PHP 网页抓取框架供人们选择。但我坚定地认为Goutte和Pantherfor Symfony项目是一个最强力的组合。
在这篇文章中,我们将探讨一些能够以对需求最有用的方式,包括抓取网站并存储到数据库中。
在PHP中,我们可以使用如下库进行数据抓取。请见列表:
GOUTTE
Simple HTMLDOM
htmlSQL
cURL
Requests
HTTPful
Buzz
Guzzle
GOUTTE 库
说明:
Goutte库非常优秀,它提供了抓取内容的最强大支持。
基于Symfony框架,Goutte是一套抓取和Web爬虫库。
Goutte提供了API。用来抓取网站,可以从HTML / XML响应中抓取数据。
Goutte使用MIT开源许可证。
特色:
适用于大型项目。
基于OOP。
具有中等解析速度,并不慢。
要求:
Goutte依赖PHP 5.5+和Guzzle 6+。
开发文档:
https://goutte.readthedocs.io/en/latest/
更多内容请见:
https://menubar.io/php-scraping-tutorial-scrape-reddit-with-goutte
要使用Goutte,我们首先来获取它:
composer require fabpot/goutte
以下就是一个用Goutte抓取页面的PHP脚本:
<?php
include ('vendor/autoload.php');
$client = new \Goutte\Client();
$crawler = $client->request('GET', 'http://example.com/');
$fullPageHtml = $crawler->html();
$pageH1 = $crawler->filter('h1')->text();
在这里,我们使用了PHP包管理器Composer。
讲一下代码逻辑,这个爬虫程序其实很简单:它进入example.com网站
并加载页面。然后它过滤HTML并抓取页面的<h1>
元素,获取其内容。这里没有啥特别酷的,但它应该让你了解到Goutte如何用于网页抓取。
当我们需要Symfony Panther时
开发网页爬虫的主要障碍是网站有许多的JavaScript。而在很多年以前,开发人员需要确保他们的网站在不执行任何JavaScript的情况下能够运行良好。也就是这个问题得让你的爬虫用Panther而不是用Goutte来抓取。
Symfony Panther的最大优点是,它实际上是通过PHP 脚本生成并控制Google Chrome 浏览器实例,而不再使用原始HTML请求。这是一件非常有趣的事,因为Google Chrome是可以执行JavaScript的。
你还是不太确定该使用Goutte还是用Panther?
我们可以先在浏览器中禁用JavaScript。在Chrome中通过快速网络搜索“在[browsername]中禁用JavaScript”,然后尝试执行爬虫执行的操作。如果可以,请使用Goutte。如果不能,那就该是Panther的工作。
以下是我们的PHP 爬虫脚本,它使用Panther浏览某移动端网站页面:
首先,一样需要获取软件包:
composer require symfony/panther
然后在PHP脚本中引用它:
<?php
include ('vendor/autoload.php');
$client = \Symfony\Component\Panther\Client::createChromeClient();
$crawler = $client->request('GET', 'http://example.com/');
$fullPageHtml = $crawler->html();
$pageH1 = $crawler->filter('h1')->text();
你也许也会注意到,这与前面的Goutte代码几乎相同。
我们将在下一个代码片段中重点介绍Panther的一些比较酷的功能。
在上面的代码中,我们只是用Panther取代Goutte,获得相同的页面内容。如果你执行过这两段代码,你会发现,PATHER的方式会比GOUTTE慢。因为运行Chrome会比使用PHP本身获取HTML更加昂贵,而这正是Goutte所做的全部内容。
使用Symfony Panther的有用提示:
当开发脚本出现错误处理方法,Panther是在端口9515上运行Chrome,可以使用BASH命令kill $(lsof -t -i:9515),就可以
发现杀死它并使脚本恢复正常工作。
使用Goutte和Panther进行更复杂的操作
我最挣扎的网页抓取部分是除了加载网页和获取底层HTML中的一些数据之外的额外操作。比如填写表单,查找和点击链接等内容也是需要的,但不是那么明显。以下是在维基百科上填写搜索关键字并单击搜索按钮的代码示例:
include ('../vendor/autoload.php');
$client = new \Goutte\Client();
// For Panther
//$client = \Symfony\Component\Panther\Client::createChromeClient();
$crawler = $client->request('GET', 'https://www.wikipedia.org/');
$form = $crawler->filter('#search-form')
->form(['search' => 'web scraping']);
$crawler = $client->submit($form);
// For Panther
//$client->takeScreenshot('screenshot.png');
//$client->waitFor('.firstHeading');
echo $crawler->filter('.mw-parser-output p')->first()->text();
这个Web抓取脚本示例也没什么特别之处,你可以将其调整为能想到的任何形式。我在上面的代码中浪费了大约90分钟,我忘记了用$crawler在
表单提交中的第二个任务,并且在使用Symfony Panther时遇到了特别模糊的错误。
以上代码是做什么的?它通过在维基百科主页上找到搜索表单并提交它来搜索百科中关于“web scraping”关键字的内容。(由于维基百科网址的结构相对比较智能,你可能不需要这部分。)
Panther和Goutte非常有趣,当你不做特别奇特的事情时,它们的API基本上是兼容的。因为Goutte只是一个HTML浏览器,所以它不能做像截图那样很酷的东西,也不能等待DOM元素加载完成。除此之外,这两个功能是一样的。
还有截图功能?这个功能当然很酷。
2.Simple HTML DOM
描述:
用PHP5+编写,HTML DOM解析器很好用,因为它使您能够轻松,舒适地访问和使用HTML。
有了它,你可以在HTML页面上找到带有选择器的标签,就像jQuery一样。
你可以在一行中从HTML中抓取内容。
它没有其他库的速度快。
Simple HTML DOM根据MIT许可证授权。
特征:
它支持编写上有瑕疵的HTML。
要求:
需要PHP 5+以上版本。
开发文档:
http://simplehtmldom.sourceforge.net/manual.htm
查看更多:
http://www.prowebscraper.com/blog/web-scraping-using-php/
3. htmlSQL
描述:
基本上,它是一个实验性的PHP库。它可以让你用类似SQL的语法访问HTML值。
不需要编写复杂函数或正则表达式来获取特定值。
如果你是喜欢SQL,你也会喜欢这个实验性的库。
如何有用的是,您可以将它用于任何类型的杂项任务并快速解析网页。
虽然它在2016年停止接收更新/支持,但htmlSQL仍然是一个可靠的解析和抓取库。
htmlSQL根据BSD许可证授权。
特征:
它提供相对快速的解析,但功能有限。
要求:
PHP4+的任何风格都应该有。
Snoopy PHP类 - 版本1.2.3(可选 - 页面传输需要的库)。
文档:
https://github.com/hxseven/htmlSQL
查看更多:
https://github.com/hxseven/htmlSQL/tree/master/examples
4. cURL
描述:
cURL是用于从网页中提取数据的最流行的库(内置PHP组件)之一。
不需要包含第三方文件和类,是标准化的PHP库。
要求:
当您想使用PHP的cURL函数时,只需要安装»libcurl包。需要libcurl版本7.10.5或更高。
文档:
http://php.net/manual/ru/book.curl.php
学到更多:
http://scraping.pro/scraping-in-php-with-curl/
5.Requests
描述
Requests是一个用PHP编写的HTTP库。
它基于优秀的Requests Python库中的API。
Requests能够发送HEAD,GET,POST,PUT,DELETE和PATCH HTTP请求。
在Requests的帮助下,可以使用简单数组添加标题,表单数据,多部分文件和参数,并以相同的方式访问响应数据。
可请求获得ISC许可。
特征:
国际域名和URL。
浏览器式SSL验证。
基本/摘要式身份验证。
自动减压。
连接超时。
要求:
需要PHP 5.2+以上版本
文件:
https://github.com/rmccue/Requests/blob/master/docs/README.md
6. HTTPful
说明:
HTTPful是一个简单的PHP库。它是个很好的库,既可链接又可读。它旨使HTTP可读。
它允许开发人员专注于与API交互,而不必浏览curl set_opt页面。它也是一个很棒的PHP REST客户端。
HTTPful使用MIT许可证授权。
特征:
可读的HTTP方法支持(GET,PUT,POST,DELETE,HEAD,PATCH和OPTIONS)。
自定义标题。
自动“智能”解析。
自动有效负载序列化。
基本认证
客户端证书身份验证
请求“模板”。
要求:
需要PHP版本5.3+
文档:
http://phphttpclient.com/docs/
7.Buzz
描述:
Buzz很有用,它是一个非常轻的库,用于HTTP请求。
Buzz设计简单,具有Web浏览器的特性。
Buzz依据MIT许可证获得许可证。
特征:
简单的API。
高性能。
要求:
需要PHP 7.1版。
文档:
https://github.com/kriswallsmith/Buzz/blob/master/doc/index.md
学到更多:
https://github.com/kriswallsmith/Buzz/tree/master/examples
8. Guzzle
描述:
Guzzle很有用,它是一个PHP HTTP客户端,使您能够以简单的方式发送HTTP请求。它也很容易与Web服务集成。
特征:
它提供了一个简单界面,帮助开发者构建查询字符串,POST请求,流式大型上传,流式,大批量下载,使用HTTP cookie,上传JSON数据等。
它可以在同一个接口中发送同步和异步请求。
它将PSR-7接口用于请求,响应和流。可以使用Guzzle的其他PSR-7兼容库。
它可以抽象出底层的HTTP传输,使您能够编写环境和传输不可知预知的代码; 即没有对cURL,PHP流,套接字或非阻塞事件循环的硬依赖。
中间件系统使开发者能够扩充和组合客户端行为。
要求:
需要PHP 5.3.3+版。
文档:
http://docs.guzzlephp.org/en/stable/
学到更多:
https://lamp-dev.com/scraping-products-from-walmart-with-php-guzzle-crawler-and-doctrine/958
小结
如各位开发者所见,您可以根据实际情况使用以上各种工具。通过对这些PHP库的基本了解可以帮助您在选择众多库的迷或并获得有价值的东西。
希望您喜欢本篇文章,欢迎随意分享您的反馈和意见!
编译:文龙 来源:21CTO社区