首页 > 文章列表 > PHP 爬虫实战:爬取豆瓣电影评论

PHP 爬虫实战:爬取豆瓣电影评论

php 爬虫 评论
136 2023-06-13

随着互联网的发展,爬虫越来越受到人们的关注,因为爬虫可以在互联网上收集大量的数据,并进行分析和处理,这对于很多行业来说是非常有帮助的。本文将介绍使用 PHP 实现一个简单的爬虫,以爬取豆瓣电影评论为例。

一、前期准备

  1. 安装 PHP

首先需要安装 PHP,你可以从官网下载最新的 PHP 安装包,并按照提示进行安装即可。

  1. 安装 Curl 扩展

Curl 是 PHP 中一个非常常用的扩展,用于支持 HTTP 客户端,通过 Curl 扩展可以很轻松地发送 HTTP 请求和接收 HTTP 响应。如果你是通过官方 PHP 安装包来安装 PHP,那么 Curl 扩展可能已经预装了,如果没有,你可以通过以下命令安装:

sudo apt-get install php-curl  # Ubuntu 等 Debian 发行版
sudo yum install php-curl   # CentOS 等 RedHat 发行版
  1. 确认豆瓣电影评论页面 URL

本文将爬取豆瓣电影《复仇者联盟4:终局之战》的影评,其页面的 URL 为 https://movie.douban.com/subject/26100958/comments?status=P,其中 26100958 是该电影在豆瓣电影上的 ID。

二、爬虫实现

  1. 获取页面内容

首先,我们需要获取豆瓣电影的评论页面内容,可以通过 CURL 发送 HTTP GET 请求获取 HTML 内容:

$url = 'https://movie.douban.com/subject/26100958/comments?status=P';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);

在上述代码中,首先定义豆瓣电影评论页面的 URL,然后通过 curl_init() 初始化一个 CURL 数据句柄,然后通过 curl_setopt() 函数来设置 CURL 句柄的参数,最后调用 curl_exec() 函数发送 HTTP GET 请求并获取 HTML 内容,最后使用 curl_close() 关闭句柄。

  1. 解析页面内容

得到页面内容后,我们需要对页面进行解析,以提取出我们想要的数据。在 PHP 中,可以使用 Simple HTML DOM 解析器来解析 HTML。你可以从官方网站 https://sourceforge.net/projects/simplehtmldom/files/ 下载最新的版本,并将其引入到你的 PHP 文件中。

这里我们需要遍历每一个用户的评论,我们可以找到评论区域 HTML 块,并获取其中的各个元素:

require_once '/path/to/simple_html_dom.php';

$comments = array();

$html = str_get_html($html);

$comment_list = $html->find('.comment-list')[0];
$comments_array = $comment_list->find('.comment-item');

foreach ($comments_array as $comment_item) {
    $comment = array();

    $comment['user'] = $comment_item->find('.comment-info a[href]', 0)->innertext;
    $comment['rating'] = $comment_item->find('.comment-info .rating', 0)->getAttribute('title');
    $comment['content'] = trim($comment_item->find('.comment p', 0)->innertext);

    $comments[] = $comment;
}

$html->clear();
unset($html);

上述代码首先通过 require_once 引入 Simple HTML DOM 解析器,然后将获取的 HTML 字符串传给 str_get_html() 函数解析成一个 Simple HTML DOM 对象。

通过 $html->find() 函数可以利用 CSS 选择器来获取 HTML 标签,具体可以参考 Simple HTML DOM 文档(http://simplehtmldom.sourceforge.net/manual.htm)。

  1. 将数据存入数据库

最后,爬虫获取到的数据需要进行存储。在这里,我们使用 MySQL 数据库来存储数据,你需要先在本地或者远程服务器搭建 MySQL 数据库,并创建一张名为 movie_comments 的表。

创建表的 SQL 语句如下:

CREATE TABLE `movie_comments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `rating` varchar(10) NOT NULL DEFAULT '',
  `content` text NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后将爬虫获取到的数据插入到表中:

$dsn = "mysql:host=yourHost;dbname=yourDB;charset=utf8mb4";
$username = 'yourUsername';
$password = 'yourPassword';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    foreach ($comments as $comment) {
        $stmt = $pdo->prepare("INSERT INTO movie_comments(name, rating, content) VALUES (:name, :rating, :content)");
        $stmt->bindParam(':name', $comment['user']);
        $stmt->bindParam(':rating', $comment['rating']);
        $stmt->bindParam(':content', $comment['content']);
        $stmt->execute();
    }

} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

上述代码首先定义一个 DSN(数据源名)字符串,表示 MySQL 的连接参数,然后通过 PDO 类进行数据库连接,并设置错误模式为抛出异常,以便于错误处理。最后,循环遍历每一个评论,并使用 PDO 的 prepare() 函数预处理 SQL 语句,然后使用 bindParam() 绑定参数,最后执行 SQL 语句插入数据到数据库中。

三、总结

通过本文的介绍,你可以了解到如何使用 PHP 实现一个简单的爬虫,以爬取豆瓣电影评论为例,你可以通过 CURL 获取 HTML 内容,然后使用 Simple HTML DOM 解析器来解析 HTML 并提取出你想要的数据,最后将数据存入 MySQL 数据库中。当然,这只是一个简单的示例,你可以根据实际需求来编写你自己的爬虫。