PHP爬虫实战抓取慕课网课程信息
更新时间:2023-11-08一、 准备工作
在开始抓取慕课网课程信息之前,我们需要准备一个简单的开发环境。该环境需要具备以下几个特点:
- 安装 PHP 环境,并确保版本在 PHP 5.6 或以上
- 安装 Composer 包管理器
- 安装 Goutte,它是一个用于 Web 框架构建的 PHP 爬虫,依赖于 Guzzle HTTP 客户端
下面是使用 Composer 安装 Goutte 的命令:
composer require fabpot/goutte
安装完毕后,接下来我们需要创建一个 PHP 文件,例如我们命名为 Spider.php
,并在文件中添加以下代码:
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://www.imooc.com/');
上述代码中,我们首先引入 Goutte 客户端类,并创建一个新的客户端实例。接着,我们使用 request()
方法向目标 URL 发送 GET 请求,并将返回的 HTML 内容加载到 Crawler 对象中。
二、 解析 HTML 内容
在获取了 HTML 内容后,我们接下来需要解析该内容,从中提取我们所需的课程信息。这里我们使用 Goutte 提供的 Crawler 类。下面是一个使用 Crawler 类解析 HTML 的示例:
$courses = $crawler->filter(".mm-fixed .mod-course");
$courses->each(function ($course) {
$title = $course->filter('.course-card-name')->text();
$imgUrl = $course->filter('.course-card .lazy')->image()->getUri();
$price = $course->filter('.course-card-price')->text();
// 处理课程信息
// ...
});
上述代码中,我们首先通过 CSS 选择器选择带有 .mod-course 类的元素,然后使用 each()
方法对每个元素进行处理。在每个元素中,我们又通过 CSS 选择器选择所需信息的对应元素,并使用 filter() 和 text() 方法获取元素的内容,最终在处理完每个元素后,你可以做进一步的处理。
三、 存储课程信息
在解析 HTML 得到课程信息后,我们需要将这些信息存储到数据库或其他地方以方便后续的使用。这里我们提供一种使用 PDO 连接 MySQL 数据库,并将课程信息存储到数据库中的示例:
// 配置数据库参数
$dsn = "mysql:host=localhost;dbname=test";
$pdo = new PDO($dsn, 'root', '');
// 待插入的数据
$data = [
'title' => $title,
'img_url' => $imgUrl,
'price' => $price
];
// 插入数据
$sql = "INSERT INTO courses (title, img_url, price) VALUES (:title, :img_url, :price)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
上述代码中,在使用 PDO 连接到 MySQL 数据库后,我们定义了一个待插入的关联数组。接着,我们构造 SQL 语句,使用 prepare() 方法创建一个准备语句,最后执行 execute() 方法,将数据插入到数据库中。
四、 完整的代码示例
下面是一个完整的 PHP 爬虫代码示例:
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://www.imooc.com/');
$courses = $crawler->filter(".mm-fixed .mod-course");
// 配置数据库参数
$dsn = "mysql:host=localhost;dbname=test";
$pdo = new PDO($dsn, 'root', '');
$courses->each(function ($course) use ($pdo) {
$title = $course->filter('.course-card-name')->text();
$imgUrl = $course->filter('.course-card .lazy')->image()->getUri();
$price = $course->filter('.course-card-price')->text();
// 插入数据
$data = [
'title' => $title,
'img_url' => $imgUrl,
'price' => $price
];
$sql = "INSERT INTO courses (title, img_url, price) VALUES (:title, :img_url, :price)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
});
上述代码首先在 use
语句块中引入了 Goutte 客户端类,并创建一个新的客户端实例。随后,我们使用 request()
方法向目标 URL 发送 GET 请求,并将返回的 HTML 内容加载到 Crawler 对象中。然后,我们使用 CSS 选择器选择带有 .mod-course 类的元素,使用 each()
方法循环处理每个元素,从中提取所需的课程信息,并存储到 MySQL 数据库中。