PHP 使用 Guzzle 抓取网页

安装 Guzzle

下载地址

这里我使用的是 composer 进行安装

1
composer require guzzlehttp/guzzle

下来我们就创建 index.php 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# file index.php
<?php

require './vendor/autoload.php'; // 引入 composer 实现的自动加载

use GuzzleHttp\Client; // 引入 guzzle 客户端

$client = new Client(); // 实例化

$url = 'http://www.xxx.com'; // 设置一个可访问的 url
$http = $client->request('GET', $url); // 执行

if ($http->getStatusCode == 200) {
// 判断 http 状态码为 200 的时候,执行成功
// echo $http->getBody();
echo $http->getBody()->getContents();
}

使用 php index.php 执行查看结果,或者搭建 web 服务器,使用浏览器查看结果。

分析html元素

上面这个例子就是简单的一个网页抓取程序,但是我们实际开发中,往往不会这么简单,我们会对抓取的信息进行处理

我将采用 php 来分析 html 信息,便于我们获取到自己所需要的信息

采用开源库 symfony/dom-crawler ,这是一个用 XPath 来分析 html 元素的库,下载地址

1
composer require symfony/dom-crawler

下来我们将进一步优化上面的程序,来抓取网页中特定的元素信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# file index.php
<?php

require './vendor/autoload.php'; // 引入 composer 实现的自动加载

use GuzzleHttp\Client; // 引入 guzzle 客户端
use Symfony\Component\DomCrawler\Crawler; // html 元素分析类

$client = new Client(); // 实例化

$url = 'http://www.xxx.com'; // 设置一个可访问的 url
$http = $client->request('GET', $url); // 执行

// 判断 http 状态码为 200 的时候,执行成功
if ($http->getStatusCode == 200) {

// 这里传入的是元素的 Xpath,可以用 chrome 调试工具获取
// 或者第三方库使用 jquery 选择器的方式生成 Xpath,最后推荐!
$content = $crawler->filterXPath('//a[@class="list-group-item"]');
if ($content->count() > 0) {
// 如果 $content->count() > 1的话可以使用循环获取内容信息
foreach ($content as $node) {
// 这里的 node 是 DOMElement Object,操作查看手册
}

// 在这里面我们可以继续使用 filterXpath 进行查找

echo $content->text(); // 输出文本信息
echo $content->html(); // 获取 html 信息

}
}

生成 Xpath 的库

推荐使用 symfony/css_selector

安装

1
composer require symfony/css_selector

使用方法

1
2
3
4
use Symfony\Component\CssSelector\CssSelectorConverter;

$converter = new CssSelectorConverter();
var_dump($converter->toXPath('div.item > h4 > a'));

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

End

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay