スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Google YouTube APIを活用して特定のキーワードのタイトルをがっつり落とす②

前回gdata-python-clientは、gdata-2.0.10を前提で書いていると説明しましたが、テストする環境においては、少なくともバージョンはあわせたほうが苦労は少ないと思います。
バージョンによってリファレンスも変わることもあるので・・・。

さて、今回はAPIを用いて検索する部分を書いていきます。

・YouTube API検索
YouTube APIのクラスを呼び出しで検索クエリをセットします。
50以上結果が帰ってきた場合は、検索を繰り返します。
APIの仕様で、1000以上は返さないので1000まででストップします。


#YouTube検索
def get_yt_video_list(p_obj):

global yt_sea_idx

#サービスの初期化
yt_service = gdata.youtube.service.YouTubeService()
#The YouTube API does not currently support HTTPS/SSL access.
yt_service.ssl = False
query = gdata.youtube.service.YouTubeVideoQuery()

#クエリのフォーマット
query.vq = yt_sea_key
if yt_sea_user != '':
query.author = yt_sea_user
query.orderby = 'viewCount' #relevance(関連性), viewCount(視聴数), published(公開日), rating(評価)
query.racy = 'include' #制限付きコンテンツを許可
query.format = "5"
query.start_index = yt_sea_idx #開始1~
query.max_results = yt_sea_max #最大50

#検索の実行
while 1:
print u'検索中(%d-)...' % yt_sea_idx
feed = yt_service.YouTubeQuery(query)
get_result(p_obj, feed)

#検索最大値セット
if yt_sea_idx == 1:
if feed.total_results.text > 1000: #1000固定値
total_result = 1000 #1000固定値
else:
total_result = feed.total_results.text

#次検索開始位置セット
yt_sea_idx = yt_sea_idx + yt_sea_max
query.start_index = yt_sea_idx

#検索最大値より次検索開始位置が大きい場合は終了
if yt_sea_idx > total_result:
break

print u'total : %s(%s)' % (feed.total_results.text, len(result_list))


・検索結果をリストに取り込み
検索結果から、ダウンロードに必要な情報だけ取り込みます。
1タイトル毎に辞書に入れ、最初に定義したresult_listに入れておきます。


#検索結果を取り込む
def get_result(p_obj, feed):

global result_list

for entry in feed.entry:

try:
#video_id取得
p = p_obj['video_id'].search(entry.id.text)
video_id = p.group(1)
except:
print u'###### video_id 取得に失敗 ######'
write_err_log(u'id abort', entry.id.text)

result_list.append({u'id' : video_id,
u'title' : uni_conv(entry.media.title.text),
u'date' : entry.published.text,
u'desc' : uni_conv(entry.media.description.text),
u'sec' : entry.media.duration.seconds,
u'url' : entry.media.player.url})


・タイトル毎のidを抽出
タイトル毎のid、後々に活用できそうなので、取り出しておきます。
ついでに、あとで活用するフォーマットリストやタイプもあらかじめコンパイルしておきます。


#正規表現をあらかじめコンパイルしておく関数
def create_re_obj():

precompile = {}

precompile['video_id'] = re.compile(u'http:\/\/gdata.youtube.com\/feeds\/videos\/(.*?)$')

precompile['fmt_list'] = re.compile(u'&fmt_list=(.*?)&')
precompile['fmt_type'] = re.compile(u'(\d+)\/\d+x')
precompile['fmt_url'] = re.compile(u'&fmt_url_map=(?P\d+)%7C(?Phttp.*?)%2C\d')

return precompile



・エラーログを保存
無人でダウンロードするにあたって、エラーが発生したのかどうかわからないため、コンソールだけですなくログに保存するようにしておきます。


#エラーログ出力
def write_err_log(err_type, text):

f = open(dl_forder + 'error_log.txt', 'a')
err_time = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())
line = '%s : %s - %s\r' % (err_time, err_type , text)
f.write(line)
f.close()


・検索結果の日本語を正しく取り込む
コンソールへ出力する際に文字化けが発生するため、Unicodeへ変換しておきます。


#UTF-8からUnicodeへ変換
def uni_conv(s):

try:
u_text = unicode(s, 'utf-8')
except:
u_text = s

return u_text


以上で検索部分は完成です。
Google YouTube APIを活用して特定のキーワードのタイトルをがっつり落とす③に続く
関連記事
スポンサーサイト

tag : Python Portable gdata

コメント

Secret

プロフィール

cherrypy

Author:cherrypy
四方山話とか、にわかプログラミングなどについて語ります。

カウンター
はてな人気エントリー
最新記事
スポンサードリンク
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。