Heim > Artikel > Backend-Entwicklung > Wie crawle ich Zhihu-Daten mit Scrapy?
Scrapy ist ein Python-Webcrawler-Tool, mit dem wir problemlos verschiedene Daten im Internet abrufen können. Zhihu ist eine beliebte soziale Frage- und Antwortplattform. Verwenden Sie Scrapy, um schnell Fragen, Antworten, Benutzerinformationen und andere Daten auf Zhihu zu erfassen. In diesem Artikel wird erläutert, wie Sie mit Scrapy Zhihu-Daten crawlen.
Zuerst müssen Sie Scrapy installieren. Sie können es direkt mit dem pip-Befehl installieren:
pip install scrapy
Geben Sie im Terminal das Verzeichnis ein, in dem Sie ein Scrapy-Projekt erstellen möchten, und verwenden Sie den folgenden Befehl, um das Projekt zu erstellen:
scrapy startproject zhihu
Dieser Befehl erstellt ein Projekt mit dem Namen „zhihu“ im aktuellen Verzeichnis „Scrapy-Projekt“.
Erstellen Sie eine Spider-Datei mit dem Namen „zhihu_spider.py“ im Projektverzeichnis mit dem folgenden Befehl:
scrapy genspider zhihu_spider zhihu.com
Dieser Befehl erstellt einen „zhihu_spider“ im Unterverzeichnis „spiders“ im Projektverzeichnis. py“-Datei, die einen Spider mit zhihu.com als Start-URL enthält.
Öffnen Sie die Datei „zhihu_spider.py“ und fügen Sie den folgenden Code hinzu:
import scrapy class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['zhihu.com'] start_urls = ['https://www.zhihu.com/'] def parse(self, response): pass
Eine Spider-Klasse mit dem Namen „ZhihuSpider“ ist im Code definiert. Die Spider-Klasse muss die folgenden Attribute definieren:
In diesem Beispiel ist Spiders Start-URL auf zhihu.com festgelegt. Spider muss außerdem eine Methode namens „parse“ enthalten, um die von der Antwort zurückgegebenen Daten zu verarbeiten. In diesem Beispiel ist die Methode „parse“ noch nicht implementiert, daher wird zuerst eine leere „pass“-Anweisung hinzugefügt.
Nach Abschluss der Spider-Erstellung müssen Sie den Code hinzufügen, um die Seitendaten zu analysieren. Verwenden Sie in der Methode „parse“ den folgenden Code:
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(), }
Dieser Code ruft die div-Elemente auf der Seite ab, die das Attribut „data-type“ ohne „question“ enthalten. Anschließend durchlaufen Sie jedes div-Element, um den Fragentitel, den Link und die Antwortliste zu extrahieren.
Im obigen Code ist „yield“ ein Schlüsselwort in der Python-Sprache, das zum Generieren eines Generators verwendet wird. Ein Generator ist ein Iterator, der Elemente enthält. Nachdem jedes Element zurückgegeben wurde, wird die Ausführung an der Position dieses Elements angehalten. In Scrapy wird das Schlüsselwort „yield“ verwendet, um von der Seite analysierte Daten an Scrapy zurückzugeben.
Verwenden Sie nach Abschluss des Codeschreibens den folgenden Befehl, um den Crawler im Terminal auszuführen:
scrapy crawl zhihu
Dieser Befehl startet das Scrapy-Framework und beginnt mit dem Crawlen von Zhihu-Daten. Scrapy greift automatisch auf die in Spider angegebene Start-URL zu und analysiert die zurückgegebenen Seitendaten über die Methode „parse“. Die geparsten Daten werden an das Terminal ausgegeben. Wenn Sie Daten speichern müssen, können Sie die Daten in CSV-, JSON- usw. Dateien speichern.
Der obige Code kann nur Fragen, Antworten und andere Daten crawlen, jedoch keine Benutzerinformationen abrufen. Wenn Sie Benutzerdaten crawlen müssen, müssen Sie die API-Schnittstelle von Zhihu verwenden. In Spider können Sie den folgenden Code verwenden, um die von der API-Schnittstelle zurückgegebenen JSON-Formatdaten abzurufen:
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)
Dieser Code ruft die angegebenen Benutzerinformationen von der API-Schnittstelle ab. Hier wird die mit F-String formatierte Zeichenfolge verwendet, um den Benutzernamen des abzurufenden Benutzers in die URL einzufügen.
Verwenden Sie in der Rückruffunktion den folgenden Code, um die erforderlichen Daten aus den Daten im JSON-Format zu extrahieren:
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, }
Dieser Code extrahiert die Benutzer-ID, den Benutzer-Spitznamen, den Avatar, die Anzahl der Follower, die Anzahl der Fans und die beste Antwort aus dem JSON-Daten Fragen und andere Daten.
Dieser Artikel stellt vor, wie man Scrapy zum Crawlen von Zhihu-Daten verwendet. Zuerst müssen Sie ein Scrapy-Projekt und einen Spider erstellen. Verwenden Sie dann CSS-Selektoren, um die Daten auf der Seite zu analysieren und die gecrawlten Daten im Generator zu speichern. Speichern Sie es abschließend in CSV-, JSON- usw. Dateien oder geben Sie es direkt an das Terminal aus. Wenn Sie Benutzerdaten benötigen, können Sie die Zhihu-API-Schnittstelle verwenden, um relevante Daten aus JSON-Daten zu extrahieren.
Das obige ist der detaillierte Inhalt vonWie crawle ich Zhihu-Daten mit Scrapy?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!