回答編集履歴

4

追記

2017/10/05 04:26

投稿

NCC1701
NCC1701

スコア1680

test CHANGED
@@ -45,6 +45,8 @@
45
45
 
46
46
 
47
47
  #####ここからコメントに応じた追記
48
+
49
+ スクレイピングは、Rubyの問題より、HTML、CSS、Javascriptを読めるかどうかの方がウェイトが大きいです。
48
50
 
49
51
  ```ruby
50
52
 

3

コメントに応じた追記

2017/10/05 04:25

投稿

NCC1701
NCC1701

スコア1680

test CHANGED
@@ -41,3 +41,139 @@
41
41
  (ヒント`<a href="https://ameblo.jp/sunsuntaiyo/entrylist-646.html" data-uranus-component="paginationEnd" class="skin-paginationEnd skin-btnIndex js-paginationEnd"><span data-uranus-icon="end"></span></a>`)
42
42
 
43
43
  0. 1ページごとにページを取得してから遷移していく
44
+
45
+
46
+
47
+ #####ここからコメントに応じた追記
48
+
49
+ ```ruby
50
+
51
+ #!/usr/bin/env ruby
52
+
53
+ # -*- encoding:utf-8 -*-
54
+
55
+
56
+
57
+ require 'benchmark'
58
+
59
+ require "open-uri"
60
+
61
+ require "nokogiri"
62
+
63
+
64
+
65
+ def first
66
+
67
+ url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
68
+
69
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'
70
+
71
+
72
+
73
+ charset = nil
74
+
75
+ html = open(url, "User-Agent" => user_agent) do |f|
76
+
77
+ charset = f.charset
78
+
79
+ f.read
80
+
81
+ end
82
+
83
+ doc = Nokogiri::HTML.parse(html, nil, charset)
84
+
85
+ page_end = doc.css('.skin-paginationEnd').attribute("href").value.tr('^0-9', '').to_i
86
+
87
+
88
+
89
+ @first = []
90
+
91
+ 1.upto(page_end) do |num|
92
+
93
+ url = "https://ameblo.jp/sunsuntaiyo/entrylist-%d.html"%(num)
94
+
95
+ charset = nil
96
+
97
+ html = open(url, "User-Agent" => user_agent) do |f|
98
+
99
+ charset = f.charset
100
+
101
+ f.read
102
+
103
+ end
104
+
105
+ doc = Nokogiri::HTML.parse(html, nil, charset)
106
+
107
+ doc.css("#main > div.skin-blogArchive > div.skin-blogArchiveBody.skin-bgMain > ul > li > div > div:nth-child(2) > h2 > a").each do |row|
108
+
109
+ @first << row
110
+
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+
117
+
118
+
119
+ def second
120
+
121
+ url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
122
+
123
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'
124
+
125
+
126
+
127
+ @second = []
128
+
129
+ while url
130
+
131
+ charset = nil
132
+
133
+ html = open(url, "User-Agent" => user_agent) do |f|
134
+
135
+ charset = f.charset
136
+
137
+ f.read
138
+
139
+ end
140
+
141
+ doc = Nokogiri::HTML.parse(html, nil, charset)
142
+
143
+ doc.css("#main > div.skin-blogArchive > div.skin-blogArchiveBody.skin-bgMain > ul > li > div > div:nth-child(2) > h2 > a").each do |row|
144
+
145
+ @second << row
146
+
147
+ end
148
+
149
+
150
+
151
+ url = doc.css('.skin-paginationNext').first.attribute("href")
152
+
153
+ end
154
+
155
+ end
156
+
157
+
158
+
159
+ Benchmark.bm 15 do |r|
160
+
161
+ r.report "FIRST" do
162
+
163
+ first
164
+
165
+ end
166
+
167
+ r.report "SECOND" do
168
+
169
+ second
170
+
171
+ end
172
+
173
+ end
174
+
175
+ p @first.size
176
+
177
+ p @second.size
178
+
179
+ ```

2

誤字の修正

2017/10/05 04:24

投稿

NCC1701
NCC1701

スコア1680

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- そして、`unless doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p unless doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
33
+ そして、`doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
34
34
 
35
35
 
36
36
 

1

コメントに応じた編集

2017/10/03 06:29

投稿

NCC1701
NCC1701

スコア1680

test CHANGED
@@ -2,16 +2,42 @@
2
2
 
3
3
  blog_id = ''
4
4
 
5
- url = "https://ameblo.jp/sunsuntaiyo/entrylist-#{blog_id}.html"
5
+ url = "https://ameblo.jp/sunsuntaiyo/entrylist#{blog_id}.html"
6
6
 
7
7
  ```
8
8
 
9
+ は無駄があります。
10
+
11
+ ```ruby
12
+
13
+ url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
14
+
15
+ ```
16
+
17
+ で十分です。
9
18
 
10
19
 
11
20
 
21
+ また
12
22
 
13
- そもそも論ですが、`open(url, "User-Agent" => user_agent)`しても、これでは404 Not Foundしか戻ってきません。
23
+ ```ruby
14
24
 
15
- `url = https://ameblo.jp/sunsuntaiyo/entrylist-.html`
25
+ unless doc.css('.skin-btnIndex').empty?
16
26
 
17
- になっているからです
27
+ ```
28
+
29
+ はページの作り方を見ると、`empty`になる可能性はほぼありません。無限ループに陥ります。
30
+
31
+
32
+
33
+ そして、`unless doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p unless doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
34
+
35
+
36
+
37
+ あとはページの取得の仕方ですが、設計の方針によります。大まかに、次の2つの方法が考えられますので、頭の体操も含めて考えてみてください。
38
+
39
+ 0. 全てのページのurlを構成してからページを取得する
40
+
41
+ (ヒント`<a href="https://ameblo.jp/sunsuntaiyo/entrylist-646.html" data-uranus-component="paginationEnd" class="skin-paginationEnd skin-btnIndex js-paginationEnd"><span data-uranus-icon="end"></span></a>`)
42
+
43
+ 0. 1ページごとにページを取得してから遷移していく