知乎作為一個極受歡迎的知識分享社區,其上眾多用戶貢獻了大量高質量的問題和回答,對于學習和工作的人們來說,這些內容對于解決問題和拓展視野非常有幫助。如果想要整理和利用這些內容,就需要使用抓取程序獲取相關數據。本文將介紹使用 PHP 編寫抓取知乎問題及回答的程序。
簡介
知乎是一個內容非常豐富的平臺,其上的內容包括但并不限于問題、回答、專欄、話題、用戶等。我們可以通過爬取知乎上的數據進一步挖掘這些內容的價值。這里主要介紹如何使用 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 開發者來說,這是一個非常實用的技能,可以用于數據分析、搜索引擎優化等多方面的工作。