質問編集履歴

5

コードを一部修正

2019/04/11 07:47

投稿

nasu0922
nasu0922

スコア17

test CHANGED
File without changes
test CHANGED
@@ -40,12 +40,8 @@
40
40
 
41
41
  # ログレベルを DEBUG に変更
42
42
 
43
- #logging.basicConfig(level=logging.DEBUG)
44
-
45
43
  logging.basicConfig(format=formatter, filename='logger.log', level=logging.INFO)
46
44
 
47
- #logging.basicConfig(level=logging.DEBUG, format=formatter)
48
-
49
45
 
50
46
 
51
47
  base_url = 'https://p-town.dmm.com'
@@ -182,16 +178,6 @@
182
178
 
183
179
 
184
180
 
185
- #selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(2) > div tr'
186
-
187
- #temp = soup2.select(selector2)
188
-
189
- #for elem4 in soup2.select(selector2):
190
-
191
- # print(elem4.text)
192
-
193
-
194
-
195
181
  # 次ページ読込、なければループ終了
196
182
 
197
183
  elif elem3.attrs.get('class')[0] == 'item':

4

前提・実現したいことの文言修正

2019/04/11 07:46

投稿

nasu0922
nasu0922

スコア17

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  dmm.ぱちタウンから全パチンコホールをWEBスクレイピングしたいと考えています。
4
4
 
5
- 昨日投稿しましたが、出来る範囲内で修正をしましたが、解決できておりません
5
+ 昨日投稿しましたが、丸投げのような内容になったため出来る範囲内で修正をしました。
6
+
7
+ しかしながらエラーが発生し解決できておりません。
6
8
 
7
9
  初心者のためご教授いただきく存じます。
8
10
 

3

コードを自身で見直し(その後エラーが出て別問題が発生)

2019/04/11 07:45

投稿

nasu0922
nasu0922

スコア17

test CHANGED
@@ -1 +1 @@
1
- サイト内にある複数のURLを横断してデータをWEBスクレイピングしたい。
1
+ サイト内から特定データをWEBスクレイピングしたい。
test CHANGED
@@ -1,156 +1,224 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- dmm.ぱちタウンから全パチンコホールの基本情報と機種情報をWEBスクレイピングしたいと考えています。
3
+ dmm.ぱちタウンから全パチンコホールをWEBスクレイピングしたいと考えています。
4
+
5
+ 昨日投稿しましたが、出来る範囲内で修正をしましたが、解決できておりません。
6
+
7
+ 初心者のためご教授いただきく存じます。
4
8
 
5
9
 
6
10
 
7
11
  ### 発生している問題・エラーメッセージ
8
12
 
9
- 特定店舗のスクレイピングはできました、サイト内の全店舗のデータをスクレイピングするにはどうたらいかわからない状況です。
13
+ ・「NameError: name 'hall_info' is not defined」とエラー発生す。
10
-
14
+
11
- 例.北海道の店舗→青森→....沖縄ま順番にデータを取得した
15
+ ・エラーが解消すれば問題なくスクレイピングきるか確認したい。
12
-
13
-
14
-
16
+
17
+
18
+
15
- #店舗基本情報
19
+ #コード
16
20
 
