Scrapy是一種Python web爬蟲工具,它可以輕鬆地幫助我們取得網路上各種資料。知乎是一個廣受歡迎的社群問答平台,使用Scrapy可以快速抓取知乎上的問題、答案、使用者資訊等資料。本文將介紹如何使用Scrapy爬取知乎資料。
首先需要安裝Scrapy。可以使用pip指令直接安裝:
pip install scrapy
在終端機中進入要建立Scrapy專案的目錄,使用下列指令建立專案:
scrapy startproject zhihu
這個指令將在目前目錄下建立一個名為「zhihu」的Scrapy專案。
使用以下指令在專案目錄中建立一個名為「zhihu_spider.py」的Spider檔案:
scrapy genspider zhihu_spider zhihu.com
這個指令將在專案目錄下的「spiders」子目錄中建立一個「zhihu_spider.py」文件,該文件包含了一個以zhihu.com為起始URL的Spider。
開啟“zhihu_spider.py”文件,新增以下程式碼:
import scrapy class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['zhihu.com'] start_urls = ['https://www.zhihu.com/'] def parse(self, response): pass
程式碼中定義了一個名為“ZhihuSpider”的Spider類別。 Spider類別需要定義以下屬性:
#在這個範例中,Spider的起始URL設定為zhihu.com。 Spider還必須包含一個名為「parse」的方法,用於處理回應傳回的資料。在這個範例中,「parse」方法還沒有具體實現,因此先加入一個空的「pass」語句。
完成Spider建立後,需要加入解析頁面資料的程式碼。在「parse」方法中,使用下列程式碼:
def parse(self, response): questions = response.css('div[data-type="question"]') for question in questions: yield { 'question': question.css('h2 a::text').get(), 'link': question.css('h2 a::attr(href)').get(), 'answers': question.css('div.zm-item-answer::text').getall(), }
這個程式碼取得頁面中包含「data-type」屬性未「question」的div元素。然後,透過循環處理每個div元素,從中提取問題標題、連結和答案清單。
在上面的程式碼中,「yield」是Python語言中的一個關鍵字,用來產生一個生成器。生成器是一個包含元素的迭代器,每回傳一個元素後,就會在該元素的位置暫停執行。在Scrapy中,「yield」關鍵字用於將從頁面解析的資料返回Scrapy。
完成程式碼編寫後,使用以下指令在終端機中執行爬蟲:
scrapy crawl zhihu
這個指令將啟動Scrapy框架,並開始爬取知乎資料。 Scrapy會自動存取Spider中指定的起始URL,並透過「parse」方法解析傳回的頁面資料。解析的數據將輸出到終端中。如果需要保存數據,可以將數據儲存到CSV、JSON等文件中。
上述程式碼只能爬取問題、回答等數據,並不能取得使用者資訊。如果需要爬取用戶數據,則需要使用知乎的API介面。在Spider中,可以使用以下程式碼取得API介面傳回的JSON格式資料:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} url = f'https://www.zhihu.com/api/v4/members/{user}?include=following_count,follower_count,badge[?(type=best_answerer)].topics&limit=20' yield scrapy.Request(url, headers=headers, callback=self.parse_user)
這個程式碼從API介面取得指定使用者的資訊。在這裡,使用了f-string格式化字串,將要取得的使用者的使用者名稱插入到URL中。
在回呼函數中,使用以下程式碼從JSON格式的資料中提取所需的資料:
def parse_user(self, response): data = json.loads(response.body)['data'] following_count = data['following_count'] follower_count = data['follower_count'] best_answerer = data['badge'][0]['topics'] yield { 'user_id': data['id'], 'name': data['name'], 'headline': data['headline'], 'following_count': following_count, 'follower_count': follower_count, 'best_answerer': best_answerer, }
這個程式碼從JSON資料中提取了使用者ID、使用者暱稱、頭像、關注數、粉絲數、最佳回答問題等數據。
本文介紹如何使用Scrapy爬取知乎資料。首先,需要建立一個Scrapy項目,並建立一個Spider。然後,使用CSS選擇器解析頁面中的數據,將爬取到的數據儲存到生成器中。最後,儲存到CSV、JSON等檔案中,或直接輸出到終端機即可。如果需要取得使用者數據,可以使用知乎API介面從JSON資料中擷取相關資料。
以上是如何使用Scrapy爬取知乎數據?的詳細內容。更多資訊請關注PHP中文網其他相關文章!