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