使用 PHP 实现抓取知乎问题及回答的程序

知乎作为一个极受欢迎的知识分享社区,其上众多用户贡献了大量高质量的问题和回答,对于学习和工作的人们来说,这些内容对于解决问题和拓展视野非常有帮助。如果想要整理和利用这些内容,就需要使用抓取程序获取相关数据。本文将介绍使用 PHP 编写抓取知乎问题及回答的程序。

  1. 简介
    知乎是一个内容非常丰富的平台,其上的内容包括但并不限于问题、回答、专栏、话题、用户等。我们可以通过爬取知乎上的数据进一步挖掘这些内容的价值。这里主要介绍如何使用 PHP 抓取知乎问题和回答。
  2. 问题抓取
    首先,我们需要明确抓取的目标是什么。对于知乎上的问题,我们需要以下信息:

问题标题
问题描述
该问题的关注者数、浏览数、回答数
问题的标签
相关问题
知乎上的问题有一个非常明显的特点,那就是每个问题都有一个独一无二的 URL。所以我们可以通过构造 URL 并发送 HTTP 请求来获取该问题的相关信息。

以下是 PHP 代码演示:

<?php
$url = 'https://www.zhihu.com/question/36189228';
$html = file_get_contents($url);

$data = array();
preg_match('/<title>(.*?)</title>/', $html, $match);
$data['title'] = $match[1];

preg_match('/<div class="QuestionHeader-detail">(.*?)</div>/', $html, $match);
$data['description'] = $match[1];

preg_match('/<div class="NumberBoard-value">(.*?)</div><span class="NumberBoard-label">关注者</span>/', $html, $match);
$data['followers'] = $match[1];

preg_match('/<div class="NumberBoard-value">(.*?)</div><span class="NumberBoard-label">浏览</span>/', $html, $match);
$data['views'] = $match[1];

preg_match('/<div class="NumberBoard-value">(.*?)</div><div class="NumberBoard-label">回答</div>/', $html, $match);
$data['answers'] = $match[1];

preg_match_all('/<a href="/topic/(.*?)">(.*?)</a>/', $html, $matches);
$data['tags'] = implode(',', $matches[2]);

preg_match_all('/<a class="RelatedQuestionItem-title" href="(.*?)" target="_blank">(.*?)</a>/', $html, $matches);
$data['related_questions'] = array_combine($matches[1], $matches[2]);

echo json_encode($data, JSON_UNESCAPED_UNICODE);

这里使用了 PHP 的正则表达式来匹配 HTML 文本中的所需信息。这种方式虽然依赖于 HTML 页面结构,但在大多数情况下都能够正常抓取所需数据。可见,通过简单的代码,我们就可以获取到该问题的各种信息。

  1. 回答抓取
    对于知乎上的回答,我们需要以下信息:

回答的作者
回答的内容
该回答的赞数、评论数
对于每个回答,我们同样可以通过构造 URL 并发送 HTTP 请求来获取其相关信息。

以下是 PHP 代码演示:

<?php
$url = 'https://www.zhihu.com/question/36189228/answer/243147352';
$html = file_get_contents($url);

$data = array();
preg_match('/<meta itemprop="name" content="(.*?)">/', $html, $match);
$data['author'] = $match[1];

preg_match('/<div class="RichText ztext">(.*?)</div>/', $html, $match);
$data['content'] = $match[1];

preg_match('/<button class="Button VoteButton VoteButton--up" aria-pressed="false" tabindex="0" aria-label="(.*?)">/', $html, $match);
$data['upvotes'] = $match[1];

preg_match('/<button class="Button CommentButton" tabindex="0" aria-label="(.*?)">/', $html, $match);
$data['comments'] = $match[1];

echo json_encode($data, JSON_UNESCAPED_UNICODE);

同样地,我们使用了 PHP 的正则表达式来匹配 HTML 文本中的所需信息。值得注意的是,获取回答的内容需要使用 ztext 而不是 AnswerItem-content 类。这是因为知乎在更新后改变了相关 CSS 类名。

  1. 总结
    本文介绍了如何使用 PHP 编写抓取知乎问题和回答的程序。我们可以根据需要获取不同的信息,对于知乎上的内容进行综合分析和利用。对于 PHP 开发者来说,这是一个非常实用的技能,可以用于数据分析、搜索引擎优化等多方面的工作。

以上就是使用 PHP 实现抓取知乎问题及回答的程序的详细内容,更多请关注其它相关文章!