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