質問編集履歴

4

表記を修正しました。

2019/11/27 05:43

投稿

george6493
george6493

スコア25

test CHANGED
File without changes
test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
 
98
98
 
99
- df = gethogeSearch.search_amazon(df, search_word, get_pages)
99
+ df = gethogeSearch.search_hoge(df, search_word, get_pages)
100
100
 
101
101
 
102
102
 

3

表示乱れを修正しました。

2019/11/27 05:43

投稿

george6493
george6493

スコア25

test CHANGED
File without changes
test CHANGED
@@ -70,13 +70,45 @@
70
70
 
71
71
  グローバル変数としてではなく、main.pyで指定した上で各モジュールには引数渡しをする
72
72
 
73
- ```main.py
73
+ ```main
74
+
74
-
75
+ import pandas as pd
76
+
77
+ import gethogeSearch
78
+
79
+
80
+
81
+ #各関数で共有するグローバル変数/最終成果物のcsvのモト
82
+
83
+ columns = ["Name", "Price", "Url"]
84
+
85
+ df = pd.DataFrame(columns=columns)
86
+
87
+
88
+
89
+ #実行時にターミナルから叩く
90
+
91
+ search_word = input('検索する語句:')
92
+
93
+ number = input('ページ数:')
94
+
95
+ get_pages = int(number)
96
+
97
+
98
+
99
+ df = gethogeSearch.search_amazon(df, search_word, get_pages)
100
+
101
+
102
+
103
+ print(df)
104
+
105
+
106
+
75
- ```
107
+ ```
76
-
77
-
78
-
108
+
109
+
110
+
79
- ```searchhoge
111
+ ```gethogesearch
80
112
 
81
113
  #coding UTF-8
82
114
 
@@ -230,50 +262,10 @@
230
262
 
231
263
  return df #empty dataframe
232
264
 
233
- #試したこと
234
-
235
- 各関数では、global dfとしています。しかし、name 'df' is not definedエラーが出ています。
236
-
237
- かつ、mainでは以下のように定義〜呼び出しを行っています。タイミング的には呼び出しの前にglobalを宣言しています。
238
-
239
-
240
-
241
- ```main
242
-
243
- import gethogeSearch
244
-
245
- import pandas as pd
246
-
247
-
248
-
249
- #各関数で共有するグローバル変数/最終成果物のcsvのモト
250
-
251
- columns = ["Name", "Price", "Url"]
252
-
253
- df = pd.DataFrame(columns=columns)
254
-
255
-
256
-
257
- #実行時にターミナルから叩く
258
-
259
- search_word = input('検索する語句:')
260
-
261
- number = input('ページ数:')
262
-
263
- get_pages = int(number)
264
-
265
-
266
-
267
- df = gethogeSearch.search_hoge(df, search_word, get_pages)
268
-
269
- print(df) #Columns: [Name, Price, Url]
270
-
271
-       #Index: []
272
-
273
265
  ```
274
266
 
275
267
 
276
268
 
277
269
  #教えていただきたいこと
278
270
 
279
- dfを関間で共有する方法はありますでょうか。もしくは各関数終わったらCSVに吐くなどしデータを共有する方が良いでしょうか。
271
+ なぜ引しができていないのでしょうか。

2

回答でご教示いただいた引数渡しによってもうまくいかないため、関数定義もとsearchhoge.py、呼び出しmain.pyの全文を追記いたしました。

2019/11/27 05:26

投稿

george6493
george6493

スコア25

test CHANGED
File without changes
test CHANGED
@@ -66,7 +66,169 @@
66
66
 
67
67
  ```
68
68
 
69
-
69
+ #(2019/11/27追記)試したこと
70
+
71
+ グローバル変数としてではなく、main.pyで指定した上で各モジュールには引数渡しをする
72
+
73
+ ```main.py
74
+
75
+ ```
76
+
77
+
78
+
79
+ ```searchhoge
80
+
81
+ #coding UTF-8
82
+
83
+
84
+
85
+ import requests
86
+
87
+ from bs4 import BeautifulSoup
88
+
89
+ import pandas as pd
90
+
91
+ import csv
92
+
93
+ from time import sleep
94
+
95
+ import random
96
+
97
+ import lxml.html
98
+
99
+
100
+
101
+ def search_hoge(df, search_word, get_pages):
102
+
103
+
104
+
105
+
106
+
107
+ #検索ワードからスクレイピング対象URL(=url)生成(略)
108
+
109
+
110
+
111
+ page = 1
112
+
113
+
114
+
115
+ try:
116
+
117
+ #「get_pages」のページ分だけ繰り返す
118
+
119
+ while page < get_pages + 1:
120
+
121
+
122
+
123
+ #何ページ目を取得している最中なのか表示
124
+
125
+ print(page,"ページを取得中.....")
126
+
127
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'}
128
+
129
+
130
+
131
+ #作成したURLからHTMLを取得
132
+
133
+ response = requests.get(url, headers=headers)
134
+
135
+ sleepTime = random.randint(2,8)
136
+
137
+
138
+
139
+
140
+
141
+ #BeautifulSoupの初期化
142
+
143
+ soup = BeautifulSoup(response.content, "lxml")
144
+
145
+
146
+
147
+ #検索結果リスト全体
148
+
149
+ items = soup.select(".hoge")
150
+
151
+
152
+
153
+ #リスト各要素に対して
154
+
155
+ for item in items:
156
+
157
+ name = item.find("span", {"class":"huga"})
158
+
159
+ price = item.find("span", {"class":"hoge"})
160
+
161
+ #空でないならdfに追加
162
+
163
+ if name != None and price != None:
164
+
165
+ nameTitle = name.string
166
+
167
+ priceText = price.string
168
+
169
+ item_url = item.a.get("href")
170
+
171
+ se = pd.Series([nameTitle, priceText, item_url], columns)
172
+
173
+ print(se)
174
+
175
+ df = df.append(se, columns)
176
+
177
+
178
+
179
+ #ページの下の方の「次のページ」のURLを取得
180
+
181
+ NextUrl = soup.find('li', {"class":"hg"})
182
+
183
+ Url = NextUrl.a.get("href")
184
+
185
+ url = huga + Url
186
+
187
+
188
+
189
+ #次のページに行くので変数pageの値を1大きくする
190
+
191
+ page += 1
192
+
193
+ sleepTime = random.randint(3,15)
194
+
195
+ sleep(sleepTime)
196
+
197
+ except:
198
+
199
+ #取得しようと思ったページ数まで到達する前に終わったらそのページ以降はなかったと出力
200
+
201
+ nextpage = str(page+1)
202
+
203
+ print(nextpage + "以降のページはなかった")
204
+
205
+
206
+
207
+ finally:
208
+
209
+ #保存するcsvのファイル名を決める
210
+
211
+ filename = search_words + ".csv"
212
+
213
+
214
+
215
+ #作成したリストをcsvへ
216
+
217
+ df.to_csv(filename, encoding = 'utf-8-sig')
218
+
219
+
220
+
221
+ print("対象としたURL:" + url)
222
+
223
+
224
+
225
+ #終わったことを出力
226
+
227
+ print(filename + "を作成しました")
228
+
229
+
230
+
231
+ return df #empty dataframe
70
232
 
