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