17
21
  ```python3
18
22
 
19
- import re
20
-
21
23
  import requests
22
24
 
25
+ import logging
26
+
23
27
  from bs4 import BeautifulSoup
24
28
 
25
29
 
26
30
 
27
- url = 'https://p-town.dmm.com/shops/tokyo/12670'
28
-
29
- r = requests.get(url)
30
-
31
- soup = BeautifulSoup(r.text, 'lxml')
32
-
33
-
34
-
35
- data = {}
36
-
37
- for tr in soup.select('table[class="default-table"] tr'):
38
-
39
- name = tr.th.text
40
-
41
-
42
-
43
- if name == '住所':
44
-
45
- # 前後の空白文字を削除 strip=true
46
-
47
- value = tr.p.get_text(strip=True)
48
-
49
- elif name == '新台':
50
-
51
- # 空白文字を削除 replace(置換する文字列, 置換される文字列)
52
-
53
- items = [a.text.replace(' ', '') for a in tr.find_all('p')]
54
-
55
- value = ''.join(items)
56
-
57
- else:
58
-
59
- value = tr.get_text(strip=True)
60
-
61
- # 不要な文字削除 re.sub(正規表現, 置換する文字列, 置換される文字列)
62
-
63
- value = re.sub('[\u3000\n]', '', value)
64
-
65
- data[name] = value
66
-
67
-
68
-
69
- from pprint import pprint
70
-
71
- # データを整形して出力
72
-
73
- pprint(data)
31
+ if __name__ == "__main__":
32
+
33
+
34
+
35
+ # フォーマットを定義
36
+
37
+ formatter = '%(asctime)s : %(levelname)s : %(message)s'
38
+
39
+ # ログレベルを DEBUG に変更
40
+
41
+ #logging.basicConfig(level=logging.DEBUG)
42
+
43
+ logging.basicConfig(format=formatter, filename='logger.log', level=logging.INFO)
44
+
45
+ #logging.basicConfig(level=logging.DEBUG, format=formatter)
46
+
47
+
48
+
49
+ base_url = 'https://p-town.dmm.com'
50
+
51
+ target_url = '/'
52
+
53
+ r = requests.get(base_url + target_url) #requestsを使って、webから取得
54
+
55
+ soup = BeautifulSoup(r.text, 'lxml') #要素を抽出
56
+
57
+
58
+
59
+ selector = 'body > div.o-layout > div > div.o-container > main > section.default-box.-shop > div > div li'
60
+
61
+ # 都道府県ループ
62
+
63
+ for elem1 in soup.select(selector):
64
+
65
+ string_ = elem1.text
66
+
67
+ target_url = elem1.next_element.attrs.get('href')
68
+
69
+ area_name = target_url.rsplit('/', 1)[1]
70
+
71
+ #print(area_name)
72
+
73
+ logging.info('%s %s', 'test:', string_ + ':' + base_url + target_url)
74
+
75
+ r = requests.get(base_url + target_url)
76
+
77
+ soup= BeautifulSoup(r.text, 'lxml')
78
+
79
+ selector = 'body > div.o-layout > div > div > main > section:nth-child(3) li'
80
+
81
+ num = 0
82
+
83
+ # 市区町村ループ
84
+
85
+ for elem2 in soup.select(selector):
86
+
87
+ target_url = elem2.next_element.attrs.get('href')
88
+
89
+ city_id = target_url.rsplit('/', 1)[1]
90
+
91
+ print(elem2.text + ':' + base_url + target_url)
92
+
93
+ logging.info('%s %s', 'test:', elem2.text + ':' + base_url + target_url)
94
+
95
+ r = requests.get(base_url + target_url)
96
+
97
+ soup = BeautifulSoup(r.text, 'lxml')
98
+
99
+ selector = 'body > div.o-layout > div > div.o-container > main > section li'
100
+
101
+ nextpage = True
102
+
103
+ while nextpage:
104
+
105
+ # 次ページ有無チェック
106
+
107
+ for elem3 in soup.select(selector):
108
+
109
+ if elem3.attrs.get('class')[0] == 'item':
110
+
111
+ if elem3.text == '>':
112
+
113
+ if elem3.next.attrs.get('href') is not None:
114
+
115
+ nextpage = True
116
+
117
+ break
118
+
119
+ else:
120
+
121
+ nextpage = False
122
+
123
+ # 登録ホールループ
124
+
125
+ for elem3 in soup.select(selector):
126
+
127
+ if elem3.attrs.get('class')[0] == 'unit':
128
+
129
+ # ホール情報収集
130
+
131
+ num += 1
132
+
133
+ target_url = elem3.next_element.attrs.get('href')
134
+
135
+ hall_id = target_url.rsplit('/', 1)[1]
136
+
137
+ r2 = requests.get(base_url + target_url)
138
+
139
+ soup2 = BeautifulSoup(r2.text, 'lxml')
140
+
141
+ # 店舗名取得
142
+
143
+ selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(1) > div > h1'
144
+
145
+ hall_name = soup2.select(selector2)[0].text
146
+
147
+ # 店舗基本情報取得
148
+
149
+ for tr in soup.select('table[class="default-table"] tr'):
150
+
151
+ name = tr.th.text
152
+
153
+ if name == '住所':
154
+
155
+ # 前後の空白文字を削除 strip=true
156
+
157
+ value = tr.p.get_text(strip=True)
158
+
159
+ elif name == '新台':
160
+
161
+ # 空白文字を削除 replace(置換する文字列, 置換される文字列)
162
+
163
+ items = [a.text.replace(' ', '') for a in tr.find_all('p')]
164
+
165
+ value = ''.join(items)
166
+
167
+ else:
168
+
169
+ value = tr.get_text(strip=True)
170
+
171
+ # 不要な文字削除 re.sub(正規表現, 置換する文字列, 置換される文字列)
172
+
173
+ value = re.sub('[\u3000\n]', '', value)
174
+
175
+ hall_info = value
176
+
177
+ print(str(num) + '[' + hall_id + ']:' + hall_name + ':' + hall_info )
178
+
179
+ logging.info('%s %s', str(num) + '[' + hall_id + ']:' + hall_name + ':' + hall_info + ':', base_url + target_url)
180
+
181
+
182
+
183
+ #selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(2) > div tr'
184
+
185
+ #temp = soup2.select(selector2)
186
+
187
+ #for elem4 in soup2.select(selector2):
188
+
189
+ # print(elem4.text)
190
+
191
+
192
+
193
+ # 次ページ読込、なければループ終了
194
+
195
+ elif elem3.attrs.get('class')[0] == 'item':
196
+
197
+ if elem3.text == '>':
198
+
199
+ #print(elem3.next.attrs.get('href'))
200
+
201
+ if elem3.next.attrs.get('href') is not None:
202
+
203
+ target_url = elem3.next.attrs.get('href')
204
+
205
+ r = requests.get(target_url)
206
+
207
+ soup = BeautifulSoup(r.text, 'lxml')
208
+
209
+ else:
210
+
211
+ nextpage = False
212
+
213
+ break
214
+
215
+
74
216
 
75
217
  ```
