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

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

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

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

YouTube API

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

Python

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

Q&A

解決済

1回答

5815閲覧

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による文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/18 08:28

編集2019/11/18 12:41

環境: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をブラウザで表示しています。(CGIとして動作させ、Webのログに上記エラーが出現します)
エラーは、/var/log/error_log.log を都度開いて確認しています。
「解消したいエラーメッセージ」が出てくる、というよりは、書き込まれているのをいちいちファイルを開いて確認しています。なお、Teratermからコマンドで実行しても、エラー内容、実行結果は同じです。
本当はPycharmやコマンドからエラー付きで即時表示(実行)すべきなのは頭では理解しています。。

該当のソースコード

Python3.5

1#!/usr/bin/python 2# -*- coding:utf-8 -*- 3from urllib import request as urllib 4import urllib 5import json 6import datetime 7import requests 8import codecs 9import http.server 10import sys 11import io 12import ssl 13ssl._create_default_https_context = ssl._create_unverified_context 14sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 15from urllib.error import HTTPError 16print ('Content-Type: text/html;charset=utf-8\n') 17print ('HELLO3') 18 19key = "" 20access_token = "" 21_refresh_token = "" 22 23def get_access_token(): 24 url = "https://accounts.google.com/o/oauth2/token" 25 s = requests.Session() 26 params = {"code": input("code>>"), 27 "client_id": input("client_id>>"), 28 "client_secret": input("client_secret>>"), 29 "redirect_uri": input("redirect_uri>>"), 30 "grant_type": "authorization_code"} 31 r = s.post(url, data=params) 32 print(r.text.encode("utf-8")) 33 34def refresh_token(): 35 url = "https://accounts.google.com/o/oauth2/token" 36 s = requests.Session() 37 params = {"client_id": input("client_id>>"), 38 "client_secret": input("client_secret>>"), 39 "refresh_token": _refresh_token, 40 "grant_type": "refresh_token"} 41 r = s.post(url, data=params) 42 print(r.text.encode("utf-8")) 43 44def get_youtube_caption(ch, term_start, term_end, next): 45 # チャンネルの指定期間内の動画一覧を取得 46#UC4YaOt1yT-ZeyB0OmxHgolA 47 video_id_list = [] 48 request = urllib.urlopen( 49 "https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&videoCaption=closedCaption&channelId=" + ch + term_start + term_end + 50 "&maxResults=50&key=" + key + "&pageToken=" + next) 51 response = request.read() 52 data = json.loads(response) 53 54 for d in data["items"]: 55 if "videoId" in d["id"]: 56 video_id_list.append(d["id"]["videoId"]) 57 if "nextPageToken" in data: 58 next_page_token = data["nextPageToken"] 59 else: 60 next_page_token = "" 61 62 # 取得した動画の字幕一覧を取得 63 caption_id_list = [] 64 for video_id in video_id_list: 65 request = urllib.urlopen( 66 "https://www.googleapis.com/youtube/v3/captions?part=snippet&videoId=" + video_id + "&key=" + key) 67 response = request.read() 68 data = json.loads(response) 69 for item in data["items"]: 70 lang = item["snippet"]["language"] 71 trackKind = item["snippet"]["trackKind"] # "standard" -> manual, "ASR" -> auto 72 # Sorry, Japanese Only. 73 if lang == "ja" and trackKind == "standard": 74 caption_id = item["id"] 75 caption_id_list.append(caption_id) 76 77 # 字幕をダウンロード 78 caption_data = [] 79 for caption_id in caption_id_list: 80 headers = {"Authorization": " Bearer " + access_token} 81 request = urllib.Request( 82 url="https://www.googleapis.com/youtube/v3/captions/" + caption_id + "?tfmt=ttml&key=" + key, 83 headers=headers) 84 try: 85 request = urllib.urlopen(request) 86 response = request.read() 87 data = codecs.decode(response) 88 caption_data.append((caption_id, data)) 89 except HTTPError as e: 90 print("error{}".format(e.headers)) 91 92 return next_page_token, caption_data 93 94 95def write(outputdir, caption_list): 96 for caption_id, caption in caption_list: 97 with open("{}/{}.ttml".format(outputdir, caption_id), "wt", encoding="utf-8") as f: 98 f.write(caption) 99 f.flush() 100 101 102if __name__ == '__main__': 103 outputdir = "./resources/kizunaai" # 出力先ディレクトリ 104 channel_id = "UC4YaOt1yT-ZeyB0OmxHgolA" # 取得するチャンネルID 105 num = 36 106 date = datetime.datetime.now() 107 for i in range(num): 108 before = "&publishedBefore=" + date.strftime("%Y-%m-%dT%H:%M:%S.000Z") 109 date = date - datetime.timedelta(weeks=4) 110 after = "&publishedAfter=" + date.strftime("%Y-%m-%dT%H:%M:%S.000Z") 111 next = "" 112 while True: 113 next, captions = get_youtube_caption(channel_id, after, before, next) 114 write(outputdir, captions) 115 if next == "": 116 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を一度インストールしたが概念を理解できず。
代わりに、Pythonのそれぞれのバージョンを、

