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

回答編集履歴

4

追記

2017/10/05 04:26

投稿

NCC1701
NCC1701

スコア1683

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

コメントに応じた追記

2017/10/05 04:25

投稿

NCC1701
NCC1701

スコア1683

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

誤字の修正

2017/10/05 04:24

投稿

NCC1701
NCC1701

スコア1683

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  ```
15
15
  はページの作り方を見ると、`empty`になる可能性はほぼありません。無限ループに陥ります。
16
16
 
17
- そして、`unless doc.css('.skin-btnIndex')`は`Nokogiri::XML::NodeSet`というものが返り値になります。ほぼArrayと思って処理すればよいでしょう。デバッグの際は`unless doc.css('.skin-btnIndex').empty?`の直前に`p unless doc.css('.skin-btnIndex')`などとして、値を見ながらいわゆるプリントデバッグを使えばわかりやすいです。(慣れてくればデバッガを使えばよいですが、おそらくデバッガが使えるくらいになると、本件の問題はやすやすと解決できるようになってます)
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

コメントに応じた編集

2017/10/03 06:29

投稿

NCC1701
NCC1701

スコア1683

answer CHANGED
@@ -1,9 +1,22 @@
1
1
  ```ruby
2
2
  blog_id = ''
3
- url = "https://ameblo.jp/sunsuntaiyo/entrylist-#{blog_id}.html"
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
- もそも論ですが、`open(url, "User-Agent" => user_agent)`してれでは404 Not Foundしか戻ってせん。
8
- `url = https://ameblo.jp/sunsuntaiyo/entrylist-.html`
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ページごとにページを取得してから遷移していく