Maison  >  Article  >  développement back-end  >  Scrapy implémente l'exploration et l'analyse des articles du compte public WeChat

Scrapy implémente l'exploration et l'analyse des articles du compte public WeChat

WBOY
WBOYoriginal
2023-06-22 09:41:241787parcourir

Scrapy met en œuvre l'exploration d'articles et l'analyse des comptes publics WeChat

WeChat est une application de médias sociaux populaire ces dernières années, et les comptes publics qui y opèrent jouent également un rôle très important. Comme nous le savons tous, les comptes publics WeChat sont un océan d’informations et de connaissances, car chaque compte public peut publier des articles, des messages graphiques et d’autres informations. Ces informations peuvent être largement utilisées dans de nombreux domaines, tels que les reportages médiatiques, la recherche universitaire, etc.

Donc, cet article présentera comment utiliser le framework Scrapy pour explorer et analyser les articles du compte public WeChat. Scrapy est un framework de robot d'exploration Web Python dont la fonction principale est l'exploration de données et la recherche d'informations. Par conséquent, Scrapy est très personnalisable et efficace.

  1. Installez Scrapy et créez un projet

Pour utiliser le framework Scrapy pour l'exploration, vous devez d'abord installer Scrapy et d'autres dépendances. Vous pouvez utiliser la commande pip pour installer. Le processus d'installation est le suivant :

pip install scrapy
pip install pymongo
pip install mysql-connector-python

Après avoir installé Scrapy, nous devons utiliser l'outil de ligne de commande Scrapy pour créer le projet. La commande est la suivante :

scrapy startproject wechat

Après avoir exécuté cette commande, Scrapy créera un projet nommé "wechat" et créera de nombreux fichiers et répertoires dans le répertoire du projet.

  1. Implémenter l'exploration des articles du compte public WeChat

Avant de commencer l'exploration, nous devons d'abord comprendre l'URL de la page de l'article du compte public WeChat Format. L'URL d'une page d'article de compte public WeChat typique ressemble à ceci :

https://mp.weixin.qq.com/s?__biz=XXX&mid=XXX&idx=1&sn=XXX&chksm=XXX#wechat_redirect

où, __biz représente l'ID du compte public WeChat, mid représente l'ID de l'article, idx représente le numéro de série du article, et sn représente la signature de l'article. chksm signifie vérification du contenu. Par conséquent, si nous voulons explorer tous les articles d’un certain compte officiel, nous devons trouver l’ID du compte officiel et l’utiliser pour créer l’URL. Parmi eux, biz_id est l'identifiant unique du compte officiel.

Tout d'abord, nous devons préparer une liste contenant de nombreux identifiants de comptes officiels, car nous souhaitons explorer les articles de ces comptes officiels. La collecte des identifiants peut être réalisée par divers moyens. Ici, nous utilisons une liste contenant plusieurs identifiants de test à titre d'exemple :

biz_ids = ['MzU5MjcwMzA4MA==', 'MzI4MzMwNDgwMQ==', 'MzAxMTcyMzg2MA==']

Ensuite, nous devons écrire un Spider pour explorer tous les articles d'un certain compte public. Ici, nous transmettons le nom et l'identifiant du compte officiel à Spider afin que nous puissions gérer différents identifiants de compte officiel.

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()}

La fonction principale de Spider est d'utiliser un identifiant de compte officiel donné pour accéder à la page d'accueil du compte officiel, puis de parcourir de manière récursive chaque page pour extraire les URL de tous les articles. De plus, la méthode parse_article est utilisée pour extraire l'URL et le titre de l'article pour un traitement ultérieur. Dans l’ensemble, cette araignée n’est pas très complexe, mais la vitesse d’extraction est lente.

Enfin, nous devons entrer la commande suivante dans Terminal pour démarrer Spider :

scrapy crawl wechat -a biz_id=XXXXXXXX

De même, nous pouvons également explorer plusieurs comptes publics, il suffit de le spécifier dans la commande. Utilisez simplement le ID de tous les comptes publics :

scrapy crawl wechat -a biz_id=ID1,ID2,ID3
  1. Stockage des données d'article

Après avoir exploré l'article, nous devons enregistrer le titre et l'URL de l'article à la base de données (comme MongoDB, MySQL, etc.). Ici, nous utiliserons la bibliothèque pymongo pour enregistrer les données analysées.

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

Dans ce pipeline, nous utilisons MongoDB comme backend pour stocker les données. Cette classe peut être modifiée selon les besoins pour utiliser d'autres systèmes de bases de données.

Ensuite, nous devons configurer les paramètres liés à la base de données dans le fichier settings.py :

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'wechat'
ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 300}

Enfin, nous appelons Pipeline dans Spider pour stocker les données dans 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

Dans le code ci-dessus, Response.meta.get('pipeline') est utilisé pour obtenir l'objet Pipeline que nous avons défini dans Spider. Par conséquent, ajoutez simplement le code suivant au code Spider pour prendre en charge Pipeline :

yield scrapy.Request(url, callback=self.parse_article, meta={'pipeline': 1})

    Data Analysis
Enfin, nous utiliserons des bibliothèques telles que Scrapy et pandas sont utilisés pour analyser et visualiser les données.

Ici, nous allons extraire les données que nous avons explorées de MongoDB et les enregistrer dans un fichier CSV. Par la suite, nous pouvons utiliser des pandas pour traiter et visualiser le fichier CSV.

Voici le processus d'implémentation :

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')

Dans le code ci-dessus, nous utilisons les bibliothèques MongoDB et Pandas pour enregistrer les données analysées dans le dossier de données du fichier CSV. Par la suite, nous avons utilisé la puissante fonction d’analyse de données de Pandas pour afficher visuellement le nombre d’articles de chaque compte officiel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn