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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

1807閲覧

Seleniumでmysqlにinsertできない問題

kuroishi

総合スコア53

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/05/26 18:18

実装環境

OS:Windows 10 Pro
開発環境:XAMPP
開発言語:Python 3.9.5,selenium

発生している問題・エラー

表題の通りSeleniumを使用し、Pythonにて取得したデータをMySQLのテーブルにインサートできません。

# codingutf-8 from multiprocessing import Pool from multiprocessing import Process from selenium import webdriver from selenium.webdriver.common.keys import Keys from time import sleep from datetime import datetime as dt from datetime import date import datetime import MySQLdb driver = webdriver.Chrome("C:\Program Files\chromedriver\chromedriver.exe"); driver.get('https://www.scorebing.com/fixtures/202XXXXX'); sleep(2) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") match_number=1 sample_number=1 now_date=date(202X, XX, XX).strftime('%Y/%m/%d') date_result=[] while sample_number < 2: try: if match_number%30==0 : driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") URL_team = '//*[@id="diary_info"]/table/tbody/tr['+str(match_number)+']/td[1]' URL_time = '//*[@id="diary_info"]/table/tbody/tr['+str(match_number)+']/td[2]' URL_fulltime_score = '//*[@id="diary_info"]/table/tbody/tr['+str(match_number)+']/td[4]' URL_halftime_score = '//*[@id="diary_info"]/table/tbody/tr['+str(match_number)+']/td[6]' a = driver.find_element_by_xpath(URL_team) b = driver.find_element_by_xpath(URL_time) c = driver.find_element_by_xpath(URL_fulltime_score) c_list= c.text.split() d = driver.find_element_by_xpath(URL_halftime_score) b = "20"+b.text b_date=b.split() tdatetime = dt.strptime(b, '%Y/%m/%d %H:%M') result_date = dt.strptime(b_date[0], '%Y/%m/%d').strftime('%Y/%m/%d') if now_date<result_date: break d_list= d.text.split() plus_minutes_time=tdatetime + datetime.timedelta(minutes=30) if a.text != "" and c.text != "" and d.text != "": print(a.text+","+tdatetime.strftime('%Y/%m/%d %H:%M')+","+plus_minutes_time.strftime('%Y/%m/%d %H:%M')+","+c_list[0]+","+c_list[2]+","+d_list[0]+","+d_list[2]) date_result.insert(match_number-1,(a.text,tdatetime.strftime('%Y-%m-%d %H:%M:%S'),plus_minutes_time.strftime('%Y-%m-%d %H:%M:%S'),int(c_list[0]),int(c_list[2]),int(d_list[0]),int(d_list[2]))) except: print("予期せぬエラー") break match_number += 1 # 接続する conn = MySQLdb.connect( user='root', passwd='', host='localhost', db='soccer_result') # カーソルを取得する cur = conn.cursor() # SQL(データベースを操作するコマンド)を実行する # userテーブルから、HostとUser列を取り出す print(date_result) sql = "INSERT INTO soccer_result (league_name,kickoff_time,half_time,team_1_Fscore,team_2_Fscore,team_1_Hscore,team_2_Hscore) VALUES (%s,%s,%s,%s,%s,%s,%s)" cur.executemany(sql,date_result) for i in date_result: cur.execute(sql,i) conn.commit conn.close cur.close print("END")

自分で試したこと

printによる配列に代入する値ならびに、インサート前の配列の中身(date_result)に関してはインサートする際のINSERT INTO soccer_result (league_name,kickoff_time,half_time,team_1_Fscore,team_2_Fscore,team_1_Hscore,team_2_Hscore) VALUES (%s,%s,%s,%s,%s,%s,%s)の形になっていますが、エラーも特に出力されることなくインサートされていない現象が起き困惑しています。

試しにテーブルのcreateに関しては問題なく行えたため問題はINSERT文にあると考えています。

なにかほかに必要な情報ありましたら教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

他の回答をいんたん考えずに問題文だけ見ると、単純にINSERTまでやって確定のためのcommit以降のメソッド呼び出しをしていないように見えます。

python

