知乎作为一个极受欢迎的知识分享社区,其上众多用户贡献了大量高质量的问题和回答,对于学习和工作的人们来说,这些内容对于解决问题和拓展视野非常有帮助。如果想要整理和利用这些内容,就需要使用抓取程序获取相关数据。本文将介绍使用 PHP 编写抓取知乎问题及回答的程序。
问题标题
问题描述
该问题的关注者数、浏览数、回答数
问题的标签
相关问题
知乎上的问题有一个非常明显的特点,那就是每个问题都有一个独一无二的 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 页面结构,但在大多数情况下都能够正常抓取所需数据。可见,通过简单的代码,我们就可以获取到该问题的各种信息。
回答的作者
回答的内容
该回答的赞数、评论数
对于每个回答,我们同样可以通过构造 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 类名。
以上是使用 PHP 实现抓取知乎问题及回答的程序的详细内容。更多信息请关注PHP中文网其他相关文章!