Scrapy melaksanakan rangkak dan analisis artikel akaun awam WeChat
WeChat ialah aplikasi media sosial yang popular sejak beberapa tahun kebelakangan ini, dan akaun awam yang beroperasi di dalamnya juga memainkan peranan yang sangat penting. Seperti yang kita sedia maklum, akaun awam WeChat adalah lautan maklumat dan pengetahuan, kerana setiap akaun awam boleh menerbitkan artikel, mesej grafik dan maklumat lain. Maklumat ini boleh digunakan secara meluas dalam banyak bidang, seperti laporan media, penyelidikan akademik, dsb.
Jadi, artikel ini akan memperkenalkan cara menggunakan rangka kerja Scrapy untuk merangkak dan menganalisis artikel akaun awam WeChat. Scrapy ialah rangka kerja perangkak web Python yang fungsi utamanya ialah perlombongan data dan carian maklumat. Oleh itu, Scrapy sangat boleh disesuaikan dan cekap.
Untuk menggunakan rangka kerja Scrapy untuk merangkak, anda perlu memasang Scrapy dan kebergantungan lain terlebih dahulu. Anda boleh menggunakan arahan pip untuk memasang Proses pemasangan adalah seperti berikut:
pip install scrapy pip install pymongo pip install mysql-connector-python
Selepas memasang Scrapy, kita perlu menggunakan alat baris arahan Scrapy untuk mencipta projek. Perintahnya adalah seperti berikut:
scrapy startproject wechat
Selepas melaksanakan arahan ini, Scrapy akan mencipta projek bernama "wechat" dan mencipta banyak fail dan direktori dalam direktori projek.
Sebelum kami mula merangkak, kami perlu terlebih dahulu memahami format URL halaman artikel akaun awam WeChat. URL halaman artikel akaun awam WeChat biasa kelihatan seperti ini:
https://mp.weixin.qq.com/s?__biz=XXX&mid=XXX&idx=1&sn=XXX&chksm=XXX#wechat_redirect
Antaranya, __biz mewakili ID akaun awam WeChat, pertengahan mewakili ID artikel, idx mewakili nombor siri artikel , sn mewakili tandatangan artikel dan chksm mewakili Pengesahan kandungan. Oleh itu, jika kami ingin merangkak semua artikel akaun rasmi tertentu, kami perlu mencari ID akaun rasmi dan menggunakannya untuk membina URL. Antaranya, biz_id ialah pengecam unik akaun rasmi.
Pertama, kami perlu menyediakan senarai yang mengandungi banyak ID akaun rasmi, kerana kami ingin merangkak artikel akaun rasmi ini. Pengumpulan ID boleh dicapai melalui pelbagai cara. Di sini, kami menggunakan senarai yang mengandungi beberapa ID ujian sebagai contoh:
biz_ids = ['MzU5MjcwMzA4MA==', 'MzI4MzMwNDgwMQ==', 'MzAxMTcyMzg2MA==']
Seterusnya, kami perlu menulis Spider untuk merangkak semua artikel akaun awam tertentu. Di sini, kami menyerahkan nama dan ID akaun rasmi kepada Spider supaya kami boleh mengendalikan ID akaun rasmi yang berbeza.
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()}
Fungsi utama Spider ialah menggunakan ID akaun rasmi yang diberikan untuk mengakses halaman utama akaun rasmi, dan kemudian melintasi setiap halaman secara rekursif untuk mengekstrak URL semua artikel. Selain itu, kaedah parse_article digunakan untuk mengekstrak URL dan tajuk artikel untuk pemprosesan seterusnya. Secara keseluruhan, labah-labah ini tidak begitu kompleks, tetapi kelajuan pengekstrakan adalah perlahan.
Akhir sekali, kita perlu memasukkan arahan berikut dalam Terminal untuk memulakan Spider:
scrapy crawl wechat -a biz_id=XXXXXXXX
Begitu juga, kita juga boleh merangkak berbilang akaun rasmi, cuma nyatakan nama semua akaun rasmi dalam arahan Just ID:
scrapy crawl wechat -a biz_id=ID1,ID2,ID3
Selepas merangkak artikel, kita perlu menyimpan tajuk dan URL artikel ke pangkalan data (seperti MongoDB, MySQL , dsb.). Di sini, kami akan menggunakan perpustakaan pymongo untuk menyimpan data yang dirangkak.
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
Dalam Pipeline ini, kami menggunakan MongoDB sebagai bahagian belakang untuk menyimpan data. Kelas ini boleh diubah suai mengikut keperluan untuk menggunakan sistem pangkalan data lain.
Seterusnya, kami perlu mengkonfigurasi parameter berkaitan pangkalan data dalam fail settings.py:
MONGO_URI = 'mongodb://localhost:27017/' MONGO_DATABASE = 'wechat' ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 300}
Akhir sekali, kami memanggil Pipeline dalam Spider untuk menyimpan data ke dalam 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
Dalam kod di atas, response.meta.get('pipeline') digunakan untuk mendapatkan objek Pipeline yang kami tetapkan dalam Spider. Oleh itu, tambahkan kod berikut pada kod Spider untuk menyokong Pipeline:
yield scrapy.Request(url, callback=self.parse_article, meta={'pipeline': 1})
Akhir sekali, kami akan menggunakan perpustakaan seperti Scrapy dan panda untuk Melaksanakan data analisis dan visualisasi.
Di sini kami akan mengekstrak data yang kami rangkak daripada MongoDB dan menyimpannya ke fail CSV. Selepas itu, kami boleh menggunakan panda untuk memproses dan menggambarkan fail CSV.
Berikut ialah proses pelaksanaan:
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')
Dalam kod di atas, kami menggunakan perpustakaan MongoDB dan Pandas untuk menyimpan data yang dirangkak ke dalam folder data fail CSV. Selepas itu, kami menggunakan fungsi analisis data Pandas yang berkuasa untuk memaparkan secara visual bilangan artikel bagi setiap akaun awam.
Atas ialah kandungan terperinci Scrapy melaksanakan rangkak dan analisis artikel akaun awam WeChat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!