回答編集履歴
4
追記
answer
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
0. 1ページごとにページを取得してから遷移していく
|
23
23
|
|
24
24
|
#####ここからコメントに応じた追記
|
25
|
+
スクレイピングは、Rubyの問題より、HTML、CSS、Javascriptを読めるかどうかの方がウェイトが大きいです。
|
25
26
|
```ruby
|
26
27
|
#!/usr/bin/env ruby
|
27
28
|
# -*- encoding:utf-8 -*-
|
3
コメントに応じた追記
answer
CHANGED
@@ -19,4 +19,72 @@
|
|
19
19
|
あとはページの取得の仕方ですが、設計の方針によります。大まかに、次の2つの方法が考えられますので、頭の体操も含めて考えてみてください。
|
20
20
|
0. 全てのページのurlを構成してからページを取得する
|
21
21
|
(ヒント`<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>`)
|
22
|
-
0. 1ページごとにページを取得してから遷移していく
|
22
|
+
0. 1ページごとにページを取得してから遷移していく
|
23
|
+
|
24
|
+
#####ここからコメントに応じた追記
|
25
|
+
```ruby
|
26
|
+
#!/usr/bin/env ruby
|
27
|
+
# -*- encoding:utf-8 -*-
|
28
|
+
|
29
|
+
require 'benchmark'
|
30
|
+
require "open-uri"
|
31
|
+
require "nokogiri"
|
32
|
+
|
33
|
+
def first
|
34
|
+
url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
|
35
|
+
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'
|
36
|
+
|
37
|
+
charset = nil
|
38
|
+
html = open(url, "User-Agent" => user_agent) do |f|
|
39
|
+
charset = f.charset
|
40
|
+
f.read
|
41
|
+
end
|
42
|
+
doc = Nokogiri::HTML.parse(html, nil, charset)
|
43
|
+
page_end = doc.css('.skin-paginationEnd').attribute("href").value.tr('^0-9', '').to_i
|
44
|
+
|
45
|
+
@first = []
|
46
|
+
1.upto(page_end) do |num|
|
47
|
+
url = "https://ameblo.jp/sunsuntaiyo/entrylist-%d.html"%(num)
|
48
|
+
charset = nil
|
49
|
+
html = open(url, "User-Agent" => user_agent) do |f|
|
50
|
+
charset = f.charset
|
51
|
+
f.read
|
52
|
+
end
|
53
|
+
doc = Nokogiri::HTML.parse(html, nil, charset)
|
54
|
+
doc.css("#main > div.skin-blogArchive > div.skin-blogArchiveBody.skin-bgMain > ul > li > div > div:nth-child(2) > h2 > a").each do |row|
|
55
|
+
@first << row
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def second
|
61
|
+
url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
|
62
|
+
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'
|
63
|
+
|
64
|
+
@second = []
|
65
|
+
while url
|
66
|
+
charset = nil
|
67
|
+
html = open(url, "User-Agent" => user_agent) do |f|
|
68
|
+
charset = f.charset
|
69
|
+
f.read
|
70
|
+
end
|
71
|
+
doc = Nokogiri::HTML.parse(html, nil, charset)
|
72
|
+
doc.css("#main > div.skin-blogArchive > div.skin-blogArchiveBody.skin-bgMain > ul > li > div > div:nth-child(2) > h2 > a").each do |row|
|
73
|
+
@second << row
|
74
|
+
end
|
75
|
+
|
76
|
+
url = doc.css('.skin-paginationNext').first.attribute("href")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
Benchmark.bm 15 do |r|
|
81
|
+
r.report "FIRST" do
|
82
|
+
first
|
83
|
+
end
|
84
|
+
r.report "SECOND" do
|
85
|
+
second
|
86
|
+
end
|
87
|
+
end
|
88
|
+
p @first.size
|
89
|
+
p @second.size
|
90
|
+
```
|
2
誤字の修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
```
|
15
15
|
はページの作り方を見ると、`empty`になる可能性はほぼありません。無限ループに陥ります。
|
16
16
|
|
17
|
-
そして、`
|
17
|
+
そして、`doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
|
18
18
|
|
19
19
|
あとはページの取得の仕方ですが、設計の方針によります。大まかに、次の2つの方法が考えられますので、頭の体操も含めて考えてみてください。
|
20
20
|
0. 全てのページのurlを構成してからページを取得する
|
1
コメントに応じた編集
answer
CHANGED
@@ -1,9 +1,22 @@
|
|
1
1
|
```ruby
|
2
2
|
blog_id = ''
|
3
|
-
url = "https://ameblo.jp/sunsuntaiyo/entrylist
|
3
|
+
url = "https://ameblo.jp/sunsuntaiyo/entrylist#{blog_id}.html"
|
4
4
|
```
|
5
|
+
は無駄があります。
|
6
|
+
```ruby
|
7
|
+
url = "https://ameblo.jp/sunsuntaiyo/entrylist.html"
|
8
|
+
```
|
9
|
+
で十分です。
|
5
10
|
|
11
|
+
また
|
12
|
+
```ruby
|
13
|
+
unless doc.css('.skin-btnIndex').empty?
|
14
|
+
```
|
15
|
+
はページの作り方を見ると、`empty`になる可能性はほぼありません。無限ループに陥ります。
|
6
16
|
|
7
|
-
そ
|
8
|
-
|
9
|
-
に
|
17
|
+
そして、`unless doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p unless doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
|
18
|
+
|
19
|
+
あとはページの取得の仕方ですが、設計の方針によります。大まかに、次の2つの方法が考えられますので、頭の体操も含めて考えてみてください。
|
20
|
+
0. 全てのページのurlを構成してからページを取得する
|
21
|
+
(ヒント`<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>`)
|
22
|
+
0. 1ページごとにページを取得してから遷移していく
|