前提・実現したいこと
abemaの番組表から画像やタイトルを取得し,mysqlデータベースに保存するといった処理を行いたい。
発生している問題・エラーメッセージ
seleniumスクレイピングの実行後xamppのmysqlデータベースの中身を確認したところ格納されておりませんでした。
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | channelapp | | information_schema | | test | +--------------------+ 3 rows in set (0.010 sec) MariaDB [(none)]> use channelapp; Database changed MariaDB [channelapp]> show tables from channelapp; Empty set (0.004 sec)
該当のソースコード
データベースへの格納に関するコードは次のように作成しました。
python
1def data_registration_songle(self): 2 connection=mysql.connector.content( 3 user='ユーザー名', 4 password='パスワード', 5 host='localhost', 6 database='channelapp', 7 charset='utf8', 8 ) 9 10 cursor=connection.cursor() 11 cursor.excute("""CREATE TABLE timetable_list( 12 id INT(5) AUTO_INCREMENT NOT NULL, 13 title_name VARCHAR(100) 14 time datetime, 15 title_img MEDIUMBLOB, 16 )""") 17 cursor.commit() 18 cursor.ecxute("USE timetable_list") 19 connection.commit() 20 21 for item in data: 22 cursor.excute('insert into time values(%(title)s,%(time)s,%(img)s)',{ 23 'title':item['title_name'], 24 'time':item['time'], 25 'img':item['title_img'], 26 }) 27 cursor.commit() 28 cursor.close()
全体のコード
python
1from typing import Container, Counter 2import urllib.request 3from selenium.webdriver.chrome.options import Options 4from selenium import webdriver 5from time import sleep 6import mysql.connector 7 8options = Options() 9options.add_argument('--headless') 10 11 12driver = webdriver.Chrome('C:/Users/ユーザー名/Downloads/chromedriver_win32/chromedriver',chrome_options=options) 13 14driver.get('https://abema.tv/timetable') 15sleep(10) 16driver.find_element_by_xpath("//button[contains(text(),'19歳以下')]").click() 17driver.find_element_by_xpath("//button[contains(text(),'男性')]").click() 18driver.find_element_by_xpath("//button[contains(text(),'次へ')]").click() 19sleep(10) 20driver.find_element_by_class_name("com-genre-survey-GenreSurveyCard__text").click() 21driver.find_element_by_xpath("//button[contains(text(),'完了')]").click() 22sleep(10) 23categories=driver.find_elements_by_xpath("//a[@class='com-timetable-ChannelIconHeader__channel-link com-a-Link com-a-Link--dim']") 24link_list = [] 25 26channel_count = 0 27for category in categories: 28 link_list.append(category.get_attribute('href')) 29 30data=[] 31count=0 32for link in link_list: 33 count+=1 34 driver.get(link) 35 sleep(10) 36 timetable=driver.find_elements_by_xpath("//div[@class='com-timetable-TimetableItem__wrapper']") 37 cnt=0 38 for item in timetable: 39 cnt+=1 40 #タイトル 41 title=item.find_elements_by_xpath("div[1]/div/p/span/div/span") 42 if len(title): 43 title_name=str(count)+":"+str(cnt)+":"+title[0].text 44 45 #時間 46 times=item.find_elements_by_xpath("div[1]/div/p/span/div/time") 47 if len(times): 48 for time in times: 49 datetime=time.get_attribute('datetime') 50 time=str(count)+":"+str(cnt)+":"+datetime 51 52 #画像 53 imgs=item.find_elements_by_xpath("div[2]/div/div/div/picture/img") 54 if len(imgs): 55 for img in imgs: 56 src=img.get_attribute('src') 57 title_img=urllib.request.urlretrieve(src,str(count)+"_"+"img"+str(cnt)+".png") 58 59 data.append({ 60 "title_name":title_name, 61 "time":time, 62 "title_img":title_img, 63 }) 64 65 if cnt>3: 66 break 67 68 if count>3: 69 break 70 71def data_registration_songle(self): 72 connection=mysql.connector.content( 73 user='ユーザー名', 74 password='パスワード', 75 host='localhost', 76 database='channelapp', 77 charset='utf8', 78 ) 79 80 cursor=connection.cursor() 81 cursor.excute("""CREATE TABLE timetable_list( 82 id INT(5) AUTO_INCREMENT NOT NULL, 83 title_name VARCHAR(100) 84 time datetime, 85 title_img MEDIUMBLOB, 86 )""") 87 cursor.commit() 88 cursor.ecxute("USE timetable_list") 89 connection.commit() 90 91 for item in data: 92 cursor.excute('insert into time values(%(title)s,%(time)s,%(img)s)',{ 93 'title':item['title_name'], 94 'time':item['time'], 95 'img':item['title_img'], 96 }) 97 cursor.commit() 98 cursor.close()
補足情報(FW/ツールのバージョンなど)
Python 3.9.5
selenium 3.141.0
ChromeDriver 92.0.4515.107
xampp 8.0.9 / PHP 8.0.9
デバッグを丸投げしたいって事だろうから低評価。
デバッグしてるならどの部分が意図どおりに動いていないのか、もっとピンポイントで質問絞れるはず。
そもそもスクレイピングしていいかどうか微妙な気がしますね。
https://abema.tv/about/terms
>第8条(禁止事項)
>(4)コンテンツを不正な方法で取得する行為、またはこれを助長する行為。
「不正」が何かを決めるのは運営側ですが、一般的な利用以外は避けた方が良いでしょう。欲しい情報を提供しているAPIがなく、どうしてもというのなら許可を得ること。
わかりました。ありがとうございます。
あなたの回答
tips
プレビュー