[root@localhost ~]# yum install -y python35u python35u-libs python35u-devel python35u-pip

とyumでインストール。その後、手動で下記のように

[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

リンクを張りなおして対応しています。上記のリンク張り替え作業によって、
シバンが、

Python

1#!/usr/bin/python

のままでも、実際は3.5で実行されています。

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で参照する事はマナー違反にならないか?、などなど、ルールがわかっておりません。
みなさんにご指導いただきたく、質問に至りました。
お知恵を貸してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/11/18 11:47

ソースコードは「該当のソースコード」でいいと思いますが、「このソースを」「今」実行したら「解消したいエラーメッセージ」に出てくるメッセージがでてくるのですか? どうやって実行していますか? > Pythonのバージョンを、2.7.5->3.4->3.6->3.5と切り替えてきたが どうやって?
退会済みユーザー

退会済みユーザー

2019/11/18 12:04

1:実行環境 VPS(CENTOS7)に、Python3.5をインストールし、https://domain/cgi-bin/hoge.pyファイルを直接編集して、URLをブラウザで表示しています。 エラーは、/var/log/error_log.log を都度開いて確認しています。 「解消したいエラーメッセージ」が出てくる、というよりは、書き込まれているのをいちいちファイルを開いて確認しています。なお、Teratermからコマンドで実行しても、エラー内容、実行結果は同じです。 本当はPycharm等から「今」実行すべきなのは頭では理解しています。。 2:Pythonの切り替え手段 下記のように、リンクを張り替えて対応しております。 [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 コメントありがとうございます、とても嬉しいです。
quickquip

2019/11/18 12:31 編集

情報はこの欄ではなくて質問に追記しましょう。 (/var/www/cgi-bin/ai.py に置いて、CGIとして動作させたら、Webのログに出ている という状況です。これが書かれていないです) > Python3.5をインストールし どうやってインストールしていますか? /bin にコマンドができるのですね。 > Teratermからコマンドで実行しても どういうコマンドですか? shebang(1行目)は本当にこう書いていますか? (システムPython2を起動しているように見えます)
guest

回答1

0

ベストアンサー

二行目を消してください。

python

1from urllib import request as urllib 2import urllib

せっかくurllib.requesturllibと名付けてimportしたのに、一瞬で上書きしてしまう愚行です。

urllib --- URL を扱うモジュール群 — Python 3.8.0 ドキュメント

投稿2019/11/18 12:45

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/18 13:31 編集

2行目を削除したところ、該当するエラーがなくなりました。解決です。 代わりに、 File "/usr/lib64/python3.5/http/client.py", line xxx File "/usr/lib64/python3.5/http/socket.py", line xxx File "/usr/lib64/python3.5/http/request.py", line xxx PermissionError: [Errno 13] Permission denied というエラーが10数行、現れたため自分で試してNGな場合は、 場を改めて質問したいと思います。 ありがとうございました。 〜今回先生方から学んだ事〜 1:質問の作法(quiqui先生、コメント欄でのご指導ありがとうございました 2:import urllibを追記してエラーがシンプルになったのを前進したと勘違いしていたが、実際は後退して別のエラーが表示されていただけだった事
退会済みユーザー

退会済みユーザー

2019/11/18 13:42

3:エンジニアのみなさんと交流するための素養づくりを目的とすると有意義な体験だが、現状のレベルからキャッチアップして、自力でアプリ起業を目指すのは無謀。 外注すべきである事。(どこかで線引きが必要になる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問