Saya memiliki df yang berisi satu set videoID dari YT:

import pandas as pd

data = {'Order':  ['1', '2', '3'],
        'VideoID': ['jxwHmAoKte4', 'LsXM502SpiU','1I3f27iQ4pM']
        }

df = pd.DataFrame (data, columns = ['Order','VideoID'])

print (df) 

Dan ingin mengunduh deskripsi video dan menyimpannya di df yang sama di kolom tambahan.

Saya mencoba menggunakan youtube_dl di Jupyter dengan cara ini:

import youtube_dl

def all_descriptions(URL):
    videoID=df['VideoId']
    URL = 'https://www.youtube.com/watch?v=' + videoID
    ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
   
    try:
        youtube_dl.YoutubeDL(ydl_opts).download(URL)
        return webpage

except:
    pass

df['descriptions']=all_descriptions(URL)

Saya melihat keluaran kode sebagai teks, tetapi dalam df hanya "Tidak Ada" sebagai teks kolom.

Jelas saya tidak dapat mengangkut output fungsi ke df dengan cara yang benar.

Bisakah Anda menyarankan cara melakukannya dengan benar?

Terima kasih sebelumnya atas bantuannya.

0
Elena 11 Januari 2021, 18:51

2 jawaban

Jawaban Terbaik

@perl Saya memodifikasi df untuk memasukkan dua URL yang menyebabkan dua jenis kesalahan:

import pandas as pd

data = {'Order':  ['1', '2', '3', '4', '5'],
        'VideoId': ['jxwHmAoKte4', 'LsXM502SpiU','1I3f27iQ4pM', 'MGQOX2rK5s', 'wNayw_E7lIA']
        }

df = pd.DataFrame (data, columns = ['Order','VideoId'])

print (df)

Kemudian saya mengujinya seperti yang Anda sarankan, termasuk definisi saya tentang ydl_opts:

videoID=df['VideoId']
URL = 'https://www.youtube.com/watch?v=' + videoID
ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
    
df['description'] = [
    youtube_dl.YoutubeDL(ydl_opts).extract_info(
        u, download=False)['description'] for u in URL]

df

Mencapai kesalahan pertama saya mendapatkan output:

TypeError: 'NoneType' object is not subscriptable

Setelah itu saya mengganti 'forcedescription' dalam kode saya dengan 'extract_info':

def all_descriptions(URL):
    videoID=df['VideoId']
    URL = 'https://www.youtube.com/watch?v=' + videoID
    ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
   
    try:
        youtube_dl.YoutubeDL(ydl_opts).download(URL)
        return webpage
    
    except:
        pass

Itu melewatkan semua kesalahan, tetapi sebagai hasilnya tidak ada apa pun di kolom 'deskripsi'.

Ada saran?

0
Elena 12 Januari 2021, 08:59

Anda dapat menggunakan metode extract_info:

df['description'] = [
    youtube_dl.YoutubeDL().extract_info(
        u, download=False)['description'] for u in URL]

df

Keluaran:

  Order      VideoID                                        description
0     1  jxwHmAoKte4  Bundesweit gelten sie nun ab heute, die schärf...
1     2  LsXM502SpiU  Wie sicher ist der Impfstoff? Wäre eine Impfpf...
2     3  1I3f27iQ4pM  Impfen ja oder nein, diese Frage stellen sich ...

P.S. Parameter forcedescription hanya mencetak deskripsi ke output standar, tidak mengembalikannya

Pembaruan: extract_info mengembalikan None jika gagal, jadi jika kami memiliki video yang mungkin gagal sebelum mendapatkan deskripsi dari info, kami dapat memeriksa bahwa info tersebut tidak None:

ydl = youtube_dl.YoutubeDL(ydl_opts)
infos = [ydl.extract_info(u, download=False) for u in URL]
df['description'] = [
    info['description'] if info is not None else ''
    for info in infos]
0
perl 12 Januari 2021, 14:36