知乎作為一個極受歡迎的知識分享社區,其上眾多用戶貢獻了大量高品質的問題和回答,對於學習和工作的人們來說,這些內容對於解決問題和拓展視野非常有幫助。如果想要整理和利用這些內容,就需要使用抓取程式來取得相關資料。本文將介紹使用 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中文網其他相關文章!