質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

AttributeError: module 'urllib' has no attribute 'urlopen'

削除済ユーザー
削除済ユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

1909閲覧

投稿2019/11/18 08:28

編集2022/01/12 10:58

環境:Python3.5/CENTOS7/さくらのVPS

pythonでimportがうまくいかない【Webスクレイピング】
https://teratail.com/questions/84432
と同様のエラーが出ているが3日かけても解消できずに質問。

解消したいエラーメッセージ

Traceback (most recent call last):
File "/var/www/cgi-bin/ai.py", line 123, in <module>
next, captions = get_youtube_caption(channel_id, after, before, next)
File "/var/www/cgi-bin/ai.py", line 58, in get_youtube_caption
request = urllib.urlopen(
AttributeError: module 'urllib' has no attribute 'urlopen'

前提・実現したいこと

こちらの、かわみさんがやっているキズナアイの発言を収集するプログラムを写経して動かしたい
http://kawami.hatenablog.jp/entry/2018/07/30/224512
質問主はPython初挑戦(RNN言語モデル作成とは程遠いレベル)
Python2.7.5でYoutubeDataAPIとMecabを最低限動作させることはできた。

工程

Youtube DataAPIを使うために、Oauthのaccess_tokenとrefresh_tokenを取得
→こちらのヒメカンさんのツールに頼って発行
https://himakan.net/tool/get_google_oauth_api_token

サンプルコードをコピペして、必要なパッケージをインストールしてエラーを解消していく

"Channels: list"APIで、キズナアイの動画のリストを取得:動かない(←イマココ)
"Captions: list"APIで、動画に付与された字幕のリストを取得:動かない
"Captions: download"APIで、字幕をダウンロード:動かない

RNN言語モデル作成(ゴール)

実行環境

VPS(CENTOS7)に、Python3.5をインストールし、https://domain/cgi-bin/hoge.pyファイルを直接編集して、URLをブラウザで表示しています。
エラーは、/var/log/error_log.log を都度開いて確認しています。
「解消したいエラーメッセージ」が出てくる、というよりは、書き込まれているのをいちいちファイルを開いて確認しています。なお、Teratermからコマンドで実行しても、エラー内容、実行結果は同じです。
本当はPycharmやコマンドからエラー付きで即時表示(実行)すべきなのは頭では理解しています。。

該当のソースコード

Python3.5

#!/usr/bin/python # -*- coding:utf-8 -*- from urllib import request as urllib import urllib import json import datetime import requests import codecs import http.server import sys import io import ssl ssl._create_default_https_context = ssl._create_unverified_context sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') from urllib.error import HTTPError print ('Content-Type: text/html;charset=utf-8\n') print ('HELLO3') key = "" access_token = "" _refresh_token = "" def get_access_token(): url = "https://accounts.google.com/o/oauth2/token" s = requests.Session() params = {"code": input("code>>"), "client_id": input("client_id>>"), "client_secret": input("client_secret>>"), "redirect_uri": input("redirect_uri>>"), "grant_type": "authorization_code"} r = s.post(url, data=params) print(r.text.encode("utf-8")) def refresh_token(): url = "https://accounts.google.com/o/oauth2/token" s = requests.Session() params = {"client_id": input("client_id>>"), "client_secret": input("client_secret>>"), "refresh_token": _refresh_token, "grant_type": "refresh_token"} r = s.post(url, data=params) print(r.text.encode("utf-8")) def get_youtube_caption(ch, term_start, term_end, next): # チャンネルの指定期間内の動画一覧を取得 #UC4YaOt1yT-ZeyB0OmxHgolA video_id_list = [] request = urllib.urlopen( "https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&videoCaption=closedCaption&channelId=" + ch + term_start + term_end + "&maxResults=50&key=" + key + "&pageToken=" + next) response = request.read() data = json.loads(response) for d in data["items"]: if "videoId" in d["id"]: video_id_list.append(d["id"]["videoId"]) if "nextPageToken" in data: next_page_token = data["nextPageToken"] else: next_page_token = "" # 取得した動画の字幕一覧を取得 caption_id_list = [] for video_id in video_id_list: request = urllib.urlopen( "https://www.googleapis.com/youtube/v3/captions?part=snippet&videoId=" + video_id + "&key=" + key) response = request.read() data = json.loads(response) for item in data["items"]: lang = item["snippet"]["language"] trackKind = item["snippet"]["trackKind"] # "standard" -> manual, "ASR" -> auto # Sorry, Japanese Only. if lang == "ja" and trackKind == "standard": caption_id = item["id"] caption_id_list.append(caption_id) # 字幕をダウンロード caption_data = [] for caption_id in caption_id_list: headers = {"Authorization": " Bearer " + access_token} request = urllib.Request( url="https://www.googleapis.com/youtube/v3/captions/" + caption_id + "?tfmt=ttml&key=" + key, headers=headers) try: request = urllib.urlopen(request) response = request.read() data = codecs.decode(response) caption_data.append((caption_id, data)) except HTTPError as e: print("error{}".format(e.headers)) return next_page_token, caption_data def write(outputdir, caption_list): for caption_id, caption in caption_list: with open("{}/{}.ttml".format(outputdir, caption_id), "wt", encoding="utf-8") as f: f.write(caption) f.flush() if __name__ == '__main__': outputdir = "./resources/kizunaai" # 出力先ディレクトリ channel_id = "UC4YaOt1yT-ZeyB0OmxHgolA" # 取得するチャンネルID num = 36 date = datetime.datetime.now() for i in range(num): before = "&publishedBefore=" + date.strftime("%Y-%m-%dT%H:%M:%S.000Z") date = date - datetime.timedelta(weeks=4) after = "&publishedAfter=" + date.strftime("%Y-%m-%dT%H:%M:%S.000Z") next = "" while True: next, captions = get_youtube_caption(channel_id, after, before, next) write(outputdir, captions) if next == "": break

最新の状態

文法誤りやPythonのバージョン指定を切り替えるなどして
最低限、print ('HELLO3')がブラウザに表示される状態に。

試したこと

1:StackOverFlowの言う通り、
request = urllib.urlopen(を、importの指定を変えたり、(『from』『as』を使うなどして、)
request = urlopen(
にしたり、
request = urllib3.urlopen(
にしたり、
import urllib.request
dataX = urllib.request.urlopen(url)
など変更していったが解消せず。

2:Pythonのバージョンを、2.7.5->3.4->3.6->3.5と切り替えてきたが解消せず。Pyenvを一度インストールしたが概念を理解できず、手動で下記のように

Python3.5

[root@localhost ~]# ln -s /bin/python3.6 /bin/python3 [root@localhost ~]# unlink /bin/python [root@localhost ~]# ln -s /bin/python3 /bin/python [root@localhost ~]# ln -s /bin/pip3.6 /bin/pip

リンクを張りなおして対応。

3:pipとpip3を何度もインストール
pip3 install urllib3
Requirement already satisfied: urllib3 in /usr/lib/python3.5/site-packages
You are using pip version 9.0.1, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

4:時間をかければ何とかなるだろうと、にっちもさっちもいかなくなる

Terarailではじめての質問。


という次第です。
ソースコードをフルコピペして良いのか(デバッグ依頼と見做されてしまう(仮(?)))、
語尾はですますか紋きりか、Python習熟のための写経経過をそのまま出してよかったのか?、Terarailで参照する事はマナー違反にならないか?、などなど、ルールがわかっておりません。
みなさんにご指導いただきたく、質問に至りました。
お知恵を貸してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。