71
233
  #試したこと
72
234
 
@@ -76,12 +238,10 @@
76
238
 
77
239
 
78
240
 
79
- ```main.py
241
+ ```main
80
242
 
81
243
  import gethogeSearch
82
244
 
83
- import getId
84
-
85
245
  import pandas as pd
86
246
 
87
247
 
@@ -104,17 +264,11 @@
104
264
 
105
265
 
106
266
 
107
- gethogeSearch.search_hoge(search_word, get_pages)
267
+ df = gethogeSearch.search_hoge(df, search_word, get_pages)
268
+
108
-
269
+ print(df) #Columns: [Name, Price, Url]
270
+
109
- print(df)
271
+       #Index: []
110
-
111
-
112
-
113
- getAsin.getId(df)
114
-
115
-
116
-
117
- print(df)
118
272
 
119
273
  ```
120
274
 
@@ -122,4 +276,4 @@
122
276
 
123
277
  #教えていただきたいこと
124
278
 
125
- dfを関数間で共有する方法はありますでしょうか。もしくは各関数が終わったらCSVに吐くなどしてデータを共有する方が良いでしょうk
279
+ dfを関数間で共有する方法はありますでしょうか。もしくは各関数が終わったらCSVに吐くなどしてデータを共有する方が良いでしょう

1

tiitoiさま、dfの参照タイミングを追記いたしました。hayataka2049さま、Traceback全文を掲載いたしました。

2019/11/27 05:21

投稿

george6493
george6493

スコア25

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,27 @@
44
44
 
45
45
 
46
46
 
47
- この後もIDを使ってさらに別サイトでスクレイピングしていきたいため、dfをグローバルで扱いたいと思っていますが、そもそも上にあげた二つの処理すらうまくいっていません。
47
+ この後もIDを使ってさらに別サイトでスクレイピングしていきたいため、dfをグローバルで扱いたいと思っていますが、そもそも上にあげた二つの処理すらうまくいっていません。
48
+
49
+
50
+
51
+
52
+
53
+ ```Traceback
54
+
55
+ Traceback (most recent call last):
56
+
57
+ File "main.py", line 14, in <module>
58
+
59
+ gethogeSearch.search_hoge(search_word, get_pages)
60
+
61
+ File "/hoge/gethogeSearch.py", line 102, in search_hoge
62
+
63
+ print(df)
64
+
65
+ NameError: name 'df' is not defined
66
+
67
+ ```
48
68
 
49
69
 
50
70
 
@@ -52,6 +72,52 @@
52
72
 
53
73
  各関数では、global dfとしています。しかし、name 'df' is not definedエラーが出ています。
54
74
 
75
+ かつ、mainでは以下のように定義〜呼び出しを行っています。タイミング的には呼び出しの前にglobalを宣言しています。
76
+
77
+
78
+
79
+ ```main.py
80
+
81
+ import gethogeSearch
82
+
83
+ import getId
84
+
85
+ import pandas as pd
86
+
87
+
88
+
89
+ #各関数で共有するグローバル変数/最終成果物のcsvのモト
90
+
91
+ columns = ["Name", "Price", "Url"]
92
+
93
+ df = pd.DataFrame(columns=columns)
94
+
95
+
96
+
97
+ #実行時にターミナルから叩く
98
+
99
+ search_word = input('検索する語句:')
100
+
101
+ number = input('ページ数:')
102
+
103
+ get_pages = int(number)
104
+
105
+
106
+
107
+ gethogeSearch.search_hoge(search_word, get_pages)
108
+
109
+ print(df)
110
+
111
+
112
+
113
+ getAsin.getId(df)
114
+
115
+
116
+
117
+ print(df)
118
+
119
+ ```
120
+
55
121
 
56
122
 
57
123
  #教えていただきたいこと