teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

タイトルを変更しました

2019/07/02 07:25

投稿

nasu0922
nasu0922

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- WEBスクレイピング beautifulsoup4 情報取得できずにループが抜け問題
1
+ WEBスクレイピング beautifulsoup4 ページを変遷し情報取得もページを残し終わってしまう
body CHANGED
File without changes

3

実現したいこと、問題点等わかりやすく修正しました。また、ソースコードも余計なものは省きました

2019/07/02 07:25

投稿

nasu0922
nasu0922

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,66 +1,34 @@
1
1
  ### 前提・実現したいこと
2
- DMMぱちタウンからスロットの遊技機情報をWEBスクレイピングで取得し、CSV出力をしようとソースコードを作成しております
2
+ DMMぱちタウンからスロットの遊技機情報をWEBスクレイピングで取得したい
3
- ■実現したいこと
4
- スロットの全機種の情報取得(メーカーID、メーカ名、機種ID、機種名~機種概要)
3
+ スロットの全機種の情報取得(メーカーID、メーカ名、機種ID、機種名~機種概要)
5
- CSVファイルに保存
6
- ■できていること
7
- 機種情報の取得~CSVファル保存まで。
4
+ <取得イメージ>
8
- ただし、400機種分までしか取得できていないです。
9
- ■解決したいこと
10
- スロット全機種の情報取得~CSVファイル保存までです。エラーが出ていませんが400機種で処理が終わってしまいます。
5
+ 1.3491:https://p-town.dmm.com/machines/3491
6
+ [['3491', 'タマどき!', '4', 'JPS', '97.2%〜105.6%', '2019/10上旬予定', 'コンサートホールグループでのみ打つことができるオリジナルパチスロが、この『タマどき!』。擬似ボーナスを搭載したAT機となっており、リール左右の花が
11
- ループ処理うまくいっていのでし
7
+ 光ればボーナス確定だ。ボーナス後の32G間はボーナスの引き戻しに期待でき、最大ループ率は約90%と大量出玉への期待膨らむ仕様となっている。花光り方滞在モードを示唆ているので、ここにも注目しておこう。', '']]・・・以下続く
12
8
 
13
- ご協力お願いたします。
9
+ ###できてること
10
+ 上記イメージ通り、スロット機種情報の取得はできています。
14
11
 
12
+ ###できていないこと
13
+ ループはできていますが、400機種目(20ページ目の最後の機種)で終わってしまいます。
14
+
15
- ### 発生る問題・エラーメッセージ
15
+ ### 実現こと
16
+ 全ページを横断し、スロット全機種の情報を取得したい。
16
17
  エラーも特に出ていませんが、400機種を取得後にループを抜けて処理が終わってしまい、対応策が見つからず苦慮しております。
17
- ```
18
-
19
- ```
20
- ### 該当のソースコード
18
+ ### 該当のソースコード(余計なものは省きました)
21
-
22
19
  ```python3
23
20
  import requests
24
- import logging
25
21
  import random
26
22
  import time
27
23
  import re
28
- import csv
29
24
  from bs4 import BeautifulSoup
30
- from os import chdir, path
31
- from datetime import datetime, timedelta, timezone
32
25
 
33
26
  if __name__ == "__main__":
34
27
 
35
- # タイムゾーンの生成
36
- JST = timezone(timedelta(hours=+9), 'JST')
37
-
38
- # カレントディレクトリをスクリプトパスに変更
39
- chdir(path.dirname(__file__))
40
-
41
- # ベースとなる出力ファイル名を定義
42
- out_file_base = path.splitext(path.basename(__file__))[0]
43
- out_file_base = out_file_base + '_{0:%Y%m%d}_{0:%H%M%S}'.format(datetime.now(JST))
44
-
45
- # ログファイル名を定義
46
- log_file_name = path.splitext(path.basename(__file__))[0] + '_log'
47
- log_file_name = log_file_name + '_{0:%Y%m%d}'.format(datetime.now(JST)) + '.log'
48
- # フォーマットを定義
49
- formatter = '%(asctime)s : %(levelname)s : %(message)s'
50
- # ログレベルを DEBUG に変更
51
- #logging.basicConfig(level=logging.DEBUG)
52
- logging.basicConfig(format=formatter, filename=log_file_name, level=logging.INFO)
53
- #logging.basicConfig(level=logging.DEBUG, format=formatter)
54
-
55
- # User-Agent をIE11に偽装する
56
- headers = {
57
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
58
- }
59
-
60
28
  #requestsを使って、webから取得
61
29
  base_url = 'https://p-town.dmm.com/machines'
62
30
  target_url = '/slot'
63
- r = requests.get(base_url + target_url, headers=headers)
31
+ r = requests.get(base_url + target_url)
64
32
  soup = BeautifulSoup(r.text, 'lxml')
65
33
 
66
34
  # データカラム定義
@@ -69,10 +37,8 @@
69
37
  csv_list = []
70
38
  #機種IDループ
71
39
  for link_ in soup.find_all('a', class_='link', href=re.compile(r'/machines/' + '\d+')):
72
- #csv_list = []
73
40
  machine_url = link_.attrs.get('href')
74
41
  machine_id = machine_url.rsplit('/', 1)[1]
75
- logging.info('%s %s', '[' + machine_id + ']:', base_url + '/' + machine_id)
76
42
  selector = 'body > div.o-layout > div > div > main > section li'
77
43
  nextpage = True
78
44
  while nextpage:
@@ -94,10 +60,8 @@
94
60
  machine_id = target_url.rsplit('/', 1)[1]
95
61
  machine_list[0] = machine_id
96
62
  time.sleep(random.randint(1, 3)) #スリープ(1秒~3秒)
97
- r2 = requests.get(base_url + '/' + machine_id, headers=headers)
63
+ r2 = requests.get(base_url + '/' + machine_id)
98
- get_date = datetime.now(JST)
99
64
  soup2 = BeautifulSoup(r2.text, 'lxml')
100
- logging.info('%s %s', str(num) + '[' + machine_id + ']:', base_url + '/' + machine_id)
101
65
  print(str(num)+ '.'+ machine_id + ':' + base_url + '/' + machine_id)
102
66
  #機種名取得
103
67
  for title in soup2.select('h1[class="title"]'):
@@ -116,7 +80,6 @@
116
80
  makers = -1
117
81
  machine_list[2] = makers
118
82
  machine_list[col_list.index(th_)] = td_
119
- machine_list[col_list.index('取得日時')] = get_date.strftime('%Y-%m-%dT%H:%M:%S%z')
120
83
  csv_list.append(machine_list)
121
84
  #print(csv_list)
122
85
  # 次ページ読込、なければループ終了
@@ -124,23 +87,15 @@
124
87
  if pages_.text == '>':
125
88
  if pages_.next.attrs.get('href') is not None:
126
89
  target_url = pages_.next.attrs.get('href')
127
- r = requests.get(target_url, headers=headers)
90
+ r = requests.get(target_url)
128
91
  soup = BeautifulSoup(r.text, 'lxml')
129
92
  else:
130
93
  nextpage = False
131
94
  break
132
- # CSVファイル出力
133
- csv_file = out_file_base + '_' + '.csv'
134
- csvFields = col_list
135
- with open(csv_file, 'w', newline='', errors='replace', encoding='sjis') as f:
136
- writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
137
- writer.writerow(csvFields)
138
- writer.writerows(csv_list)
139
95
 
140
96
  ```
141
97
 
142
98
  ### 試したこと
143
-
144
99
  スロット機種情報の20ページ目に何か原因があると思い、20ページ目から情報を取得したところ、特に問題なくループしたので
145
100
  ページそのものに何かあるわけではなさそうです。
146
101
  ■参考 20ページ目URL

2

2019/07/02 07:20

投稿

nasu0922
nasu0922

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,17 @@
1
1
  ### 前提・実現したいこと
2
2
  DMMぱちタウンからスロットの遊技機情報をWEBスクレイピングで取得し、CSV出力をしようとソースコードを作成しております。
3
+ ■実現したいこと
4
+ スロットの全機種の情報取得(メーカーID、メーカ名、機種ID、機種名~機種概要)
5
+ CSVファイルに保存
6
+ ■できていること
7
+ 機種情報の取得~CSVファイル保存まで。
8
+ ただし、400機種分までしか取得できていないです。
9
+ ■解決したいこと
10
+ スロット全機種の情報取得~CSVファイル保存までです。エラーが出ていませんが400機種で処理が終わってしまいます。
11
+ ループ処理がうまくいってないのでしょうか。
12
+
13
+ ご協力お願いいたします。
14
+
3
15
  ### 発生している問題・エラーメッセージ
4
16
  エラーも特に出ていませんが、400機種を取得後にループを抜けて処理が終わってしまい、対応策が見つからず苦慮しております。
5
17
  ```

1

誤字を修正いたしました。

2019/06/29 04:04

投稿

nasu0922
nasu0922

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  ### 前提・実現したいこと
2
- DMMぱちタウンからスロットの遊技機情報をWEBスクレイピングで取得し、CSV出力をしようソースコードを作成しております。
2
+ DMMぱちタウンからスロットの遊技機情報をWEBスクレイピングで取得し、CSV出力をしようソースコードを作成しております。
3
3
  ### 発生している問題・エラーメッセージ
4
4
  エラーも特に出ていませんが、400機種を取得後にループを抜けて処理が終わってしまい、対応策が見つからず苦慮しております。
5
5
  ```