質問編集履歴

2

修正

2017/01/18 22:03

投稿

dlrowolleh
dlrowolleh

スコア120

test CHANGED
File without changes
test CHANGED
@@ -4,15 +4,13 @@
4
4
 
5
5
  APIが提供されていない、
6
6
 
7
- ウェブサイトを監視するプログラムを作りたいです。frame要素が使われているサイトのスクレイピング方法を知りたいです。
7
+ ウェブサイトを監視するプログラムを作りたいです。
8
8
 
9
9
  [大気の状態を通知してくれるWebアプリを作りました | mawatari.jp](http://mawatari.jp/archives/fukuoka-no-taiki-twitter-bot-app)
10
10
 
11
11
  [都道府県・時刻別そらまめ君URL - はてなダイアリー](http://d.hatena.ne.jp/riocampos+tech/?of=203)
12
12
 
13
- を参考にしているのですがうまくいきません。
14
-
15
- 表形式表示されています。
13
+ のようなことがやりたいです。
16
14
 
17
15
  対象サイトは
18
16
 
@@ -20,7 +18,23 @@
20
18
 
21
19
  です。
22
20
 
21
+ LinuxのPCで
22
+
23
+ 年月日、時間、OX、風向きのデータを保存、
24
+
25
+ OXが一定値を超えていたら、メールで通知みたいなことを考えています。(mailコマンド)
26
+
27
+ Rubyで実現したいのですが、どのようにすればいいでしょうか。
28
+
29
+
30
+
31
+ ###問題点
32
+
33
+ APIが提供されていない、
34
+
23
- frameタグのsrc属性で関連付けられているファイルを表示しているようです
35
+ frameタグで関連付けられているsrcのファイルを表示しているため、やり方が分からない
36
+
37
+
24
38
 
25
39
  様々な書籍を参考にさせていただきましたが
26
40
 
@@ -28,27 +42,15 @@
28
42
 
29
43
  [Spidering Hacks――ウェブ情報ラクラク取得テクニック101選](https://www.oreilly.co.jp/books/4873111870/)
30
44
 
31
- APIを使用することを前提にしていたり、
32
-
33
45
  よくわかりませんでした。
34
46
 
35
47
  そのようなサイトへのスクレイピングはどのように行うのが一般的なのでしょうか。
36
48
 
37
- LinuxのPCで
38
-
39
- 年月日、時間、OX、風向きのデータを保存、
40
-
41
- OXが一定値を超えていたら、メールで通知みたいなことを考えています。(mailコマンド)
42
-
43
- Rubyで実現したいのですが、どのようにすればいいでしょうか。
44
-
45
-
46
-
47
49
 
48
50
 
49
51
  ###試したこと
50
52
 
51
-
53
+ RubyのMechanizeを使用しました。
52
54
 
53
55
  ```Ruby
54
56
 

1

大幅な修正

2017/01/18 22:02

投稿

dlrowolleh
dlrowolleh

スコア120

test CHANGED
@@ -1 +1 @@
1
- frame要素が使われているサイトのスクレイピング方法を教えていただけませんか
1
+ frameタグが使われているサイトのスクレイピング方法を教えていただけませんか
test CHANGED
@@ -1,22 +1,96 @@
1
+ 似たような質問ばかりしてしまい、大変恐縮ですが何卒よろしくお願いします。
2
+
1
3
  ###前提・実現したいこと
2
4
 
5
+ APIが提供されていない、
6
+
3
- ウェブサイトを監視するプログラムを作ていす。
7
+ ウェブサイトを監視するプログラムを作りたいです。frame要素が使われているサイトのスクレイピング方法を知りたいです。
8
+
9
+ [大気の状態を通知してくれるWebアプリを作りました | mawatari.jp](http://mawatari.jp/archives/fukuoka-no-taiki-twitter-bot-app)
10
+
11
+ [都道府県・時刻別そらまめ君URL - はてなダイアリー](http://d.hatena.ne.jp/riocampos+tech/?of=203)
12
+
13
+ を参考にしているのですがうまくいきません。
4
14
 
5
15
  表形式で表示されています。
6
16
 
17
+ 対象サイトは
18
+
19
+ [港区台場 - 大気汚染物質広域監視システム(そらまめ君)ホームページ](http://soramame.taiki.go.jp/DataList.php?MstCode=13108020)
20
+
21
+ です。
22
+
7
- frame要素が使われているようです。
23
+ frameタグのsrc属性で関連付けられているファイルを表示しているようです。
24
+
25
+ 様々な書籍を参考にさせていただきましたが
26
+
27
+ [SBクリエイティブ:Rubyによるクローラー開発技法](http://www.sbcr.jp/products/4797380354.html)
28
+
29
+ [Spidering Hacks――ウェブ情報ラクラク取得テクニック101選](https://www.oreilly.co.jp/books/4873111870/)
30
+
31
+ APIを使用することを前提にしていたり、
32
+
33
+ よくわかりませんでした。
8
34
 
9
35
  そのようなサイトへのスクレイピングはどのように行うのが一般的なのでしょうか。
10
36
 
37
+ LinuxのPCで
38
+
39
+ 年月日、時間、OX、風向きのデータを保存、
40
+
11
- 表の特定の場所一定以上の数字が表示されていたら処理するように考えているのでが、うまくいきません
41
+ OXが一定値を超えていたら、メールで通知みたいなことを考えていす。(mailコマンド)
12
-
42
+
13
- frame要素が用いられていて表(テーブル)形式表示されてるようなウェブサイトスクレイピングはどのように行うのが一般的な方法なのでしょうか。
43
+ Ruby実現したいのですが、どのようにすればいいでしょうか。
44
+
45
+
46
+
47
+
14
48
 
15
49
  ###試したこと
16
50
 
51
+
52
+
53
+ ```Ruby
54
+
55
+ 1 require "mechanize"
56
+
57
+ 2 agent = Mechanize.new
58
+
59
+ 3 agent.user_agent_alias = "Windows Chrome"
60
+
61
+ 4
62
+
17
- `wget --follow-tags=src http://example.com/DataList.php?MstCode=0123456`
63
+ 5 top = "http://soramame.taiki.go.jp/"
64
+
18
-
65
+ 6 id = "DataList.php?MstCode=13108020"
66
+
67
+ 7 url = top + id
68
+
69
+ 8
70
+
71
+ 9 page = agent.get(url)
72
+
73
+ 10 page.root.xpath("//frame").each do |frame|
74
+
75
+ 11 if frame["name"] == "Hyou"
76
+
77
+ 12 frame_url = frame["src"]
78
+
79
+ 13 frame_page = agent.get(frame_url)
80
+
81
+ 14 open("/home/pc/Desktop/hoge/work/hoge.html","w"){|f| f.write frame_page.body.force_encoding(frame_page.encoding).encode("utf-8")} # utf-8に変換して書く場合
82
+
83
+ 15 end
84
+
85
+ 16 end
86
+
87
+ 17
88
+
89
+ 18 puts page.body.force_encoding(page.encoding).encode("utf-8")
90
+
19
- ↓結果
91
+ ```
92
+
93
+ でsrcファイルがhoge.htmlに保存できました。
20
94
 
21
95
  ```HTML
22
96
 
@@ -26,7 +100,7 @@
26
100
 
27
101
  <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
28
102
 
29
- <title>文字化けしていました</title>
103
+ <title>ページのタイトル</title>
30
104
 
31
105
  </head>
32
106
 
@@ -44,49 +118,11 @@
44
118
 
45
119
  ```
46
120
 
121
+
122
+
47
- GoogleCromeでXpathを取得しました。
123
+ また、GoogleCromeでXpathを取得しました。
48
-
49
- GoogleCromeで要素を右クリック→Copy→Copy Xpath→貼り付け
124
+
50
-
51
- しかし、frameで表形式で表示されているようなサイトでは、Xpathを指定してもうまく動作しません。
125
+
52
-
53
- > 対象のサイトのHTML
54
-
55
-
56
-
57
- ```HTML
58
-
59
- <html>
60
-
61
- <head>
62
-
63
- <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
64
-
65
- <title>ページのタイトル</title>
66
-
67
- </head>
68
-
69
- <frameset rows="180,*" cols="*" frameBorder="0">
70
-
71
- <frame name="Titke" src="DataListTitle.php?MstCode=01234567&Time=2017011804" scrolling="no">
72
-
73
- <frame name="Hyou" src="DataListHyou.php?MstCode=01234567&Time=2017011804" scrolling="yes">
74
-
75
- </frameset>
76
-
77
- <noframes></noframes>
78
-
79
- </html>
80
-
81
- ```
82
-
83
- > 取得できたXpath↓
84
-
85
- ```HTML
86
-
87
- /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18]
88
-
89
- ```
90
126
 
91
127
  > frameに関連づけられているファイル(DataListHyou.php?MstCode=01234567&Time=2017011804)
92
128
 
@@ -190,52 +226,108 @@
190
226
 
191
227
 
192
228
 
193
- に該当しま
194
-
195
-
196
-
197
- frameに関連付けられているファイルをhoge.htmlとして保存して
198
-
199
- `xmllint --shell --encode utf-8 hoge.html`
200
-
201
- してみたのですが、
202
-
203
- > hoge.html:17: parser error : Opening and ending tag mismatch: META line 5 and head
204
-
205
- </head>
206
-
207
- ^
208
-
209
- hoge.html:4331: parser error : Opening and ending tag mismatch: input line 21 and form
210
-
211
- </form>
212
-
213
- ^
214
-
215
- hoge.html:4332: parser error : Opening and ending tag mismatch: form line 20 and body
216
-
217
- </body>
218
-
219
- ^
220
-
221
- hoge.html:4333: parser error : Opening and ending tag mismatch: body line 19 and html
222
-
223
- </html>
224
-
225
- ^
226
-
227
- hoge.html:4334: parser error : Premature end of data in tag link line 4
228
-
229
- hoge.html:4334: parser error : Premature end of data in tag head line 2
230
-
231
- hoge.html:4334: parser error : Premature end of data in tag html line 1
232
-
233
-
234
-
235
- となりました。
236
-
237
-
229
+ に該当するので、
230
+
231
+ 取得しいXpathは
232
+
233
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18] 年
234
+
235
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18]
236
+
237
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18] 日
238
+
239
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18] 時間
240
+
241
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18] OXの値
242
+
243
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[18] 風向き
244
+
245
+ です。
246
+
247
+ ```C
248
+
249
+ #include<stdio.h>
250
+
251
+
252
+
253
+ int main(void){
254
+
255
+ int i = 0;
256
+
257
+ int j = 0;
258
+
259
+ for(i=1;i<=192;i++){
260
+
261
+ for(j=1;j<=17;j++){
262
+
263
+ if(j>4&&j<17&&j!=10){ // 4〜17の間は
264
+
265
+ continue; // 処理しない
266
+
267
+ } // ためのループ
268
+
269
+ printf("/html/body/form/table/tbody/tr/td/table/tbody/tr[%d]/td[%d]\n",i,j);
270
+
271
+ }
272
+
273
+ }
274
+
275
+ return 0;
276
+
277
+ }
278
+
279
+ ```
280
+
281
+
282
+
283
+ >
284
+
285
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[1]
286
+
287
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[2]
288
+
289
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[3]
290
+
291
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[4]
292
+
293
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[10]
294
+
295
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[1]/td[17]
296
+
297
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[2]/td[1]
298
+
299
+ 〜省略〜
300
+
301
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[191]/td[2]
302
+
303
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[191]/td[3]
304
+
305
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[191]/td[4]
306
+
307
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[191]/td[10]
308
+
309
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[191]/td[17]
310
+
311
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[1]
312
+
313
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[2]
314
+
315
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[3]
316
+
317
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[4]
318
+
319
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[10]
320
+
321
+ /html/body/form/table/tbody/tr/td/table/tbody/tr[192]/td[17]
322
+
323
+
324
+
325
+ とできたのでうまく利用できないかと思っています。
326
+
327
+ 質問を大幅に変更しました。失礼しました。
238
328
 
239
329
  ###補足情報(言語/FW/ツール等のバージョンなど)
240
330
 
241
- より詳細な情報
331
+ 環境はUbuntu です。
332
+
333
+ ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux]