質問編集履歴

2

プログラム修正版を加筆しました。

2019/09/04 08:00

投稿

s61september
s61september

スコア5

test CHANGED
File without changes
test CHANGED
@@ -205,3 +205,123 @@
205
205
  不足している情報などございましたらご指摘頂けましたら幸いです。
206
206
 
207
207
  宜しくお願い致します。
208
+
209
+
210
+
211
+ ###(追記)修正したプログラム
212
+
213
+
214
+
215
+ ご回答ありがとうございます。
216
+
217
+ 頂いたアドバイスを参考に下記の通り修正したところ、うまく動きました。
218
+
219
+
220
+
221
+ ```python
222
+
223
+ import requests
224
+
225
+ from bs4 import BeautifulSoup
226
+
227
+ import sys
228
+
229
+
230
+
231
+ #ページネーション(次の20件)を変数 i で表現。今回は10ページ目まで取得している
232
+
233
+ #i は数値(int)のため、URLに入れ込む際には文字列(str)に変換している
234
+
235
+ #rangeは通常0から始まるするため、引数として1を追加して、1から始まるようにしている
236
+
237
+ for i in range(1, 10):
238
+
239
+ #URLの"A1302"は「東京・日本橋」のディレクトリのため、他のエリアの場合は手打ちで変更必要
240
+
241
+ list_url = "https://tabelog.com/tokyo/A1302/rstLst/"+str(i)+"/?Srt=D&SrtT=rt&sort_mode=1"
242
+
243
+
244
+
245
+ #店舗一覧ページに対するBeautifulSoupの設定
246
+
247
+ r_list = requests.get(list_url)
248
+
249
+ html_list = r_list.content
250
+
251
+ soup_list = BeautifulSoup(html_list, "html.parser")
252
+
253
+
254
+
255
+ #店舗一覧ページ内の個別店舗ページURLの抽出
256
+
257
+ stores = soup_list.find_all(class_="list-rst__rst-name-target")
258
+
259
+ storeURLs = [ x['href'] for x in stores ]
260
+
261
+
262
+
263
+ #個別店舗のドリンクメニューページを集めたリストを作成
264
+
265
+ #個別店舗ページURLの末尾にドリンクメニューのディレクトリを追記したものをリストへ追加
266
+
267
+ drinkURLs = []
268
+
269
+ for storeURL in storeURLs:
270
+
271
+ drinkURL = storeURL +"dtlmenu/drink/"
272
+
273
+ drinkURLs.append(drinkURL)
274
+
275
+
276
+
277
+ #各店舗のドリンクメニューページに希望のビール銘柄の記載があるか、リスト内URLを順番に確認
278
+
279
+ for target_url in drinkURLs:
280
+
281
+
282
+
283
+ #個別店舗ドリンクページに対するBeautifulSoupの設定
284
+
285
+ r = requests.get(target_url)
286
+
287
+ html = r.content
288
+
289
+ soup = BeautifulSoup(html, "html.parser")
290
+
291
+
292
+
293
+ #個別店舗の店名を抽出
294
+
295
+ store_name = soup.find(class_="display-name").text
296
+
297
+
298
+
299
+ #個別店舗の評価を抽出
300
+
301
+ rating_score_tag = soup.find('b', class_='c-rating__val')
302
+
303
+ rating_score = rating_score_tag.span.string
304
+
305
+
306
+
307
+ #個別店舗ドリンクページ内のテキストを全取得
308
+
309
+ all_text=soup.find(all).text
310
+
311
+
312
+
313
+ #テキスト内に希望ビール銘柄の記載があれば、店名と評価を表示する
314
+
315
+ #記載がなければ、その旨を表示する
316
+
317
+ if "キリン" in all_text:
318
+
319
+ print(store_name+rating_score)
320
+
321
+ else:
322
+
323
+ print(store_name+"キリンは置いていません")
324
+
325
+
326
+
327
+ ```

1

内容をより詳細に記載させて頂きました。

