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.
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
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)
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é.
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