76
218
 
77
- #機種情報
78
-
79
- ```python3
80
-
81
- import re
82
-
83
- import requests
84
-
85
- from bs4 import BeautifulSoup
86
-
87
- url = 'https://p-town.dmm.com/shops/tokyo/12670'
88
-
89
- r = requests.get(url)
90
-
91
- soup = BeautifulSoup(r.text, 'lxml')
92
-
93
-
94
-
95
- #from urllib.parse import urljoin
96
-
97
- #base_url = 'https://p-town.dmm.com'
98
-
99
-
100
-
101
- data = {}
102
-
103
- for ul in soup.select('ul[class="list-machinesettings"]'):
104
-
105
- machine_type = 'パチ'
106
-
107
- if 'パチ' in ul.h4.text:
108
-
109
- machine_type = 'パチ'
110
-
111
- elif 'スロ' in ul.h4.text:
112
-
113
- machine_type = 'スロ'
114
-
115
-
116
-
117
- machines = []
118
-
119
- for li in ul.select('li[class="item"]'):
120
-
121
- name = li.select_one('div[class="text"]').get_text(strip=True)
122
-
123
- num = li.select_one('div[class="number"]').get_text(strip=True)
124
-
125
- #link = urljoin(base_url, li.a['href']) if li.a else None
126
-
127
- #machines.append([name, num, link])
128
-
129
- machines.append([name, num])
130
-
131
- data[machine_type] = machines
132
-
133
-
134
-
135
- from pprint import pprint
136
-
137
- pprint(data)
138
-
139
- ```
140
-
141
219
  ### 試したこと
142
220
 
143
- 特定店舗場合はURLを指定するだけで問題ないのすが、全国店舗となると、
221
+ Name errorため該当箇所の名前を確認しましたが特に問題ありませんした。
144
-
145
-
146
-
147
- https://p-town.dmm.com/shops/hokkaido
148
-
149
-
150
-
151
- のように、shop以降のURL情報(地域や店舗№)に着目する必要があるのは認識していますが、
152
-
153
- どういった形でコードを作成していいか分からない状況です。
154
222
 
