LoginSignup
2
0

More than 5 years have passed since last update.

某プログラマーコミュニティサイトのタグを全て取得するrubyプログラム

Last updated at Posted at 2018-02-12

投稿前に第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というドメインは使われてないらしい)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0