質問編集履歴

3

解決しました

2022/07/03 10:28

投稿

OK_13ros
OK_13ros

スコア1

test CHANGED
File without changes
test CHANGED
@@ -9,172 +9,3 @@
9
9
 
10
10
  このようなサイトから値をうまく取得する方法を、
11
11
  ご教授いただきたく思います。
12
-
13
- from cgitb import html
14
- from selenium import webdriver
15
- from selenium.webdriver.chrome import service
16
- from selenium.webdriver.chrome.options import Options
17
- from time import sleep
18
- from bs4 import BeautifulSoup
19
- import csv
20
-
21
- #最初のページ
22
- url = "http://www.jasdec.com/reading/sbmei.php"
23
-
24
- # ヘッドレスモードの設定。
25
- # True => ブラウザを描写しない。
26
- # False => ブラウザを描写する。
27
- options = Options()
28
- options.add_argument('--headless')
29
-
30
- #ChromeDriverのパスを変数に設定
31
- ChromeDriver = r"C:\Users\k-saito\Downloads\chromedriver_win32\chromedriver.exe"
32
- #ChromeDriverのstartとstopを制御するServiceオブジェクトを介してパスを渡す
33
- chrome_service = service.Service(executable_path=ChromeDriver)
34
-
35
- #Chromeを起動
36
- driver = webdriver.Chrome(service=chrome_service)
37
-
38
- #保振のサイトに遷移
39
- driver.get(url)
40
- #カレントウインドウを最大化する
41
- driver.maximize_window()
42
-
43
- #テキストボックスを指定
44
- ISINcode = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/form/table/tbody/tr[1]/td[2]/input")
45
- #テキストボックスに入力
46
- ISINcode.send_keys("")
47
-
48
- #テキストボックスを指定
49
- meigara_name = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/form/table/tbody/tr[2]/td[2]/input")
50
- #銘柄の正式名称に入力
51
- meigara_name.send_keys("")
52
-
53
- #検索ボタンを指定
54
- search_btn = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[4]/tbody/tr/td/input[2]")
55
- #検索ボタンを押して検索を実行
56
- search_btn.click()
57
-
58
- #ページ読み込み待機
59
- sleep(10)
60
-
61
-
62
- #変数名
63
- i = 2
64
- count = 0 #画面遷移用
65
- allcount = 0 #処理回数を数える用
66
-
67
- HEADER = [
68
- '銘柄の正式名称', '銘柄略称', 'ISINコード', '発行代理人','支払代理人','発行通貨','社債の総額',
69
- '各社債の金額','方式','利付割引区分','利払通貨','利払日','償還通貨','償還日','「各社債の金額」あたりの償還プレミアム',
70
- '払込日','利払期日(今回)','利率(今回)','1通貨あたりの利子額(今回)','利払期日(次回)','利率(次回)','1通貨あたりの利子額(次回)'
71
- '利払期日(最終回)','利率(最終回)','1通貨あたりの利子額(最終回)','社債管理者等'
72
- ] #ヘッダー部分
73
-
74
- #出力先
75
- with open(r'\\svr-kyo4\全社共有\3_6000_新事業推進部\商品企画室\98.個人作業用フォルダ\saito\Pythonテスト\Scraping\test.csv', 'w', encoding='utf-8',newline='') as file:
76
- writer = csv.writer(file)
77
- #ヘッダーの出力
78
- writer.writerow(HEADER)
79
-
80
- #繰り返し処理(練習で30回繰り返し)
81
- for ch in range(30):
82
-
83
- #検索先のhtmlを取得
84
- html = driver.page_source
85
- #soupオブジェクトを作る
86
- soup = BeautifulSoup(html, 'html.parser')
87
-
88
- #一つ一つ選択(今試してる)
89
- meisyo = soup.find_all('span',class_='hy')[1].get_text().strip() #銘柄の正式名称
90
- ryakusyo = soup.find_all('span',class_='hy')[3].get_text().strip() #銘柄略称
91
- ISINcode = soup.find_all('span',class_='hy')[5].get_text().strip() #ISINコード
92
- issue_agent = soup.find_all('span',class_='hy')[7].get_text().strip() #発行代理人
93
- paying_agent = soup.find_all('span',class_='hy')[9].get_text().strip() #支払代理人
94
- issue_currency = soup.find_all('span',class_='hy')[11].get_text().strip() #発行通貨
95
- total_amount = soup.find_all('span',class_='hy')[13].get_text().strip() #社債の総額
96
- amount_each_bond = soup.find_all('span',class_='hy')[15].get_text().strip() #各社債の金額
97
- system = soup.find_all('span',class_='hy')[16].get_text().strip() #方式
98
- interest_bearing_division = soup.find_all('span',class_='hy')[18].get_text().strip() #利付割引区分
99
- interest_bearing_currency = soup.find_all('span',class_='hy')[20].get_text().strip() #利払通貨
100
- pay_date1 = soup.find_all('span',class_='hy')[22].get_text().strip() #利払日 分割されて入力欄があるため要変更
101
- pay_date2 = soup.find_all('span',class_='hy')[23].get_text().strip() #利払日 分割されて入力欄があるため要変更
102
- pay_date3 = soup.find_all('span',class_='hy')[24].get_text().strip() #利払日 分割されて入力欄があるため要変更
103
- pay_date4 = soup.find_all('span',class_='hy')[25].get_text().strip() #利払日 分割されて入力欄があるため要変更
104
- pay_date5 = soup.find_all('span',class_='hy')[26].get_text().strip() #利払日 分割されて入力欄があるため要変更
105
- pay_date6 = soup.find_all('span',class_='hy')[27].get_text().strip() #利払日 分割されて入力欄があるため要変更
106
- redemption_Currency = soup.find_all('span',class_='hy')[35].get_text().strip() #償還通貨
107
- redemption_date = soup.find_all('span',class_='hy')[37].get_text().strip() #償還日
108
- premium = soup.find_all('span',class_='hy')[38].get_text().strip() #「各社債の金額」あたりの償還プレミアム 値が入ってる状態で要確認
109
- date_of_payment = soup.find_all('span',class_='hy')[40].get_text().strip() #払込日
110
- interest_payment_date_now = soup.find_all('span',class_='hy')[42].get_text().strip() #利払期日(今回)
111
- interest_rate_now = soup.find_all('span',class_='hy')[46].get_text().strip() #利率(今回)
112
- interest_per_currency_now = soup.find_all('span',class_='hy')[50].get_text().strip() #1通貨あたりの利子額(今回)
113
- interest_payment_date_next = soup.find_all('span',class_='hy')[44].get_text().strip() #利払期日(次回) 値が入ってる状態で要確認
114
- interest_rate_next = soup.find_all('span',class_='hy')[48].get_text().strip() #利率(次回) 値が入ってる状態で要確認
115
- interest_per_currency_next = soup.find_all('span',class_='hy')[52].get_text().strip() #1通貨あたりの利子額(次回) 値が入ってる状態で要確認
116
- final_payment_date = soup.find_all('span',class_='hy')[54].get_text().strip() #最終償還期日
117
- interest_rate_last = soup.find_all('span',class_='hy')[56].get_text().strip() #利率(最終回)
118
- interest_per_currency_last = soup.find_all('span',class_='hy')[58].get_text().strip() #1通貨あたりの利子額(最終回)
119
- social_bond_manager1 = soup.find_all('span',class_='hy')[60].get_text().strip() #社債管理者等
120
- social_bond_manager2 = soup.find_all('span',class_='hy')[61].get_text().strip() #社債管理者等
121
- social_bond_manager3 = soup.find_all('span',class_='hy')[62].get_text().strip() #社債管理者等
122
- social_bond_manager4 = soup.find_all('span',class_='hy')[63].get_text().strip() #社債管理者等 値が入ってる状態で要確認
123
- social_bond_manager5 = soup.find_all('span',class_='hy')[64].get_text().strip() #社債管理者等 値が入ってる状態で要確認
124
- social_bond_manager6 = soup.find_all('span',class_='hy')[65].get_text().strip() #社債管理者等 値が入ってる状態で要確認
125
- social_bond_manager7 = soup.find_all('span',class_='hy')[66].get_text().strip() #社債管理者等 値が入ってる状態で要確認
126
- social_bond_manager8 = soup.find_all('span',class_='hy')[67].get_text().strip() #社債管理者等 値が入ってる状態で要確認
127
- social_bond_manager9 = soup.find_all('span',class_='hy')[68].get_text().strip() #社債管理者等 値が入ってる状態で要確認
128
- social_bond_manager10 = soup.find_all('span',class_='hy')[69].get_text().strip() #社債管理者等 値が入ってる状態で要確認
129
-
130
-
131
- row = [
132
- meisyo,ryakusyo,ISINcode,issue_agent,paying_agent,issue_currency,total_amount,amount_each_bond,
133
- system,interest_bearing_division,interest_bearing_currency,redemption_date,premium,date_of_payment,
134
- interest_payment_date_now,interest_rate_now,interest_per_currency_now,interest_payment_date_next,
135
- interest_rate_next,interest_per_currency_next,final_payment_date,interest_rate_last,interest_per_currency_last,
136
- social_bond_manager1,social_bond_manager2,social_bond_manager3,social_bond_manager4,social_bond_manager5,
137
- social_bond_manager6,social_bond_manager7,social_bond_manager8,social_bond_manager9,social_bond_manager10
138
- ]
139
-
140
- writer.writerow(row)
141
-
142
- #ページ読み込み待機
143
- sleep(8)
144
-
145
- if count < 19:
146
- #この処理で1-20までは処理できる(次へボタンが12なので押せない)
147
- #ボタンを指定
148
- next_btn = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/a[" +str(i) +"]")
149
- #ボタンを押して次ページに進む
150
- next_btn.click()
151
-
152
- if count == 19:
153
- #次へボタン(12)専用
154
- #ボタンを指定
155
- next_btn1 = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/a[12]")
156
- #ボタンを押して次ページに進む
157
- next_btn1.click()
158
- #countを10にリセットする(これで2回目以降の次へボタンに対応)
159
- count = 10
160
-
161
- #ページ読み込み待機
162
- sleep(8)
163
-
164
- #処理したら+1
165
- i += 1
166
- count += 1
167
- allcount += 1
168
-
169
- #iが12になったらリセット
170
- if i == 12:
171
- i = 3
172
-
173
- k = 0
174
- #出力用(処理回数の分だけ繰り返す)
175
- for out in range(allcount):
176
- print (k)
177
- k += 1
178
-
179
-
180
- driver.quit()