155
223
 
156
224
 

2

先ほどの修正でコードがおかしくなっていたので再編集しました。

2019/04/11 07:43

投稿

nasu0922
nasu0922

スコア17

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  例.北海道の店舗→青森→....沖縄まで順番にデータを取得した
12
12
 
13
- ```
13
+
14
14
 
15
15
  #店舗基本情報
16
16
 

1

1つのコードを削除し、「発生している問題」「試したこと」を編集しました。

2019/04/10 06:31

投稿

nasu0922
nasu0922

スコア17

test CHANGED
@@ -1 +1 @@
1
- 特定サイト内の全都道府県のデータをWEBスクレイピングしたい。
1
+ サイト内にある複数URLを横断してデータをWEBスクレイピングしたい。
test CHANGED
@@ -1,200 +1,18 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 以前、こちらでdmm.ぱちタウンから特定のパチンコホールの基本情報と機種情報をWEBスクレイピングする方法について
4
-
5
- ご教授いただきました。(店舗基本情報/機種情報)
6
-
7
-
8
-
9
- また別のコードで、サイト内から店舗IDと店舗名の抽出はできているのですが、最終的に
10
-
11
- サイト内の全パチンコホールの基本情報と機種情報をWEBスクレイピングしたいと考えています。
3
+ dmm.ぱちタウンから全パチンコホールの基本情報と機種情報をWEBスクレイピングしたいと考えています。
12
4
 
13
5
 
14
6
 
15
7
  ### 発生している問題・エラーメッセージ
16
8
 
17
- 店舗IDと店舗
9
+ 特定店舗のスクレイピングはできましたが、サイト内の全店舗のデータをスクレイピングするにはどうしたらいいかわからない状況です。
18
10
 
19
- ②店舗基本情報
20
-
21
- ③機種情報
22
-
23
- →サイト内の全パチンコホールの上記項目を全てを合算させたい。
24
-
25
- →既存作成コードをつなぎ合わせるのか、それとももっとスッキリしたコードが作れるのかご教授いただきたい。
26
-
27
-
28
-
29
- ### ①店舗ID&店舗名
30
-
31
- ```Python3
32
-
33
- import requests
34
-
35
- import logging
36
-
37
- from bs4 import BeautifulSoup
38
-
39
-
40
-
41
- if __name__ == "__main__":
42
-
43
-
44
-
45
- # フォーマットを定義
46
-
47
- formatter = '%(asctime)s : %(levelname)s : %(message)s'
48
-
49
- # ログレベルを DEBUG に変更
50
-
51
- #logging.basicConfig(level=logging.DEBUG)
52
-
53
- logging.basicConfig(format=formatter, filename='logger.log', level=logging.INFO)
54
-
55
- #logging.basicConfig(level=logging.DEBUG, format=formatter)
56
-
57
-
58
-
59
- base_url = 'https://p-town.dmm.com'
60
-
61
- target_url = '/'
62
-
63
- r = requests.get(base_url + target_url) #requestsを使って、webから取得
64
-
65
- soup = BeautifulSoup(r.text, 'lxml') #要素を抽出
66
-
67
-
68
-
69
- selector = 'body > div.o-layout > div > div.o-container > main > section.default-box.-shop > div > div li'
70
-
71
- # 都道府県ループ
72
-
73
- for elem1 in soup.select(selector):
74
-
75
- string_ = elem1.text
76
-
77
- target_url = elem1.next_element.attrs.get('href')
78
-
79
- area_name = target_url.rsplit('/', 1)[1]
80
-
81
- #print(area_name)
82
-
83
- logging.info('%s %s', 'test:', string_ + ':' + base_url + target_url)
84
-
85
- r = requests.get(base_url + target_url)
86
-
87
- soup= BeautifulSoup(r.text, 'lxml')
88
-
89
- selector = 'body > div.o-layout > div > div > main > section:nth-child(3) li'
90
-
91
- num = 0
92
-
93
- # 市区町村ループ
94
-
95
- for elem2 in soup.select(selector):
96
-
97
- target_url = elem2.next_element.attrs.get('href')
98
-
99
- city_id = target_url.rsplit('/', 1)[1]
100
-
101
- print(elem2.text + ':' + base_url + target_url)
102
-
103
- logging.info('%s %s', 'test:', elem2.text + ':' + base_url + target_url)
104
-
105
- r = requests.get(base_url + target_url)
106
-
107
- soup = BeautifulSoup(r.text, 'lxml')
108
-
109
- selector = 'body > div.o-layout > div > div.o-container > main > section li'
110
-
111
- nextpage = True
112
-
113
- while nextpage:
114
-
115
- # 次ページ有無チェック
116
-
117
- for elem3 in soup.select(selector):
118
-
119
- if elem3.attrs.get('class')[0] == 'item':
120
-
121
- if elem3.text == '>':
122
-
123
- if elem3.next.attrs.get('href') is not None:
124
-
125
- nextpage = True
126
-
127
- break
128
-
129
- else:
130
-
131
- nextpage = False
132
-
133
- # 登録ホールループ
134
-
135
- for elem3 in soup.select(selector):
136
-
137
- if elem3.attrs.get('class')[0] == 'unit':
138
-
139
- # ホール情報収集
140
-
141
- num += 1
142
-
143
- target_url = elem3.next_element.attrs.get('href')
144
-
145
- hall_id = target_url.rsplit('/', 1)[1]
146
-
147
- r2 = requests.get(base_url + target_url)
148
-
149
- soup2 = BeautifulSoup(r2.text, 'lxml')
150
-
151
- # 店舗名取得
152
-
153
- selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(1) > div > h1'
154
-
155
- hall_name = soup2.select(selector2)[0].text
156
-
157
- print(str(num) + '[' + hall_id + ']:' + hall_name)
158
-
159
- logging.info('%s %s', str(num) + '[' + hall_id + ']:' + hall_name + ':', base_url + target_url)
160
-
161
-
162
-
163
- #selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(2) > div tr'
164
-
165
- #temp = soup2.select(selector2)
11
+ .北海道の店舗→青森→....沖縄まで順番にデータを取得した
166
-
167
- #for elem4 in soup2.select(selector2):
168
-
169
- # print(elem4.text)
170
-
171
-
172
-
173
- # 次ページ読込、なければループ終了
174
-
175
- elif elem3.attrs.get('class')[0] == 'item':
176
-
177
- if elem3.text == '>':
178
-
179
- #print(elem3.next.attrs.get('href'))
180
-
181
- if elem3.next.attrs.get('href') is not None:
182
-
183
- target_url = elem3.next.attrs.get('href')
184
-
185
- r = requests.get(target_url)
186
-
187
- soup = BeautifulSoup(r.text, 'lxml')
188
-
189
- else:
190
-
191
- nextpage = False
192
-
193
- break
194
12
 
195
13
  ```
196
14
 
197
- #店舗基本情報
15
+ #店舗基本情報
198
16
 
199
17
  ```python3
200
18
 
@@ -256,7 +74,7 @@
256
74
 
257
75
  ```
258
76
 
259
- #機種情報
77
+ #機種情報
260
78
 
261
79
  ```python3
262
80
 
@@ -322,15 +140,17 @@
322
140
 
323
141
  ### 試したこと
324
142
 
325
- 書物やネット情報収集しましたが、Python体の流れを理解していい部分もあり
143
+ 特定店舗の場合は、URLを指定するだけ問題ないのですが、全国店舗とると、
326
-
327
- 処理が難航しています。
328
144
 
329
145
 
330
146
 
331
- 見当違いの質問でしたらすみません。
147
+ https://p-town.dmm.com/shops/hokkaido
332
148
 
149
+
150
+
151
+ のように、shop以降のURL情報(地域や店舗№)に着目する必要があるのは認識していますが、
152
+
333
- よろくお願いいたします。
153
+ どういった形でコードを作成いいか分からない状況です。
334
154
 
335
155
 
336
156