RavyPop

=͟͟͞͞(๑=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞

Rubyの勉強を兼ねてWebクローラっぽいのを作ってみたいと思った

最近研究が忙しいのでせっかく作ったブログを更新してない。更新する内容もないからいんだけど。というか研究が忙しくないことなんてないんですけど。

まぁそんなこんなで"Webクローラ"を作りたいと思いました(突然)。Rubyの勉強を兼ねて挑戦しようと思うので、自分の考えだけで色々と作っていきたいと思います。目標としては"目的の画像ファイルを勝手に集めてくれるやつ"を作りたいなと思いました。

 ====

今回rubyにおいて正規表現のマッチした部分だけを見る変数があるのを知りました。

 
http_img = /http.*?jpg/
if image =~ http_img
  puts $&
end

"$&"はマッチした部分が保存される変数のようです。

 

そして最初はとりあえず

  1. http通信をしてレスポンスを受けとる
  2. レスポンスデータを解析して、画像タグとリンクタグを取り出す

というところから作ってみました。以下のhttp通信のところはずっと前にどこかのブログからコピペしたものです(早速他力本願)。どこかわかり次第リンクを張ります。

"response.body"でレスポンスデータを見れるので、そこから正規表現を使って"<img>"と"<a>"の2つのタグを抽出しています。その後抽出したタグ1つ1つを配列にプッシュしていきます。

# -*- coding: utf-8 -*-
require "net/http"
require "uri"

ImgArray = Array.new
LinkArray = Array.new

uri = URI.parse("http://news4vip.livedoor.biz/");
Net::HTTP.start(uri.host, uri.port){|http|
  #ヘッダー部
  header = {
    "user-agent" => "Ruby/#{RUBY_VERSION} MyHttpClient"
  }
  #ボディ部
  body = "id=1&name=name"
  #送信
  response = http.post(uri.path, body, header)
  p response
  #  p response.body

  #
  # imgタグとaタグのみをレスポンスデータから抽出する
  #
  reImg = /<img.*?>/
  str = response.body
  str.gsub(reImg) do |matched|
    ImgArray << matched
  end

  reA = /<a.*?>/
  str.gsub(reA) do |matched|
    LinkArray << matched
  end
}

この配列に格納されたそれぞれのタグからリンクを取り出します。"<img>"タグからは画像へのリンク、"<a>"タグからは次のページへのリンクを取り出します。

http_img = /http.*?jpg/
ImgArray.each do |image|
  if image =~ http_img
    puts $&
  end
end

http_link = /http.*?\"/
LinkArray.each do |link|
  if link =~ http_link
    puts $&
  end
end

配列から取り出した各文字列から正規表現をつかって"http......"の部分を取り出します。上のままだとlinkのほうに"が残ってしまうけどうまい方法が見つからないので最後にとればいいと思いました。

 

とりあえず今はここまでです。空いた時間でちょこちょこ作っていきたいと思います。

 

tokihiro000/Crawler · GitHub