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

質問編集履歴

4

表記を修正しました。

2019/11/27 05:43

投稿

george6493
george6493

スコア25

title CHANGED
File without changes
body CHANGED
@@ -47,7 +47,7 @@
47
47
  number = input('ページ数:')
48
48
  get_pages = int(number)
49
49
 
50
- df = gethogeSearch.search_amazon(df, search_word, get_pages)
50
+ df = gethogeSearch.search_hoge(df, search_word, get_pages)
51
51
 
52
52
  print(df)
53
53
 

3

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

2019/11/27 05:43

投稿

george6493
george6493

スコア25

title CHANGED
File without changes
body CHANGED
@@ -34,10 +34,26 @@
34
34
  ```
35
35
  #(2019/11/27追記)試したこと
36
36
  グローバル変数としてではなく、main.pyで指定した上で各モジュールには引数渡しをする
37
- ```main.py
37
+ ```main
38
+ import pandas as pd
39
+ import gethogeSearch
40
+
41
+ #各関数で共有するグローバル変数/最終成果物のcsvのモト
42
+ columns = ["Name", "Price", "Url"]
43
+ df = pd.DataFrame(columns=columns)
44
+
45
+ #実行時にターミナルから叩く
46
+ search_word = input('検索する語句:')
47
+ number = input('ページ数:')
48
+ get_pages = int(number)
49
+
50
+ df = gethogeSearch.search_amazon(df, search_word, get_pages)
51
+
52
+ print(df)
53
+
38
54
  ```
39
55
 
40
- ```searchhoge
56
+ ```gethogesearch
41
57
  #coding UTF-8
42
58
 
43
59
  import requests
@@ -114,27 +130,7 @@
114
130
  print(filename + "を作成しました")
115
131
 
116
132
  return df #empty dataframe
117
- #試したこと
118
- 各関数では、global dfとしています。しかし、name 'df' is not definedエラーが出ています。
119
- かつ、mainでは以下のように定義〜呼び出しを行っています。タイミング的には呼び出しの前にglobalを宣言しています。
120
-
121
- ```main
122
- import gethogeSearch
123
- import pandas as pd
124
-
125
- #各関数で共有するグローバル変数/最終成果物のcsvのモト
126
- columns = ["Name", "Price", "Url"]
127
- df = pd.DataFrame(columns=columns)
128
-
129
- #実行時にターミナルから叩く
130
- search_word = input('検索する語句:')
131
- number = input('ページ数:')
132
- get_pages = int(number)
133
-
134
- df = gethogeSearch.search_hoge(df, search_word, get_pages)
135
- print(df) #Columns: [Name, Price, Url]
136
-       #Index: []
137
133
  ```
138
134
 
139
135
  #教えていただきたいこと
140
- dfを関間で共有する方法はありますでょうか。もしくは各関数終わったらCSVに吐くなどしデータを共有する方が良いでしょうか。
136
+ なぜ引しができていないのでしょうか。

2

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

2019/11/27 05:26

投稿

george6493
george6493

スコア25

title CHANGED
File without changes
body CHANGED
@@ -32,14 +32,94 @@
32
32
  print(df)
33
33
  NameError: name 'df' is not defined
34
34
  ```
35
+ #(2019/11/27追記)試したこと
36
+ グローバル変数としてではなく、main.pyで指定した上で各モジュールには引数渡しをする
37
+ ```main.py
38
+ ```
35
39
 
40
+ ```searchhoge
41
+ #coding UTF-8
42
+
43
+ import requests
44
+ from bs4 import BeautifulSoup
45
+ import pandas as pd
46
+ import csv
47
+ from time import sleep
48
+ import random
49
+ import lxml.html
50
+
51
+ def search_hoge(df, search_word, get_pages):
52
+
53
+
54
+ #検索ワードからスクレイピング対象URL(=url)生成(略)
55
+
56
+ page = 1
57
+
58
+ try:
59
+ #「get_pages」のページ分だけ繰り返す
60
+ while page < get_pages + 1:
61
+
62
+ #何ページ目を取得している最中なのか表示
63
+ print(page,"ページを取得中.....")
64
+ 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'}
65
+
66
+ #作成したURLからHTMLを取得
67
+ response = requests.get(url, headers=headers)
68
+ sleepTime = random.randint(2,8)
69
+
70
+
71
+ #BeautifulSoupの初期化
72
+ soup = BeautifulSoup(response.content, "lxml")
73
+
74
+ #検索結果リスト全体
75
+ items = soup.select(".hoge")
76
+
77
+ #リスト各要素に対して
78
+ for item in items:
79
+ name = item.find("span", {"class":"huga"})
80
+ price = item.find("span", {"class":"hoge"})
81
+ #空でないならdfに追加
82
+ if name != None and price != None:
83
+ nameTitle = name.string
84
+ priceText = price.string
85
+ item_url = item.a.get("href")
86
+ se = pd.Series([nameTitle, priceText, item_url], columns)
87
+ print(se)
88
+ df = df.append(se, columns)
89
+
90
+ #ページの下の方の「次のページ」のURLを取得
91
+ NextUrl = soup.find('li', {"class":"hg"})
92
+ Url = NextUrl.a.get("href")
93
+ url = huga + Url
94
+
95
+ #次のページに行くので変数pageの値を1大きくする
96
+ page += 1
97
+ sleepTime = random.randint(3,15)
98
+ sleep(sleepTime)
99
+ except:
100
+ #取得しようと思ったページ数まで到達する前に終わったらそのページ以降はなかったと出力
101
+ nextpage = str(page+1)
102
+ print(nextpage + "以降のページはなかった")
103
+
104
+ finally:
105
+ #保存するcsvのファイル名を決める
106
+ filename = search_words + ".csv"
107
+
108
+ #作成したリストをcsvへ
109
+ df.to_csv(filename, encoding = 'utf-8-sig')
110
+
111
+ print("対象としたURL:" + url)
112
+
113
+ #終わったことを出力
114
+ print(filename + "を作成しました")
115
+
116
+ return df #empty dataframe
36
117
  #試したこと
