[Python] Les informations de l'article de Qiita sont transférées dans mongoDB

Chose que tu veux faire

Obtenez des informations sur les articles Qiita avec l'API Qiita, quels articles et quelles balises sont souvent consultés? Je veux vérifier etc. Dans un premier temps, essayez d'enregistrer les informations acquises par l'API dans mongoDB.

Obtenir des informations sur l'article Qiita

Le contenu de cette fois est écrit en Python. Pour l'acquisition d'informations sur l'article, je me suis référé à l'article suivant.

Essayez d'utiliser l'API Qiita de Python

import requests
import logging
import json

formatter = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
logging.basicConfig(level=logging.WARNING, format=formatter)
logger = logging.getLogger(__name__)

class GetQiitaInfo(object):

    def __init__(self):
        self.token = 'your token'        

    def get_next_url(self, response):
 "" "S'il y a une page suivante, l'url est incluse sous la forme'rel =" next "', donc extrayez et renvoyez l'url.
 Sinon, renvoie None.

        link: <https://qiita.com/api/v2/authenticated_user/items?page=1>;
        rel="first", <https://qiita.com/api/v2/authenticated_user/items?page=2>;
        rel="next", <https://qiita.com/api/v2/authenticated_user/items?page=4>;
        rel="last"

        :param response:
 : return: URL suivante
        """
        link = response.headers['link']
        if link is None:
            return None

        links = link.split(',')

        for link in links:

            if 'rel="next"' in link:
                return link[link.find('<') + 1:link.find('>')]
        return None
      
    def get_items(self):
        
 "" "Pagenate pour obtenir tous les articles,
 Comme le nombre d'actions et le nombre de vues ne sont pas inclus dans la liste, les informations sont également ajoutées et renvoyées.

        :param token:
 : retour: Liste des articles
        """
        
        url = 'https://qiita.com/api/v2/authenticated_user/items'
        headers = {'Authorization': 'Bearer {}'.format(self.token)}

        items = []
        while True:
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            items.extend(json.loads(response.text))
            logger.info('GET {}'.format(url))
 # Vérifiez s'il existe la prochaine URL
            url = self.get_next_url(response)
            if url is None:
                break

 # Obtenez et ajoutez des informations de vue et de stock pour chaque article
 # page_views_count a un champ dans l'API de liste, mais null est renvoyé
        for item in items:

 #Nombre de vues
            url = 'https://qiita.com/api/v2/items/{}'.format(item['id'])
            logger.info('GET {}'.format(url))
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            itemJson = json.loads(response.text)
            item['page_views_count'] = itemJson['page_views_count']
            item['tag1'] = itemJson['tags'][0]['name']
            item['tag2'] = itemJson['tags'][1]['name'] if len(itemJson['tags']) >= 2 else ''
            item['tag3'] = itemJson['tags'][2]['name'] if len(itemJson['tags']) >= 3 else ''
            item['tag4'] = itemJson['tags'][3]['name'] if len(itemJson['tags']) >= 4 else ''
            item['tag5'] = itemJson['tags'][4]['name'] if len(itemJson['tags']) >= 5 else ''

            tag_list = []
            for i in range(len(itemJson['tags'])):
                tag_list.append(itemJson['tags'][i]['name'])
            item['tag_list'] = tag_list

 #Quantité en stock
            url = 'https://qiita.com/api/v2/items/{}/stockers'.format(item['id'])
            logger.info('GET {}'.format(url))
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            users = json.loads(response.text)
            for user in users:
                logger.info({
                    'id': user['id'],
                    'name': user['name']
                    })
            item['stocks_count'] = len(users)

        return items

Pour ma propre étude, j'ai apporté deux modifications à l'article auquel je faisais référence. ・ Classé ・ Ajout de tag1 à tag5 et tag_list

classe d'opération mongoDB

J'ai écrit un article sur le fonctionnement de mongoDB avant, mais il reste le même.

référence Fonctionnement de mongodb avec Python-Part 4: insert-

from pymongo import MongoClient

