[PYTHON] Ich habe versucht, YOUTUBE Data API V3 zu verwenden

Überblick

Ich habe versucht, die youtube Data API V3 im Scraping Primer zu verwenden. Ich stecke auf verschiedene Weise fest, also werde ich eine Spur hinterlassen.

Code implementiert

youtube_api_metadata.py


import os
import logging
import csv

from apiclient.discovery import build
from pymongo import MongoClient, ReplaceOne, DESCENDING
from typing import Iterator, List

from pymongo.collection import Collection

YOUTUBE_API_KEY=os.environ['YOUTUBE_API_KEY']

logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)


def main():

    mongo_client = MongoClient('localhost', 27017)
    collections = mongo_client.youtube.videos

    query = input('Bitte geben Sie den Suchwert an.:')

    for items_per_page in  search_videos(query):
        save_to_momgo(collections, items_per_page)

    save_to_csv(collections)





def search_videos(query: str, max_pages: int=5):

    youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)

    search_request = youtube.search().list(
        part='id',
        q=query,
        type='video',
        maxResults=15,
    )

    i = 0
    while search_request and i < max_pages:
        search_response = search_request.execute()

        video_ids = [item['id']['videoId'] for item in search_response['items']]
        video_response = youtube.videos().list(
            part='snippet,statistics',
            id=','.join(video_ids),
        ).execute()

        yield video_response['items']

        search_requst = youtube.search().list_next(search_request, search_response)
        i += 1


def save_to_momgo(collection: Collection, items: List[dict]):

    for item in items:
        item['_id'] = item['id']


        for key, value in item['statistics'].items():
            item['statistics'][key] = int(value)

    operation = [ReplaceOne({'_id': item['_id']}, item, upsert=True) for item in items]
    result = collection.bulk_write(operation)
    logging.info(f'Upserted {result.upserted_count} documents.')




def save_to_csv(collection: Collection):

    with open('top_videos_list.csv', 'w',newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, ['title', 'viewCount'])
        writer.writeheader()
        for item in collection.find().sort('statistics.viewCount', DESCENDING):
            writer.writerows([{'title' : item['snippet']['title'], 'viewCount': item['statistics']['viewCount']}])






if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    main()

Verstopfen ①

Nach dem Implementieren und mehrmaligen Ausführen des Codes tritt der folgende Fehler auf.

sample.py


googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/youtube/v3/videos?part=snippet%2Cstatistics&id=wXeR58bjCak%2CujxXyCrDnU0%2CQhhUVI0sxCc%2CKZz-7KSMjZA%2CWq-WeVQoE6U%2CG-qWwfG9mBE%2CYqUwEPSZQGQ%2CIuopzT_TWPQ%2CmcFspy1WhL8%2Ck9dcl7F6IFY%2C--Z5cvZ4JEw%2C3hidJgc9Zyw%2CdYSmEkcM_8s%2Ch6Hc4RuK8D8%2CRQfN2re3u4w&key=<YOUTUBE_API_KEY>&alt=json returned "The request cannot be completed because you have exceeded your <a href="/youtube/v3/getting-started#quota">quota</a>.">

Zuerst war ich mir nicht sicher, also suchte ich nach der Ursache.

Infolgedessen scheint die Ursache lediglich die Beschränkung der Verwendung von "Quoten" gewesen zu sein. Erstellen Sie ein neues Projekt aus GCP und geben Sie auf der Registerkarte Authentifizierung einen neuen API-Schlüssel aus. Setzen Sie den Schlüssel auf die unten stehende Umgebungsvariable und führen Sie die Python-Datei erneut aus.

set YOUTUBE_API_KEY=<YOUTUBE_API_KEY>

Infolgedessen wurde es ohne Probleme ausgeführt und eine CSV-Datei ausgegeben.

(scraping3.7) C:\Users\user\scraping3.7\files>python  save_youtube_videos_matadata.py
Bitte geben Sie den Suchwert an.:Hikakin
INFO:root:Upserted 15 documents.
INFO:root:Upserted 0 documents.
INFO:root:Upserted 0 documents.
INFO:root:Upserted 0 documents.
INFO:root:Upserted 0 documents.

image.png

Verstopfen ②

Von dem obigen Code sind die folgenden nicht sehr klar. Ich konnte nicht anders, als die Entwicklung zu stoppen.

operation = [ReplaceOne({'_id': item['_id']}, item, upsert=True) for item in items]

Als Ergebnis offizieller Untersuchungen wurde festgestellt, dass das Argument im folgenden Format eingeht. Offiziell

ReplaceOne(filter, replacement, options)

In den folgenden Fällen

ReplaceOne({'city': 'Tokio'}, {'city':'Gunma'}, upsert=True)

Wenn Daten von 'Stadt': 'Tokio' vorhanden sind, aktualisieren Sie auf Stadt ':' Gunma '. Wenn 'Stadt': 'Tokio' nicht existiert, fügen Sie eine neue 'Stadt' ein: 'Gunma'.

Nachschlagewerk

amazon Python Crawling & Scraping [Erweiterte und überarbeitete Ausgabe] - Praktisches Entwicklungshandbuch für die Datenerfassung und -analyse

Recommended Posts

Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die checkio-API zu verwenden
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Spielen Sie mit der YouTube Data API v3 mit dem Google API Python Client
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, die Detect Labels-API von AWS Rekognition zu verwenden
Ich habe versucht, Remote API mit GAE / J zu verwenden
[Python] Holen Sie sich alle Kommentare mit Youtube Data Api
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Laden Sie Videos mit der YouTube-API hoch
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Ich habe APN (Remote-Benachrichtigung) mithilfe der Parse.com-REST-API ausprobiert
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, die Gesichtserkennungs-API von Microsoft für Cognitive Services zu verwenden
Ich habe versucht, scRNA-seq-Daten mithilfe der topologischen Datenanalyse (TDA) zu analysieren.
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen