vlambda博客
学习文章列表

让你喜欢的八个 PHP 网页爬虫库与工具

21CTO导读:本文标题几乎解释了一切。如果您正在使用PHP进行页面抓取,可以阅读本文以获取特别好用的PHP框架之概述也!

网页抓取是开发人员每天遇到的常规操作,比如抓取文章,商品,股票,火车票,秒杀等数据。


在后端开发中,网页抓取非常受欢迎。


为什么要用PHP进行网页抓取?

PHP有不少网页爬虫库。虽然我并没有进行特别详细的搜索,但我肯定的没有比PHP更好的语言来做抓取了。


使用PHP 抓取的主要原因是我掌握并喜欢PHP这个语言。


如果应用程序的其余部分(将非常方便使用抓取的结果)也是用PHP写的,那么更应该用PHP进行抓取。使用PHP进行抓取也并非容易,例如,我曾经在Python Web项目中也使用PHP来抓取。


PHP Web抓取入门


虽然有许多PHP 网页抓取框架供人们选择。但我坚定地认为Goutte和Pantherfor Symfony项目是一个最强力的组合。


在这篇文章中,我们将探讨一些能够以对需求最有用的方式,包括抓取网站并存储到数据库中。


在PHP中,我们可以使用如下库进行数据抓取。请见列表:


  1. GOUTTE

  2. Simple HTMLDOM

  3. htmlSQL

  4. cURL

  5. Requests

  6. HTTPful

  7. Buzz

  8. 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社区