[PYTHON]

Was Sie tun möchten Holen Sie sich Qiita-Artikelinformationen mit der Qiita-API und welche Artikel und welche Tags werden häufig angezeigt? Ich möchte überprüfen usw. Versuchen Sie als ersten Schritt, die von der API erfassten Informationen in mongoDB zu registrieren. Abrufen der Artikelinformationen von Qiita Diesmal wird der Inhalt in Python geschrieben. Für die Erfassung von Artikelinformationen habe ich auf den folgenden Artikel verwiesen.

Versuchen Sie, die Qiita-API von Python zu verwenden

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):
 "" "Wenn es eine nächste Seite gibt, ist die URL als" rel = "next" "enthalten. Extrahieren Sie die URL und geben Sie sie zurück.
 Wenn nicht, wird None zurückgegeben.

        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: Nächste URL
        """
        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, um alle Artikel zu erhalten,
 Da die Anzahl der Bestände und die Anzahl der Ansichten nicht in der Liste enthalten sind, werden die Informationen ebenfalls hinzugefügt und zurückgegeben.

        :param token:
 : return: Liste der Artikel
        """
        
        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))
 # Überprüfen Sie, ob es die nächste URL gibt
            url = self.get_next_url(response)
            if url is None:
                break

 # Abrufen und Hinzufügen von Ansichts- und Bestandsinformationen für jeden Artikel
 # page_views_count hat ein Feld in der Listen-API, aber null wird zurückgegeben
        for item in items:

 #Anzahl der Ansichten
            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

 #Bestandsmenge
            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

Für meine eigene Studie habe ich zwei Änderungen gegenüber dem Artikel vorgenommen, auf den ich mich bezog. ・ Klassifiziert ・ Tag1 zu tag5 und tag_list hinzugefügt

mongoDB-Operationsklasse

Ich habe bereits einen Artikel über die MongoDB-Operation geschrieben, aber er bleibt derselbe.

Referenz Betrieb von Mongodb mit Python-Teil 4: Einfügen-

from pymongo import MongoClient

class MongoSample(object):

    def __init__(self, dbName, collectionName):
        self.client = MongoClient()
 self.db = self.client [dbName] #Stellen Sie den DB-Namen ein
        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)

Holen Sie sich Artikelinformationen und registrieren Sie diese in mongoDB

from get_qiita_info import GetQiitaInfo
from mongo_sample import MongoSample

# Informationen zu Qiita-Artikeln erhalten
qiita = GetQiitaInfo()
items = qiita.get_items()

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

# Wenn Sie keine unnötigen Schlüsselwerte löschen
 mongo.insert_many(items)
# Massenregistrierung mit

for item in items:
 # rendered_body / body ist unnötig und wird gelöscht
    item.pop("rendered_body")
    item.pop("body")
 # Registrieren Sie sich nacheinander
    mongo.insert_one(item)

result = mongo.find_one()
print(result)

Schauen wir uns mongoDB an, nachdem wir den obigen Code ausgeführt haben.

> 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] Kein Wert für das Argument selbst 'im ungebundenen Methodenaufruf",
        "updated_at" : "2020-02-04T13:37:44+09:00",
        "url" : "https://qiita.com/bc_yuuuuuki/items/331ae2289a95f5a9b901",
        "user" : {
 "description": "Ich lerne Blockchain / AI / Python / Golang / MongoDB usw. \ r \ nDer auf dieser Website veröffentlichte Inhalt ist meine eigene Meinung, nicht unbedingt meine Position und Strategie in meiner Organisation / Firma. , Nicht repräsentativ für die Meinung. ",,
                "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
}

Ich konnte bestätigen, dass es registriert war.

Impressionen

In diesem Code wurde das Ergebnis der API-Erfassung geringfügig geändert. Es ist jedoch praktisch, den durch Aufrufen der API erfassten JSON suchen und aggregieren zu können, ohne an irgendetwas zu denken.

Recommended Posts