投稿前に第5条(ユーザー資格の取消)を熟読してぎりぎりなんじゃないかと思ったrubyプログラマです!!
nokogiriとmechanizeをインストール
正直他のhttpクライアントで良かったと思う
% sudo gem install nokogiri
% sudo gem install mechanize
lazyメソッドか何かで最大ページ数の333を取り出せたと思うがやってない(やりたい)
xpathの構造をchromeの検証機能使わず(26×4なのか...とかいちいち手動でやらずに)調べられるようにしたい(クローリングする前処理のメタ的に便利なやつ作りたい)
proxyは各自で適当に(コメントアウトして串刺さずにやってもいいけどもちろん自己責任で)
xiita_tag.rb
require 'mechanize'
require 'nokogiri'
require 'benchmark'
class Crowlling
def crawl(url)
agent = Mechanize.new
# example: agent.set_proxy('hoge.com', 6060, 'email%40example.com', 'password')
agent.set_proxy('', , '', '')
agent.get(url).body
end
def parse(html)
@elements ||= []; (1..26).map{|div_id|(1..4).map{|sub_id|@elements << Nokogiri::HTML.parse(html).xpath("//*[@id='main']/div/div[#{div_id}]/div[#{sub_id}]/div/div/a").text}}
@elements
end
def make_file(all)
File.open('tags.txt','w+'){|result|result << all}
end
end
time = Benchmark.realtime do
c = Crowlling.new
@html ||= []; (1..333).map{|id|"https://xiita.com/tags?page=#{id}"}.each{|url|@html << c.crawl(url)}
@all_tag ||= []; @html.each{|html|@all_tag << c.parse(html)}
c.make_file(@all_tag)
end
puts "processing time #{time}s"
ちなみにタグ全部取り出せると
https://xiita.com/tags/Ruby/items?page=1
https://xiita.com/tags/Ruby/items?page=2
とかイテレーションして取り出せる(サイトの初期からタグ無しで投稿できたか次第だけど最初期からタグ必須なら(記事重複はするけど)全記事取得できるっぽい)
(ちなみにxiita.comというドメインは使われてないらしい)