1conn.commit 2conn.close 3cur.close

python

1conn.commit() 2conn.close() 3cur.close()

投稿2021/05/27 12:10

attakei

総合スコア2740

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

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

kuroishi

2021/05/27 20:35

どうやらカッコを忘れていました。ありがとうございました。
guest

0

おはようございます。

問題文読ませていただきました。

もしかすると、データの形式に問題があるのかと思っております。

こちらあたりを読んでみると、list型ではなくタプル型でinsertしているので、ここが原因だと感じております。
10.5.5 MySQLCursor.executemany() Method
Python で MySQL - データの挿入 (insert)

試しに、

Python

1date_result = ('yakohama fc', '2021-05-24', '2021-05-25', 2, 2, 1, 1)

に変更して格納されるかご確認いただけますか?(mysqlの設定によって、データ形式の間違いはあるかもしれません。)

<追記>
自分の方で動いたので、以下の手順にてinsertできるか試してください。

  1. ターミナルを開く。
  2. mysql内に入る。(mysql -uroot -p'xxx')
  3. create database sample;を実行する。(sample databaseの作成)
  4. show databases;を実行して、databaseが作成されているのか、確認する。(sample databaseが作成されているのか確認する。)
  5. use sample;を実行してsampleのdatabase内に入る。
  6. create table sample.fruits (id int, name varchar(20), value varchar(40));を実行する。(fruits tableの作成)
  7. quitしてmysqlから抜ける。
  8. pythonファイルを新しく作成して、以下のコードを貼り付け&変更する。
import MySQLdb # DBに接続しカーソルを取得する # passwdの変更やその他自身の環境に合わせて、適宜変更ください。????‍♂️ connect = MySQLdb.connect(host='localhost', port=3306, user='root', passwd='xxx', db='sample', charset='utf8') cursor = connect.cursor() # レコードの挿入 sql = "insert into fruits values(1, 'apple', '100yen')" # 1つ目のレコードを挿入 cursor.execute(sql) sql = "insert into fruits values(2, 'orange', '150yen')" # 2つ目のレコードを挿入 cursor.execute(sql) # コミットする connect.commit() cursor.close() connect.close()

最後にPythonファイルを実行する。

投稿2021/05/26 21:03

編集2021/05/27 11:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kuroishi

2021/05/26 23:04 編集

ご返信ありがとうございます。 ひとまず、while文をコメントアウトし、date_resultを上記変数に変更したところ下記エラーが出ました。 Traceback (most recent call last): File "C:\Users\kuroishi yuta\Desktop\test.py", line 73, in <module> cur.executemany(sql,date_result) File "C:\Users\kuroishi yuta\AppData\Local\Programs\Python\Python39\lib\site-packages\MySQLdb\cursors.py", line 230, in executemany return self._do_execute_many( File "C:\Users\kuroishi yuta\AppData\Local\Programs\Python\Python39\lib\site-packages\MySQLdb\cursors.py", line 255, in _do_execute_many v = values % escape(next(args), conn) TypeError: not enough arguments for format string
kuroishi

2021/05/27 00:13

insertでやっみましたが、追加されませんでした。
退会済みユーザー

退会済みユーザー

2021/05/27 11:27

恐らくですが、僕が指定したデータとkuroishiさんが作られたdatabaseのcolumnのデータ形式の整合性が取れていない、もしくは必要カラム数を満たしていないために失敗したものと思われます。(こちらの判断は情報不足のため完全理解は難しかったので、適宜調整して実行いただけると助かります。????‍♂️) ↑ 上で自力解決が難しそうと感じましたら、私自身で回答の方で追記し、insertできたサンプルコードやmysqlの使い方について簡単に説明しましたので、ご確認いただけますと幸いです。????‍♂️
kuroishi

2021/05/27 20:36

懇切丁寧にありがとうございました!あらためて自分の中で仕組みを理解することができました。この度はご協力いただきありがとうございました。また、ぜひ相談させてください。
退会済みユーザー

退会済みユーザー

2021/05/27 21:57

いえいえ。問題解決してよかった!! また困ったこととかありましたら、気軽にご相談ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問