class MongoSample(object):

    def __init__(self, dbName, collectionName):
        self.client = MongoClient()
 self.db = self.client [dbName] #Définir le nom de la base de données
        self.collection = self.db.get_collection(collectionName)

    def find_one(self, projection=None,filter=None, sort=None):
        return self.collection.find_one(projection=projection,filter=filter,sort=sort)

    def find(self, projection=None,filter=None, sort=None):
        return self.collection.find(projection=projection,filter=filter,sort=sort)

    def insert_one(self, document):
        return self.collection.insert_one(document)

    def insert_many(self, documents):
        return self.collection.insert_many(documents)

Obtenez des informations sur l'article et enregistrez-le dans mongoDB

from get_qiita_info import GetQiitaInfo
from mongo_sample import MongoSample

# Obtenir des informations sur l'article Qiita
qiita = GetQiitaInfo()
items = qiita.get_items()

 arg1:DB Name
 arg2:Collection Name
mongo = MongoSample("db", "qiita")

# Si vous ne supprimez pas les valeurs de clé inutiles
 mongo.insert_many(items)
# Enregistrement groupé avec

for item in items:
 # rendu_body / body est inutile et supprimé
    item.pop("rendered_body")
    item.pop("body")
 # Inscrivez-vous un par un
    mongo.insert_one(item)

result = mongo.find_one()
print(result)

Jetons un coup d'œil à mongoDB après avoir exécuté le code ci-dessus.

> db.qiita.findOne()
{
        "_id" : ObjectId("5e38ff43c92e7c532aeffb47"),
        "coediting" : false,
        "comments_count" : 0,
        "created_at" : "2020-02-04T13:37:44+09:00",
        "group" : null,
        "id" : "331ae2289a95f5a9b901",
        "likes_count" : 0,
        "private" : false,
        "reactions_count" : 0,
        "tags" : [
                {
                        "name" : "Python",
                        "versions" : [ ]
                },
                {
                        "name" : "Python3",
                        "versions" : [ ]
                }
        ],
 "title": "[Python] Aucune valeur pour l'argument lui-même 'dans un appel de méthode non lié",
        "updated_at" : "2020-02-04T13:37:44+09:00",
        "url" : "https://qiita.com/bc_yuuuuuki/items/331ae2289a95f5a9b901",
        "user" : {
 "description": "J'apprends la blockchain / AI / Python / Golang / MongoDB, etc. \ r \ nLe contenu publié sur ce site est ma propre opinion, pas nécessairement ma position et ma stratégie dans mon organisation / entreprise. , Non représentatif de l’opinion. ",,
                "facebook_id" : "",
                "followees_count" : 0,
                "followers_count" : 2,
                "github_login_name" : null,
                "id" : "bc_yuuuuuki",
                "items_count" : 28,
                "linkedin_id" : "",
                "location" : "",
                "name" : "",
                "organization" : "",
                "permanent_id" : 476876,
                "profile_image_url" : "https://pbs.twimg.com/profile_images/1157834557783072768/ktpc9kGV_bigger.jpg ",
                "team_only" : false,
                "twitter_screen_name" : "bc_yuuuuuki",
                "website_url" : ""
        },
        "page_views_count" : 54,
        "tag1" : "Python",
        "tag2" : "Python3",
        "tag_list" : [
                "Python",
                "Python3"
        ],
        "stocks_count" : 0
}

J'ai pu confirmer qu'il était enregistré.

Impressions

Dans ce code, le résultat de l'acquisition d'API a été légèrement modifié, mais il est pratique de pouvoir rechercher et agréger le JSON acquis en frappant l'API sans penser à rien.

Recommended Posts

[Python] Les informations de l'article de Qiita sont transférées dans mongoDB
[Python] Obtenez des informations sur les utilisateurs et des articles sur l'API de Qiita
À propos du 02 février 2020 * Ceci est un article Python.
Qu'est-ce que python
Python est une instance
Qiita, premier Python ♪
Qu'est-ce que Python