1

Python で YouTube API を使用しています。作者の名前、日付、コメントの内容など、特定のビデオのすべてのコメントを既に収集できます。
別のコードを使用して、特定の作成者の個人情報 (年齢、性別、興味など) を抽出することもできます。しかし、私はそれらを一箇所で使用することはできません。つまり、コメントの作成者の名前とすべての作成者の個人情報を含む、ビデオのすべてのコメントを収集する必要があります。以下は私が開発したコードです。しかし、処理方法と問題の場所がわからない「RequestError」が表示されます。

 import gdata.youtube
import gdata.youtube.service

yt_service = gdata.youtube.service.YouTubeService()
f = open('test1.csv','w')
f.writelines(['UserName',',','Age',',','Date',',','Comment','\n'])

def GetAndPrintVideoFeed(string1):

        yt_service = gdata.youtube.service.YouTubeService()
        user_entry = yt_service.GetYouTubeUserEntry(username = string1)
        X = PrintentryEntry(user_entry)
        return X

def PrintentryEntry(entry):

        # print required fields where we know there will be information
        Y = entry.age.text
        return Y

def GetComment(next1):

        yt_service = gdata.youtube.service.YouTubeService()
        nextPageFeed = yt_service.GetYouTubeVideoCommentFeed(next1)

        for comment_entry in nextPageFeed.entry:

            string1 = comment_entry.author[0].name.text.split("/")[-1]
            Z = GetAndPrintVideoFeed(string1)
            string2 = comment_entry.updated.text.split("/")[-1]
            string3 = comment_entry.content.text.split("/")[-1]

            f.writelines( [str(string1),',',Z,',',string2,',',string3,'\n'])

        next2 = nextPageFeed.GetNextLink().href
        GetComment(next2)

video_id = '8wxOVn99FTE'
comment_feed = yt_service.GetYouTubeVideoCommentFeed(video_id=video_id)

for comment_entry in comment_feed.entry:

        string1 = comment_entry.author[0].name.text.split("/")[-1]
        Z = GetAndPrintVideoFeed(string1)
        string2 = comment_entry.updated.text.split("/")[-1]
        string3 = comment_entry.content.text.split("/")[-1]

        f.writelines( [str(string1),',',Z,',',string2,',',string3,'\n'])

next1 = comment_feed.GetNextLink().href
GetComment(next1)
4

1 に答える 1

1

Youtube API と、すべてがどのように関連しているかについて、よりよく理解する必要があると思います。複数のタイプのフィードまたはエントリを処理し、gdata の一貫性のないパラメーター規則を「修正」できるラッパー クラスを作成しました。

以下は、それほど困難なくスクレイピング/クロールを一般化する方法を示すスニペットです。

これがあなたの質問に直接答えているわけではないことはわかっています。より高度な設計ですが、大量の youtube/gdata データのプルを行う場合は検討する価値があります。

def get_feed(thing=None, feed_type=api.GetYouTubeUserFeed):

    if feed_type == 'user':
        feed = api.GetYouTubeUserFeed(username=thing)

    if feed_type == 'related':
        feed = api.GetYouTubeRelatedFeed(video_id=thing)

    if feed_type == 'comments':
        feed = api.GetYouTubeVideoCommentFeed(video_id=thing)

    feeds = []
    entries = []

    while feed:
        feeds.append(feed)
        feed = api.GetNext(feed)

    [entries.extend(f.entry) for f in feeds]

    return entries

...

def myget(url,service=None):

    def myconverter(x):
        logfile = url.replace('/',':')+'.log'
        logfile = logfile[len('http://gdata.youtube.com/feeds/api/'):]
        my_logger.info("myget: %s" % url)

        if service == 'user_feed':
            return gdata.youtube.YouTubeUserFeedFromString(x)

        if service == 'comment_feed':
            return gdata.youtube.YouTubeVideoCommentFeedFromString(x)

        if service == 'comment_entry':
            return gdata.youtube.YouTubeVideoCommentEntryFromString(x)

        if service == 'video_feed':
            return gdata.youtube.YouTubeVideoFeedFromString(x)

        if service == 'video_entry':
            return gdata.youtube.YouTubeVideoEntryFromString(x)


    return api.GetWithRetries(url,
            converter=myconverter,
            num_retries=3,
            delay=2,
            backoff=5,
            logger=my_logger
            )


mapper={}
mapper[api.GetYouTubeUserFeed]='user_feed'
mapper[api.GetYouTubeVideoFeed]='video_feed'
mapper[api.GetYouTubeVideoCommentFeed]='comment_feed'

https://gist.github.com/2303769 data/service.py (ルーティング)

于 2012-04-04T16:59:20.790 に答える