2019/09/04 08:00

投稿

s61september
s61september

スコア5

test CHANGED
File without changes
test CHANGED
@@ -6,74 +6,202 @@
6
6
 
7
7
 
8
8
 
9
- 食べログ個別店舗ページスクレイピングして
10
-
11
- テキスト内に希望ワードが含まれていれば店名と評価を表示するプログラムを組みました
12
-
13
- (ex.ビールの銘柄)
14
-
15
-
16
-
17
- ステップと
18
-
19
- 舗一覧ページ(例:https://tabelog.com/tokyo/A1302/)
20
-
21
- に掲載されている各店舗のURLを自動取得して、
22
-
23
- 複数店舗について一気に調べられるようにしたいのですが、
24
-
25
- ようにプログラミングしたらよいでしょうか?
26
-
27
-
28
-
29
- ホームページ等調べてみたのですが、方針も立てられず、
30
-
31
- ご相談に乗っていただけましたら幸いです。
9
+ 飲み会でビール銘柄指定されることが多いのですが
10
+
11
+ 食べログではビールの銘柄での絞り込ができせん
12
+
13
+
14
+
15
+ そこで、食べログをスクレイピングして、店舗一覧ページ(エリアで絞り込み後)の中から、
16
+
17
+ 店舗説明テキスト内に希望ビール銘柄が含まれている店舗を抽出し、
18
+
19
+ 名と評価を表示するプログラムを組みたいと考えております。
20
+
21
+
22
+
23
+
24
+
25
+ ### 該当ソースコード
26
+
27
+
28
+
29
+ ※途中ま作成しのです
30
+
31
+
32
+
33
+ ```python
34
+
35
+ import requests
36
+
37
+ from bs4 import BeautifulSoup
38
+
39
+
40
+
41
+ #店舗一覧ページに対するBeautifulSoupの設定
42
+
43
+ list_url = 'https://tabelog.com/tokyo/A1302/'
44
+
45
+ r_list = requests.get(list_url)
46
+
47
+ html_list = r_list.content
48
+
49
+ soup_list = BeautifulSoup(html_list, "html.parser")
50
+
51
+
52
+
53
+ #店舗一覧ページ内のURLリンクの抽出
54
+
55
+ for aa in soup_list.find_all("a"):
56
+
57
+ link = aa.get("href")
58
+
59
+ name = aa.get_text()
60
+
61
+ print(link,"\t",name)
62
+
63
+
64
+
65
+
66
+
67
+ #個別店舗ページに対するBeautifulSoupの設定
68
+
69
+ target_url = 'https://tabelog.com/tokyo/A1312/A131201/13234764/dtlmenu/drink/'
70
+
71
+ r = requests.get(target_url)
72
+
73
+ html = r.content
74
+
75
+ soup = BeautifulSoup(html, "html.parser")
76
+
77
+
78
+
79
+ #個別店舗の店名を抽出
80
+
81
+ store_name = soup.find(class_="display-name").text
82
+
83
+ #print(store_name)
84
+
85
+
86
+
87
+ #個別店舗の評価を抽出
88
+
89
+ rating_score_tag = soup.find('b', class_='c-rating__val')
90
+
91
+ rating_score = rating_score_tag.span.string
92
+
93
+
94
+
95
+ #個別店舗ページ内のテキストを全取得
96
+
97
+ all_text=soup.find(all).text
98
+
99
+
100
+
101
+ #テキスト内に希望ビール銘柄が含まれていたら店名と評価を表示する
102
+
103
+ if "アサヒ" in all_text:
104
+
105
+ print(store_name+rating_score)
106
+
107
+ ```
108
+
109
+
110
+
111
+ ### できていること
112
+
113
+ ・店舗一覧ページ内に記載のあるURLを抽出すること
114
+
115
+ ・個別店舗ページ内のテキストにビール銘柄が含まれていたら店名と評価を表示すること**
116
+
117
+
118
+
119
+ ###できていないこと
120
+
121
+ ①店舗一覧ページに記載のあるURLすべてを抽出してしまっている
122
+
123
+ →個別店舗のリンクURLのみを抽出したいができていない
124
+
125
+
126
+
127
+ ②上記①で個別店舗のリンクURLのみを抽出できたとして、リスト化の仕方がわからない
128
+
129
+
130
+
131
+ ③上記②のリストから順番にtarget_urlに代入を繰り返す処理をしたいができていない
132
+
133
+
134
+
135
+ ###つまづいているポイント
136
+
137
+
138
+
139
+ ①については、個別店舗URLは下記のようなクラス設定がされているため、
140
+
141
+ find_allの際にクラス指定をすればよいのかと思ったが、やり方がわからない。
142
+
143
+
144
+
145
+ <a class="list-rst__rst-name-target cpy-rst-name js-ranking-num" target="_blank" data-list-dest="item_top" data-ranking="1" href="https://tabelog.com/tokyo/A1302/A130204/13018162/">日本橋蛎殻町 すぎた</a>
146
+
147
+
148
+
149
+ ③については、コードの"#個別店舗ページに対するBeautifulSoupの設定"以下を
150
+
151
+ ```python
152
+
153
+ def check(target_url):
154
+
155
+ #個別店舗ページに対するBeautifulSoupの設定
156
+
157
+ target_url = 'https://tabelog.com/tokyo/A1312/A131201/13234764/dtlmenu/drink/'
158
+
159
+ r = requests.get(target_url)
160
+
161
+ html = r.content
162
+
163
+ soup = BeautifulSoup(html, "html.parser")
164
+
165
+ #個別店舗の店名を抽出
166
+
167
+ store_name = soup.find(class_="display-name").text
168
+
169
+ #print(store_name)
170
+
171
+ #個別店舗の評価を抽出
172
+
173
+ rating_score_tag = soup.find('b', class_='c-rating__val')
174
+
175
+ rating_score = rating_score_tag.span.string
176
+
177
+ #個別店舗ページ内のテキストを全取得
178
+
179
+ all_text=soup.find(all).text
180
+
181
+ #テキスト内に希望ビール銘柄が含まれていたら店名と評価を表示する
182
+
183
+ if "アサヒ" in all_text:
184
+
185
+ print(store_name+rating_score)
186
+
187
+ ```
188
+
189
+ などとして関数化し、for文でtarget_urlにリストから順番にURLを代入させる?
190
+
191
+ というような方法でしょうか?イメージがついておりません。
192
+
193
+
194
+
195
+
196
+
197
+ コメントを下さった方、ありがとうございます。
198
+
199
+ 自分なりに改めて考えて追記致しました。
200
+
201
+ Markdown記法についてはわかっていない部分が多く申し訳ございません。
202
+
203
+
204
+
205
+ 不足している情報などございましたらご指摘頂けましたら幸いです。
32
206
 
33
207
  宜しくお願い致します。
34
-
35
-
36
-
37
-
38
-
39
- ### 該当のソースコード
40
-
41
-
42
-
43
- ※途中まで作成したものです↓
44
-
45
-
46
-
47
- import requests
48
-
49
- from bs4 import BeautifulSoup
50
-
51
-
52
-
53
- target_url = 'https://tabelog.com/tokyo/A1312/A131201/13234764/dtlmenu/drink/'
54
-
55
- r = requests.get(target_url)
56
-
57
- html = r.content
58
-
59
- soup = BeautifulSoup(html, "html.parser")
60
-
61
-
62
-
63
- store_name = soup.find(class_="display-name").text
64
-
65
-
66
-
67
- rating_score_tag = soup.find('b', class_='c-rating__val')
68
-
69
- rating_score = rating_score_tag.span.string
70
-
71
-
72
-
73
- all_text=soup.find(all).text
74
-
75
-
76
-
77
- if "アサヒ" in all_text:
78
-
79
- print(store_name+rating_score)