Scrapy は、インターネット上のさまざまなデータを簡単に取得できる Python Web クローラー ツールです。 Zhihu は人気のあるソーシャル質問と回答のプラットフォームです。Scrapy を使用して、Zhihu 上の質問、回答、ユーザー情報、その他のデータをすばやく取得します。この記事では、Scrapy を使用して Zhihu データをクロールする方法を紹介します。
まず、Scrapy をインストールする必要があります。 pip コマンドを使用して直接インストールできます。
pip install scrapy
ターミナルで Scrapy プロジェクトを作成するディレクトリを入力し、次のコマンドを使用してプロジェクトを作成します:
scrapy startproject zhihu
このコマンドは、現在のディレクトリに「zhihu」という名前の Scrapy プロジェクトを作成します。
次のコマンドを使用して、プロジェクト ディレクトリに「zhihu_spider.py」という名前のスパイダー ファイルを作成します。
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 の開始 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(), }
このコードは、「question」のない「data-type」属性を含むページ内の div 要素を取得します。次に、各 div 要素をループして、質問のタイトル、リンク、および回答リストを抽出します。
上記のコードでは、「yield」は Python 言語のキーワードであり、ジェネレーターを生成するために使用されます。ジェネレーターは要素を含む反復子であり、各要素が返された後、その要素の位置で実行が一時停止されます。 Scrapy では、「yield」キーワードは、ページから解析されたデータを Scrapy に返すために使用されます。
コードの作成が完了したら、次のコマンドを使用してターミナルでクローラーを実行します。
scrapy crawl zhihu
このコマンドは、 Scrapy フレームワークを起動し、Zhihu データのクロールを開始します。 Scrapy は Spider で指定された開始 URL に自動的にアクセスし、返されたページ データを「parse」メソッドを通じて解析します。解析されたデータが端末に出力されます。データを保存する必要がある場合は、CSV、JSON などのファイルにデータを保存できます。
上記のコードは、質問や回答などのデータのみをクロールできますが、ユーザー情報を取得することはできません。ユーザーデータをクロールする必要がある場合は、Zhihu の 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 を使用して Zhihu データをクロールする方法を紹介します。まず、Scrapy プロジェクトを作成し、Spider を作成する必要があります。次に、CSS セレクターを使用してページ内のデータを解析し、クロールされたデータをジェネレーターに保存します。最後にCSVやJSONなどのファイルに保存するか、端末に直接出力します。ユーザー データを取得する必要がある場合は、Zhihu API インターフェイスを使用して、JSON データから関連データを抽出できます。
以上がScrapy を使用して Zhihu データをクロールするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。