c语言编程笔录

首页 >   > 笔记大全

笔记大全

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 数据库中。