2

コードを掲載しました

2022/07/03 09:17

投稿

OK_13ros
OK_13ros

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,4 @@
1
- ```ここに言語を入力
2
- コード
3
- ```スクレイピング初心者です。
1
+ スクレイピング初心者です。
4
2
  PythonにてWebスクレイピングを練習し、
5
3
  練習として、
6
4
 

1

コードを載せさせていただきました

2022/07/03 09:15

投稿

OK_13ros
OK_13ros

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,6 @@
1
+ ```ここに言語を入力
2
+ コード
1
- スクレイピング初心者です。
3
+ ```スクレイピング初心者です。
2
4
  PythonにてWebスクレイピングを練習し、
3
5
  練習として、
4
6
 
@@ -10,3 +12,171 @@
10
12
  このようなサイトから値をうまく取得する方法を、
11
13
  ご教授いただきたく思います。
12
14
 
15
+ from cgitb import html
16
+ from selenium import webdriver
17
+ from selenium.webdriver.chrome import service
18
+ from selenium.webdriver.chrome.options import Options
19
+ from time import sleep
20
+ from bs4 import BeautifulSoup
21
+ import csv
22
+
23
+ #最初のページ
24
+ url = "http://www.jasdec.com/reading/sbmei.php"
25
+
26
+ # ヘッドレスモードの設定。
27
+ # True => ブラウザを描写しない。
28
+ # False => ブラウザを描写する。
29
+ options = Options()
30
+ options.add_argument('--headless')
31
+
32
+ #ChromeDriverのパスを変数に設定
33
+ ChromeDriver = r"C:\Users\k-saito\Downloads\chromedriver_win32\chromedriver.exe"
34
+ #ChromeDriverのstartとstopを制御するServiceオブジェクトを介してパスを渡す
35
+ chrome_service = service.Service(executable_path=ChromeDriver)
36
+
37
+ #Chromeを起動
38
+ driver = webdriver.Chrome(service=chrome_service)
39
+
40
+ #保振のサイトに遷移
41
+ driver.get(url)
42
+ #カレントウインドウを最大化する
43
+ driver.maximize_window()
44
+
45
+ #テキストボックスを指定
46
+ ISINcode = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/form/table/tbody/tr[1]/td[2]/input")
47
+ #テキストボックスに入力
48
+ ISINcode.send_keys("")
49
+
50
+ #テキストボックスを指定
51
+ meigara_name = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/form/table/tbody/tr[2]/td[2]/input")
52
+ #銘柄の正式名称に入力
53
+ meigara_name.send_keys("")
54
+
55
+ #検索ボタンを指定
56
+ search_btn = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[4]/tbody/tr/td/input[2]")
57
+ #検索ボタンを押して検索を実行
58
+ search_btn.click()
59
+
60
+ #ページ読み込み待機
61
+ sleep(10)
62
+
63
+
64
+ #変数名
65
+ i = 2
66
+ count = 0 #画面遷移用
67
+ allcount = 0 #処理回数を数える用
68
+
69
+ HEADER = [
70
+ '銘柄の正式名称', '銘柄略称', 'ISINコード', '発行代理人','支払代理人','発行通貨','社債の総額',
71
+ '各社債の金額','方式','利付割引区分','利払通貨','利払日','償還通貨','償還日','「各社債の金額」あたりの償還プレミアム',
72
+ '払込日','利払期日(今回)','利率(今回)','1通貨あたりの利子額(今回)','利払期日(次回)','利率(次回)','1通貨あたりの利子額(次回)'
73
+ '利払期日(最終回)','利率(最終回)','1通貨あたりの利子額(最終回)','社債管理者等'
74
+ ] #ヘッダー部分
75
+
76
+ #出力先
77
+ with open(r'\\svr-kyo4\全社共有\3_6000_新事業推進部\商品企画室\98.個人作業用フォルダ\saito\Pythonテスト\Scraping\test.csv', 'w', encoding='utf-8',newline='') as file:
78
+ writer = csv.writer(file)
79
+ #ヘッダーの出力
80
+ writer.writerow(HEADER)
81
+
82
+ #繰り返し処理(練習で30回繰り返し)
83
+ for ch in range(30):
84
+
85
+ #検索先のhtmlを取得
86
+ html = driver.page_source
87
+ #soupオブジェクトを作る
88
+ soup = BeautifulSoup(html, 'html.parser')
89
+
90
+ #一つ一つ選択(今試してる)
91
+ meisyo = soup.find_all('span',class_='hy')[1].get_text().strip() #銘柄の正式名称
92
+ ryakusyo = soup.find_all('span',class_='hy')[3].get_text().strip() #銘柄略称
93
+ ISINcode = soup.find_all('span',class_='hy')[5].get_text().strip() #ISINコード
94
+ issue_agent = soup.find_all('span',class_='hy')[7].get_text().strip() #発行代理人
95
+ paying_agent = soup.find_all('span',class_='hy')[9].get_text().strip() #支払代理人
96
+ issue_currency = soup.find_all('span',class_='hy')[11].get_text().strip() #発行通貨
97
+ total_amount = soup.find_all('span',class_='hy')[13].get_text().strip() #社債の総額
98
+ amount_each_bond = soup.find_all('span',class_='hy')[15].get_text().strip() #各社債の金額
99
+ system = soup.find_all('span',class_='hy')[16].get_text().strip() #方式
100
+ interest_bearing_division = soup.find_all('span',class_='hy')[18].get_text().strip() #利付割引区分
101
+ interest_bearing_currency = soup.find_all('span',class_='hy')[20].get_text().strip() #利払通貨
102
+ pay_date1 = soup.find_all('span',class_='hy')[22].get_text().strip() #利払日 分割されて入力欄があるため要変更
103
+ pay_date2 = soup.find_all('span',class_='hy')[23].get_text().strip() #利払日 分割されて入力欄があるため要変更
104
+ pay_date3 = soup.find_all('span',class_='hy')[24].get_text().strip() #利払日 分割されて入力欄があるため要変更
105
+ pay_date4 = soup.find_all('span',class_='hy')[25].get_text().strip() #利払日 分割されて入力欄があるため要変更
106
+ pay_date5 = soup.find_all('span',class_='hy')[26].get_text().strip() #利払日 分割されて入力欄があるため要変更
107
+ pay_date6 = soup.find_all('span',class_='hy')[27].get_text().strip() #利払日 分割されて入力欄があるため要変更
108
+ redemption_Currency = soup.find_all('span',class_='hy')[35].get_text().strip() #償還通貨
109
+ redemption_date = soup.find_all('span',class_='hy')[37].get_text().strip() #償還日
110
+ premium = soup.find_all('span',class_='hy')[38].get_text().strip() #「各社債の金額」あたりの償還プレミアム 値が入ってる状態で要確認
111
+ date_of_payment = soup.find_all('span',class_='hy')[40].get_text().strip() #払込日
112
+ interest_payment_date_now = soup.find_all('span',class_='hy')[42].get_text().strip() #利払期日(今回)
113
+ interest_rate_now = soup.find_all('span',class_='hy')[46].get_text().strip() #利率(今回)
114
+ interest_per_currency_now = soup.find_all('span',class_='hy')[50].get_text().strip() #1通貨あたりの利子額(今回)
115
+ interest_payment_date_next = soup.find_all('span',class_='hy')[44].get_text().strip() #利払期日(次回) 値が入ってる状態で要確認
116
+ interest_rate_next = soup.find_all('span',class_='hy')[48].get_text().strip() #利率(次回) 値が入ってる状態で要確認
117
+ interest_per_currency_next = soup.find_all('span',class_='hy')[52].get_text().strip() #1通貨あたりの利子額(次回) 値が入ってる状態で要確認
118
+ final_payment_date = soup.find_all('span',class_='hy')[54].get_text().strip() #最終償還期日
119
+ interest_rate_last = soup.find_all('span',class_='hy')[56].get_text().strip() #利率(最終回)
120
+ interest_per_currency_last = soup.find_all('span',class_='hy')[58].get_text().strip() #1通貨あたりの利子額(最終回)
121
+ social_bond_manager1 = soup.find_all('span',class_='hy')[60].get_text().strip() #社債管理者等
122
+ social_bond_manager2 = soup.find_all('span',class_='hy')[61].get_text().strip() #社債管理者等
123
+ social_bond_manager3 = soup.find_all('span',class_='hy')[62].get_text().strip() #社債管理者等
124
+ social_bond_manager4 = soup.find_all('span',class_='hy')[63].get_text().strip() #社債管理者等 値が入ってる状態で要確認
125
+ social_bond_manager5 = soup.find_all('span',class_='hy')[64].get_text().strip() #社債管理者等 値が入ってる状態で要確認
126
+ social_bond_manager6 = soup.find_all('span',class_='hy')[65].get_text().strip() #社債管理者等 値が入ってる状態で要確認
127
+ social_bond_manager7 = soup.find_all('span',class_='hy')[66].get_text().strip() #社債管理者等 値が入ってる状態で要確認
128
+ social_bond_manager8 = soup.find_all('span',class_='hy')[67].get_text().strip() #社債管理者等 値が入ってる状態で要確認
129
+ social_bond_manager9 = soup.find_all('span',class_='hy')[68].get_text().strip() #社債管理者等 値が入ってる状態で要確認
130
+ social_bond_manager10 = soup.find_all('span',class_='hy')[69].get_text().strip() #社債管理者等 値が入ってる状態で要確認
131
+
132
+
133
+ row = [
134
+ meisyo,ryakusyo,ISINcode,issue_agent,paying_agent,issue_currency,total_amount,amount_each_bond,
135
+ system,interest_bearing_division,interest_bearing_currency,redemption_date,premium,date_of_payment,
136
+ interest_payment_date_now,interest_rate_now,interest_per_currency_now,interest_payment_date_next,
137
+ interest_rate_next,interest_per_currency_next,final_payment_date,interest_rate_last,interest_per_currency_last,
138
+ social_bond_manager1,social_bond_manager2,social_bond_manager3,social_bond_manager4,social_bond_manager5,
139
+ social_bond_manager6,social_bond_manager7,social_bond_manager8,social_bond_manager9,social_bond_manager10
140
+ ]
141
+
142
+ writer.writerow(row)
143
+
144
+ #ページ読み込み待機
145
+ sleep(8)
146
+
147
+ if count < 19:
148
+ #この処理で1-20までは処理できる(次へボタンが12なので押せない)
149
+ #ボタンを指定
150
+ next_btn = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/a[" +str(i) +"]")
151
+ #ボタンを押して次ページに進む
152
+ next_btn.click()
153
+
154
+ if count == 19:
155
+ #次へボタン(12)専用
156
+ #ボタンを指定
157
+ next_btn1 = driver.find_element_by_xpath(r"/html/body/div[3]/div/div/div/div/div/div[1]/div[2]/table/tbody/tr/td/font/table[3]/tbody/tr/td/a[12]")
158
+ #ボタンを押して次ページに進む
159
+ next_btn1.click()
160
+ #countを10にリセットする(これで2回目以降の次へボタンに対応)
161
+ count = 10
162
+
163
+ #ページ読み込み待機
164
+ sleep(8)
165
+
166
+ #処理したら+1
167
+ i += 1
168
+ count += 1
169
+ allcount += 1
170
+
171
+ #iが12になったらリセット
172
+ if i == 12:
173
+ i = 3
174
+
175
+ k = 0
176
+ #出力用(処理回数の分だけ繰り返す)
177
+ for out in range(allcount):
178
+ print (k)
179
+ k += 1
180
+
181
+
182
+ driver.quit()