Scrapy は WeChat パブリックアカウント記事のクロールと分析を実装します
WeChat は近年非常に人気のあるソーシャル メディア アプリケーションであり、そこで運用されるパブリック アカウントも非常に重要な役割を果たしています。誰もが知っているように、WeChat の公開アカウントは記事、グラフィック メッセージ、その他の情報を公開できるため、情報と知識の海です。この情報は、メディア報道、学術研究など、さまざまな分野で広く使用できます。
そこで、この記事では、Scrapy フレームワークを使用して WeChat パブリック アカウントの記事をクロールおよび分析する方法を紹介します。 Scrapy は、主な機能がデータ マイニングと情報検索である Python Web クローラー フレームワークです。したがって、Scrapy は非常にカスタマイズ可能で効率的です。
Scrapy フレームワークをクロールに使用するには、まず Scrapy とその他の依存関係をインストールする必要があります。 pip コマンドを使用してインストールできます。インストール プロセスは次のとおりです:
pip install scrapy pip install pymongo pip install mysql-connector-python
Scrapy をインストールした後、Scrapy コマンド ライン ツールを使用してプロジェクトを作成する必要があります。コマンドは次のとおりです:
scrapy startproject wechat
このコマンドを実行すると、Scrapy は「wechat」という名前のプロジェクトを作成し、プロジェクト ディレクトリ内に多くのファイルとディレクトリを作成します。
クロールを開始する前に、まず WeChat パブリック アカウントの記事ページの URL 形式を理解する必要があります。一般的な WeChat パブリック アカウントの記事ページの URL は次のようになります。
https://mp.weixin.qq.com/s?__biz=XXX&mid=XXX&idx=1&sn=XXX&chksm=XXX#wechat_redirect
このうち、__biz は WeChat パブリック アカウントの ID、mid は記事の ID、idx は記事のシリアル番号を表します。 、sn は記事の署名を表し、chksm はコンテンツ検証を表します。したがって、特定の公式アカウントのすべての記事をクロールしたい場合は、公式アカウントの ID を見つけて、それを使用して URL を構築する必要があります。このうち、biz_idは公式アカウントの一意の識別子です。
まず、公式アカウントの記事をクロールしたいので、多数の公式アカウントIDを含むリストを用意する必要があります。 ID の収集はさまざまな手段で行うことができます。ここでは、例として複数のテスト ID を含むリストを使用します。
biz_ids = ['MzU5MjcwMzA4MA==', 'MzI4MzMwNDgwMQ==', 'MzAxMTcyMzg2MA==']
次に、特定の公開アカウントのすべての記事をクロールするスパイダーを作成する必要があります。ここでは、公式アカウントの名前とIDをSpiderに渡し、異なる公式アカウントIDを扱えるようにします。
import scrapy import re class WeChatSpider(scrapy.Spider): name = "wechat" allowed_domains = ["mp.weixin.qq.com"] def __init__(self, name=None, biz_id=None): super().__init__(name=name) self.start_urls = ['https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={}==#wechat_redirect'.format(biz_id)] def parse(self, response): article_urls = response.xpath('//h4[1]/a/@href') for url in article_urls.extract(): yield scrapy.Request(url, callback=self.parse_article) next_page = response.xpath('//a[@id="js_next"]/@href') if next_page: yield scrapy.Request(response.urljoin(next_page[0].extract()), callback=self.parse) def parse_article(self, response): url = response.url title = response.xpath('//h2[@class="rich_media_title"]/text()') yield {'url': url, 'title': title.extract_first().strip()}
Spider の主な機能は、指定された公式アカウント ID を使用して公式アカウントのホームページにアクセスし、各ページを再帰的に走査してすべての記事の URL を抽出することです。さらに、parse_article メソッドを使用して、後続の処理のために記事の URL とタイトルを抽出します。全体として、このスパイダーはそれほど複雑ではありませんが、抽出速度は遅いです。
最後に、ターミナルで次のコマンドを入力して Spider を起動する必要があります:
scrapy crawl wechat -a biz_id=XXXXXXXX
同様に、複数の公式アカウントをクロールすることもできます。すべての公式アカウントの名前を指定するだけです。コマンド ID のみ:
scrapy crawl wechat -a biz_id=ID1,ID2,ID3
記事をクロールした後、記事のタイトルと URL をデータベース (例: MongoDB、MySQL など)。ここでは、pymongo ライブラリを使用してクロールされたデータを保存します。
import pymongo class MongoPipeline(object): collection_name = 'wechat' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db[self.collection_name].insert_one(dict(item)) return item
このパイプラインでは、データを保存するバックエンドとして MongoDB を使用します。このクラスは、他のデータベース システムを使用するために必要に応じて変更できます。
次に、settings.py ファイルでデータベース関連のパラメーターを構成する必要があります:
MONGO_URI = 'mongodb://localhost:27017/' MONGO_DATABASE = 'wechat' ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 300}
最後に、Spider で Pipeline を呼び出して、データを MongoDB に保存します:
class WeChatSpider(scrapy.Spider): name = "wechat" allowed_domains = ["mp.weixin.qq.com"] def __init__(self, name=None, biz_id=None): super().__init__(name=name) self.start_urls = ['https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={}==#wechat_redirect'.format(biz_id)] def parse(self, response): article_urls = response.xpath('//h4[1]/a/@href') for url in article_urls.extract(): yield scrapy.Request(url, callback=self.parse_article) next_page = response.xpath('//a[@id="js_next"]/@href') if next_page: yield scrapy.Request(response.urljoin(next_page[0].extract()), callback=self.parse) def parse_article(self, response): url = response.url title = response.xpath('//h2[@class="rich_media_title"]/text()') yield {'url': url, 'title': title.extract_first().strip()} pipeline = response.meta.get('pipeline') if pipeline: item = dict() item['url'] = url item['title'] = title.extract_first().strip() yield item
上記のコードでは、Response.meta.get('pipeline') を使用して Spider に設定した Pipeline オブジェクトを取得します。したがって、パイプラインをサポートするには、次のコードを Spider コードに追加するだけです:
yield scrapy.Request(url, callback=self.parse_article, meta={'pipeline': 1})
最後に、Scrapy や pandas などのライブラリを使用してデータを実装します。分析と可視化。
ここでは、MongoDB からクロールしたデータを抽出し、CSV ファイルに保存します。その後、パンダを使用して CSV ファイルを処理し、視覚化できます。
以下は実装プロセスです:
import pandas as pd from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client['wechat'] articles = db['wechat'] cursor = articles.find() doc = list(cursor) df = pd.DataFrame(doc) df.to_csv('wechat.csv', encoding='utf-8') df.groupby('biz_id')['title'].count().plot(kind='bar')
上記のコードでは、MongoDB ライブラリと Pandas ライブラリを使用して、クロールされたデータを CSV ファイルのデータ フォルダーに保存します。次に、Pandas の強力なデータ分析機能を使用して、各公開アカウントの記事数を視覚的に表示しました。
以上がScrapy は WeChat パブリック アカウント記事のクロールと分析を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。