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

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

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

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

Q&A

0回答

1828閲覧

TooManyRedirectsのエラーを解決したい

Yushishi

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2019/11/20 13:01

前提・実現したいこと

汚いコードで恐縮ですが、、
映画.comから全映画名を、その映画ごとの評価点数をYahoo映画から其々スクレイピングで取得してきて、MySQLに格納するコードを作成しております。
映画名と評価点数は以下のように途中まで取得出来ていたのですが、
Requestで何度もYahoo映画のページにアクセスしていた為か、以下のエラーメッセージが表示されました。
redirectの回数を増やす方法は調べたところ、出てきたのですが、それでは根本的な解決にならないので、そのほかの方法が知りたいです。。
下記のように例外処理を行ったらどうかと考えたのですが、自信がなく、解決策をご存知の方がいれば、教えてください。

解決策(案)

for n in range(3): try: r2 = requests.get(page_url) soup2 = BeautifulSoup(r2.content, 'html.parser') except Exception as e: continue else: break else: pass

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:\Users\gerra.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\ptvsd_launcher.py", line 43, in <module> main(ptvsdArgs) File "c:\Users\gerra.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main run() File "c:\Users\gerra.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file runpy.run_path(target, run_name='__main__') File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "c:\Users\gerra\Google ドライブ\python_lesson\randommovie.py", line 72, in <module> r2 = requests.get(page_url) File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\api.py", line 75, in get return request('get', url, params=params, **kwargs) File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\api.py", line 60, in request return session.request(method=method, url=url, **kwargs) history = [resp for resp in gen] if allow_redirects else [] File "C:\Users\gerra\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\sessions.py", line 165, in resolve_redirects raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

該当のソースコード

import requests import urllib.request as urlreq import urllib.parse from bs4 import BeautifulSoup import csv import time import math from selenium import webdriver import MySQLdb #全映画名を収集 moviename_list = [] gojyuon_list = ['あ','い','う','え','お','か','き','く','け','こ','さ','し','す','せ','そ','た','ち','つ','て','と','な','に','ぬ','ね','の','は','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん'] for q in range(len(gojyuon_list)): parameter = urllib.parse.quote(gojyuon_list[q]) r = requests.get("https://eiga.com/movie/all/" + parameter) soup = BeautifulSoup(r.content, "html.parser") for a in soup.find_all(class_='title'): moviename_list.append(a.text) print("check1") #映画件数を確認⇒五十音毎のページ数を算出 for b in soup.find_all(class_= 'result-number'): movie_number = b.text movie_number = str(movie_number).split('全') movie_number = str(movie_number[1]).split('件') movie_number = int(movie_number[0]) page_number = math.ceil(movie_number / 100) + 1 print("check2") for c in range(2,page_number): r = requests.get("https://eiga.com/movie/all/" + parameter + "/" + str(c)) soup = BeautifulSoup(r.content, "html.parser") for d in soup.find_all(class_='title'): moviename_list.append(d.text) print("check3") #空白\u3000を削除 for i in range(len(moviename_list)): if "\u3000" in moviename_list[i]: moviename_list[i] = moviename_list[i].replace("\u3000","") print(moviename_list) #Mysqlに接続 conn = MySQLdb.connect( unix_socket = '/Applications/MAMP/tmp/mysql/mysql.sock', user='root', passwd='aaaaa', host='localhost', db='movie_review', charset='utf8') #seleniumでデータ取得準備 driver = webdriver.Chrome(executable_path=r'C:\Users\gerra\AppData\Roaming\Python\Python37\site-packages\chromedriver_binary\chromedriver.exe') driver.get('https://movies.yahoo.co.jp/review/') #time.sleep(2) movie_scores = [] for i in range(len(moviename_list)): for j in range(3): try: driver.find_element_by_class_name('search__query').send_keys(moviename_list[i]) driver.find_element_by_class_name('btn-search').click() driver.find_element_by_class_name('col').click() time.sleep(2) page_url = driver.current_url except Exception as e: continue else: break else: pass #映画ごとの評価データ取得し、movie_scoresに格納 r2 = requests.get(page_url) soup2 = BeautifulSoup(r2.content, 'html.parser') for k in soup2.find_all(class_ = 'rader-chart__figure'): b = [] b.append(k) b = str(b[0]).split('data-chart-val-total="') b = str(b[1]).split('" id=') b = str(b[0]).split(',') movie_score = [] movie_score.append(moviename_list[i]) for l in range(len(b)): movie_score.append(b[l]) movie_scores.append(movie_score) print(movie_score) print(movie_scores) driver.close() #CSVにデータを格納 with open(r'C:\Users\gerra\Google ドライブ\python_lesson\movie_scores.csv', 'w', newline="") as f: writer = csv.writer(f) writer.writerows(movie_scores) #MySQLにデータを格納 cur = conn.cursor() sql = "insert into product values (%s, %s, %s, %s, %s, %s)" cur.executemany(sql,movie_scores) conn.commit() cur.close conn.close

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問