回答編集履歴

4

軽微な修正

2020/08/13 06:13

投稿

nto
nto

スコア1438

test CHANGED
@@ -110,7 +110,11 @@
110
110
 
111
111
  self.query = res.url[len(domain):]
112
112
 
113
+ if not self.soup.find('li', string='レビューの投稿はありません'):
114
+
113
- self.spread_writes()
115
+ self.spread_writes()
116
+
117
+
114
118
 
115
119
 
116
120
 
@@ -120,35 +124,31 @@
120
124
 
121
125
  '.review_review_text', '.review_info', ".product_rep"]
122
126
 
123
- if self.soup.find('li', string='レビューの投稿はありません'):
124
127
 
125
- return
126
128
 
127
- else:
129
+ elements = [self.soup.select(e) for e in elems]
128
130
 
129
- elements = [self.soup.select(e) for e in elems]
131
+ area = elements[0][0].string
130
132
 
131
- area = elements[0][0].string
133
+ item = elements[1][0].string
132
134
 
133
- item = elements[1][0].string
135
+ postdates = elements[3]
134
136
 
135
- postdates = elements[3]
137
+ comments = elements[2]
136
138
 
137
- comments = elements[2]
139
+ reviews = elements[4]
138
140
 
139
- reviews = elements[4]
141
+ cnt = 1
140
142
 
141
- cnt = 1
143
+ for pd, cmt, rv in tqdm(zip(postdates, comments, reviews), total=len(postdates), desc=f'id{self.pageid} page{self.pagenum} writing', leave=False):
142
144
 
143
- for pd, cmt, rv in tqdm(zip(postdates, comments, reviews), total=len(postdates), desc=f'id{self.pageid} page{self.pagenum} writing', leave=False):
145
+ rv = rv.i["class"][0].replace('rep_','').replace('_','.')
144
146
 
145
- rv = rv.i["class"][0].replace('rep_','').replace('_','.')
147
+ datas = [area, item, pd.text, cmt.text, rv]
146
148
 
147
- datas = [area, item, pd.text, cmt.text, rv]
149
+ worksheet.append_row(datas)
148
150
 
149
- worksheet.append_row(datas)
150
-
151
- time.sleep(0.8)
151
+ time.sleep(0.8)
152
152
 
153
153
 
154
154
 

3

追記

2020/08/13 06:13

投稿

nto
nto

スコア1438

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  import time
68
68
 
69
-
69
+ from tqdm import tqdm
70
70
 
71
71
 
72
72
 

2

追記

2020/08/13 04:28

投稿

nto
nto

スコア1438

test CHANGED
@@ -20,13 +20,37 @@
20
20
 
21
21
  ### 追記
22
22
 
23
- ある程度を纏めました。
23
+ て修正致しました。
24
24
 
25
- 以下でご所望の形でプレッドシートに追記していく事が出来るいま
25
+ クラしてしま、for文で回すという形を取りした
26
26
 
27
+ 大半は前回の追記と変わりませんが、classを使用する事で次のページへの遷移を楽にしました。
28
+
29
+ **次のページへのリンクURLと、現在開いているページURLが異なる**(次のページがある)といった場合に
30
+
27
- 他に質問をされいてた最終行の追加ですが`append_row()`で最終行の次の行に書き込みする事が出来ます。
31
+ `self.pagenum += 1`とし、もう一度`self.pagedata_create`を実行する事で次のページへの遷移実現しております。
28
32
 
29
33
 
34
+
35
+
36
+
37
+ また、件数が膨大になってしまう事を懸念し勝手ながら`tqdm`で進捗状況を計れる様にしました。
38
+
39
+ (ご不要の場合には`zip(postdates, comments, reviews)`とし、tqdm内オプションを取り外して下さい。)
40
+
41
+
42
+
43
+ スプレッドシートへの書き込みですが
44
+
45
+ API側で書き込みが出来る件数が定められている様です。(通常は100秒に100件まで)
46
+
47
+ ネット環境にも依存すると思いますがtime.sleep()での制御を任意で調整して下さい。
48
+
49
+ tqdmによるプログレスバーにて1件あたりの書き込みに何秒が要しているか確認ができます。
50
+
51
+ 1.1~1.2sec程度になる様に抑えてあげるといいでしょう。
52
+
53
+ 1.0~1.1secで設定するとたまに書き込み制限されてしまいエラーで弾かれてしまいます。
30
54
 
31
55
 
32
56
 
@@ -58,62 +82,92 @@
58
82
 
59
83
  worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
60
84
 
85
+ domain = 'https://furunavi.jp'
61
86
 
62
87
 
63
88
 
64
89
 
65
- def sample(pageid):
66
90
 
67
- url = 'https://furunavi.jp/review_list.aspx?pid={}'.format(pageid)
91
+ class Main:
68
92
 
69
- res = requests.get(url)
93
+ def __init__(self, pageid):
70
94
 
71
- soup = BeautifulSoup(res.content, 'html.parser')
95
+ self.pageid = pageid
72
96
 
97
+ self.pagenum = 1
98
+
99
+
100
+
101
+ def pagedata_create(self):
102
+
103
+ domain = 'https://furunavi.jp'
104
+
105
+ url = '{}/review_list.aspx?pid={}&p={}'.format(domain, self.pageid, self.pagenum)
106
+
107
+ res = requests.get(url)
108
+
109
+ self.soup = BeautifulSoup(res.content, 'html.parser')
110
+
111
+ self.query = res.url[len(domain):]
112
+
73
- spread_writes(soup)
113
+ self.spread_writes()
74
114
 
75
115
 
76
116
 
77
- def spread_writes(page):
117
+ def spread_writes(self):
78
118
 