37
118
  各関数では、global dfとしています。しかし、name 'df' is not definedエラーが出ています。
38
119
  かつ、mainでは以下のように定義〜呼び出しを行っています。タイミング的には呼び出しの前にglobalを宣言しています。
39
120
 
40
- ```main.py
121
+ ```main
41
122
  import gethogeSearch
42
- import getId
43
123
  import pandas as pd
44
124
 
45
125
  #各関数で共有するグローバル変数/最終成果物のcsvのモト
@@ -51,13 +131,10 @@
51
131
  number = input('ページ数:')
52
132
  get_pages = int(number)
53
133
 
54
- gethogeSearch.search_hoge(search_word, get_pages)
134
+ df = gethogeSearch.search_hoge(df, search_word, get_pages)
135
+ print(df) #Columns: [Name, Price, Url]
55
- print(df)
136
+       #Index: []
56
-
57
- getAsin.getId(df)
58
-
59
- print(df)
60
137
  ```
61
138
 
62
139
  #教えていただきたいこと
63
- dfを関数間で共有する方法はありますでしょうか。もしくは各関数が終わったらCSVに吐くなどしてデータを共有する方が良いでしょうk
140
+ dfを関数間で共有する方法はありますでしょうか。もしくは各関数が終わったらCSVに吐くなどしてデータを共有する方が良いでしょう

1

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

2019/11/27 05:21

投稿

george6493
george6493

スコア25

title CHANGED
File without changes
body CHANGED
@@ -21,10 +21,43 @@
21
21
  |hoge |hoga |hogu |abc|
22
22
  |huga |hoga |huge |def|
23
23
 
24
- この後もIDを使ってさらに別サイトでスクレイピングしていきたいため、dfをグローバルで扱いたいと思っていますが、そもそも上にあげた二つの処理すらうまくいっていません。
24
+ この後もIDを使ってさらに別サイトでスクレイピングしていきたいため、dfをグローバルで扱いたいと思っていますが、そもそも上にあげた二つの処理すらうまくいっていません。
25
25
 
26
+
27
+ ```Traceback
28
+ Traceback (most recent call last):
29
+ File "main.py", line 14, in <module>
30
+ gethogeSearch.search_hoge(search_word, get_pages)
31
+ File "/hoge/gethogeSearch.py", line 102, in search_hoge
32
+ print(df)
33
+ NameError: name 'df' is not defined
34
+ ```
35
+
26
36
  #試したこと
27
37
  各関数では、global dfとしています。しかし、name 'df' is not definedエラーが出ています。
38
+ かつ、mainでは以下のように定義〜呼び出しを行っています。タイミング的には呼び出しの前にglobalを宣言しています。
28
39
 
40
+ ```main.py
41
+ import gethogeSearch
42
+ import getId
43
+ import pandas as pd
44
+
45
+ #各関数で共有するグローバル変数/最終成果物のcsvのモト
46
+ columns = ["Name", "Price", "Url"]
47
+ df = pd.DataFrame(columns=columns)
48
+
49
+ #実行時にターミナルから叩く
50
+ search_word = input('検索する語句:')
51
+ number = input('ページ数:')
52
+ get_pages = int(number)
53
+
54
+ gethogeSearch.search_hoge(search_word, get_pages)
55
+ print(df)
56
+
57
+ getAsin.getId(df)
58
+
59
+ print(df)
60
+ ```
61
+
29
62
  #教えていただきたいこと
30
63
  dfを関数間で共有する方法はありますでしょうか。もしくは各関数が終わったらCSVに吐くなどしてデータを共有する方が良いでしょうk。