79
- elems = ["#breadcrumb ul.cf li:nth-of-type(3)", "#breadcrumb ul.cf li:nth-of-type(4)",
119
+ elems = ["#breadcrumb ul.cf li:nth-of-type(3)", "#breadcrumb ul.cf li:nth-of-type(4)",
80
120
 
81
- '.review_review_text', '.review_info', ".product_rep"]
121
+ '.review_review_text', '.review_info', ".product_rep"]
82
122
 
83
- if page.find('li', string='レビューの投稿はありません'):
123
+ if self.soup.find('li', string='レビューの投稿はありません'):
84
124
 
85
- return
125
+ return
86
126
 
87
- else:
127
+ else:
88
128
 
89
- elements = [page.select(e) for e in elems]
129
+ elements = [self.soup.select(e) for e in elems]
90
130
 
91
- item_name1 = elements[0][0].string
131
+ area = elements[0][0].string
92
132
 
93
- item_name2 = elements[1][0].string
133
+ item = elements[1][0].string
94
134
 
95
- postdates = elements[3]
135
+ postdates = elements[3]
96
136
 
97
- comments = elements[2]
137
+ comments = elements[2]
98
138
 
99
- reviews = elements[4]
139
+ reviews = elements[4]
100
140
 
101
- for pd, cmt, rv in zip(postdates, comments, reviews):
141
+ cnt = 1
102
142
 
103
- rv = rv.i["class"][0].replace('rep_','').replace('_','.')
143
+ for pd, cmt, rv in tqdm(zip(postdates, comments, reviews), total=len(postdates), desc=f'id{self.pageid} page{self.pagenum} writing', leave=False):
104
144
 
105
- datas = [item_name1, item_name2, pd.string, cmt.string, rv]
145
+ rv = rv.i["class"][0].replace('rep_','').replace('_','.')
106
146
 
107
- worksheet.append_row(datas)
147
+ datas = [area, item, pd.text, cmt.text, rv]
108
148
 
109
-
149
+ worksheet.append_row(datas)
150
+
151
+ time.sleep(0.8)
110
152
 
111
153
 
112
154
 
113
- for page in range(91610, 91620):
155
+ if self.soup.find('a', string='次へ').get('href') != self.query:
114
156
 
115
- sample(page)
157
+ self.pagenum += 1
116
158
 
159
+ self.pagedata_create()
160
+
161
+
162
+
163
+ for i in range(73086, 73099):
164
+
117
- time.sleep(1)
165
+ main = Main(i)
166
+
167
+ main.pagedata_create()
168
+
169
+ print(f'{i} Done!')
170
+
171
+ print('Finished!')
118
172
 
119
173
  ```

1

追記

2020/08/13 04:25

投稿

nto
nto

スコア1438

test CHANGED
@@ -13,3 +13,107 @@
13
13
  wks = gc.open_by_key(SPREADSHEET_KEY).sheet1
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+
20
+
21
+ ### 追記
22
+
23
+ ある程度を纏めました。
24
+
25
+ 以下でご所望の形でスプレッドシートに追記していく事が出来ると思います。
26
+
27
+ 他に質問をされいてた最終行の追加ですが`append_row()`で最終行の次の行に書き込みをする事が出来ます。
28
+
29
+
30
+
31
+
32
+
33
+ ```python
34
+
35
+ import requests
36
+
37
+ from bs4 import BeautifulSoup
38
+
39
+ from oauth2client.service_account import ServiceAccountCredentials
40
+
41
+ import gspread
42
+
43
+ import time
44
+
45
+
46
+
47
+
48
+
49
+ scope = ['https://spreadsheets.google.com/feeds',
50
+
51
+ 'https://www.googleapis.com/auth/drive']
52
+
53
+ credentials = ServiceAccountCredentials.from_json_keyfile_name('ファイル名.json', scope)
54
+
55
+ gc = gspread.authorize(credentials)
56
+
57
+ SPREADSHEET_KEY = 'スプレッドシートキー'
58
+
59
+ worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
60
+
61
+
62
+
63
+
64
+
65
+ def sample(pageid):
66
+
67
+ url = 'https://furunavi.jp/review_list.aspx?pid={}'.format(pageid)
68
+
69
+ res = requests.get(url)
70
+
71
+ soup = BeautifulSoup(res.content, 'html.parser')
72
+
73
+ spread_writes(soup)
74
+
75
+
76
+
77
+ def spread_writes(page):
78
+
79
+ elems = ["#breadcrumb ul.cf li:nth-of-type(3)", "#breadcrumb ul.cf li:nth-of-type(4)",
80
+
81
+ '.review_review_text', '.review_info', ".product_rep"]
82
+
83
+ if page.find('li', string='レビューの投稿はありません'):
84
+
85
+ return
86
+
87
+ else:
88
+
89
+ elements = [page.select(e) for e in elems]
90
+
91
+ item_name1 = elements[0][0].string
92
+
93
+ item_name2 = elements[1][0].string
94
+
95
+ postdates = elements[3]
96
+
97
+ comments = elements[2]
98
+
99
+ reviews = elements[4]
100
+
101
+ for pd, cmt, rv in zip(postdates, comments, reviews):
102
+
103
+ rv = rv.i["class"][0].replace('rep_','').replace('_','.')
104
+
105
+ datas = [item_name1, item_name2, pd.string, cmt.string, rv]
106
+
107
+ worksheet.append_row(datas)
108
+
109
+
110
+
111
+
112
+
113
+ for page in range(91610, 91620):
114
+
115
+ sample(page)
116
+
117
+ time.sleep(1)
118
+
119
+ ```