rails 独学して軽くにちゃんまとめつくる

Rubyによるクローラー開発技法をよんで part1

1章でWgetというソフトをつかってクローラーとはなんぞやというのを勉強するが、うまくいかなかったのでやめた。Wgetというのは後から使うものではないので、飛ばしてもよし。だから2章から勉強を始めるちなみに2章にはさまざまなソースコードが出てくるが、p74で初めてgemをダウンロードするので、それまでのコードは実行できないので注意。

 

 

p~90 クローリング

p91~

 

 

 

クローラー 

それ単体だけですべてできるgem: anemone, machinize, selenium & capybara(単体でも両方でも可能)

 

ウェブページへいき内容を取得し巡回する機能。ボットといえばわかりやすいかな。指定したウェブサイトに飛んでいって、

内容の取得(クローリング)
データの解析(スクレイピング
データの保存

の3つの機能を駆使して目的のデータを取得する。

 

 

クローリング()

 

ウェブページを巡回してくれる機能。たとえばアマゾンのページに行って、値段がランキングが1位の商品のリンクへいってこい!というような、条件付きの目的地まで行ってくれる機能。

 

スクレイピング

 

ダウンロードしたページを解析し、特定のデータを抜き出す機能。解析の手段として使われるのは2つ。「正規表現」と「HTMLやXMLから解析」する。後者はアマゾンのページから <title>と<img>を持ってこい!というようにhtmlのタグを利用して特定のデータを抜き出してくる。この本ではこのhtmlの解析に重きを置いている。

 

 

 

Anemoneの利用

主に使うメソッド

focus_crawl(クローリング)

ページごとに、どのリンク先を巡回するか指定する

 

skip_links_like(クローリング)

巡回したURLを正規表現で指定

 

on_every_page(クローリング&スクレイピング
取得してページに対して行う処理を指定。

 

on_pages_like(スクレイピング)取得したページに対し正規表現で絞込をし、そうして選んだページに対して行う処理を指定。

 

 

anemone と文字コード

anemone

 

 

 

 

 

 

p74ダウンロード

Rails Tutorial というのを読み進めていたのでぼくはCloud9というクラウドIDEを使っているので本書とは違うやり方で進めている。もし同じのを使ってる人は読んでほしい。ローカルな開発環境の人は本通りに進めていけばできるはず。

さらには Cloud9 でrails を使っている。そうしたら楽なので Cloud9 を使ってる人はrails で進めてみよう。

 

 

Gemfile に以下を書き込む

gem 'anemone' 

 そしてターミナルで

bundle install

 をする。それだけ。

 

テスト用に sample.rb というファイルを作り、p86にあるコードの

 

require 'anemone'

urls = ["http://www.amazon.co.jp/gp/bestsellers/books/",
        "http://www.amazon.co.jp/gp/bestsellers/digital-text/2275256051"]

Anemone.crawl(urls, :depth_limit => 1, :skip_query_strings => true) do |anemone|
  anemone.focus_crawl do |page|
    page.links.keep_if{ |link|
      link.to_s.match(/\/gp\/bestsellers\/books|\/gp\/bestsellers\/digital-text/)
    }
  end
 
  anemone.on_every_page do |page|
    puts page.url
  end
end 

 を打ち込み、コマンドライン

$ ruby sample.rb

 を実行すると

http://www.amazon.co.jp/gp/bestsellers/digital-text/2275256051
https://www.amazon.co.jp/gp/bestsellers/digital-text/2275256051
http://www.amazon.co.jp/gp/bestsellers/books/
https://www.amazon.co.jp/gp/bestsellers/books/
https://www.amazon.co.jp/gp/bestsellers/digital-text/2292699051/ref=zg_bs_nav_kinc_2_2275256051/353-6556113-1906056
https://www.amazon.co.jp/gp/bestsellers/digital-text/2292095051/ref=zg_bs_nav_kinc_2_2275256051/353-6556113-1906056
https://www.amazon.co.jp/gp/bestsellers/digital-text/ref=zg_bs_unv_kinc_1_2275256051_1/353-6556113-1906056 

 こんなのが50くらい出てくる。

もしここで実行できない人は、このコードをコピペして実行してみたらいい。もしくはコマンドラインで現在の位置がまちがえてるのかもしれない。

f:id:mooooooooooriiiiii:20161209140555p:plain

現在ぼくは arduino¥AnalyzeVibrationの下に sample.rb というファイルをつくったから、コマンドラインでは

 

f:id:mooooooooooriiiiii:20161209140754p:plain

 

こんな表示のもとで  $ruby sample.rb を実行した。この位置関係を踏まえてぜひもう一度実行してもらいたい。

 

また、何も表示されずに作業が完了してしまった人は、urlが間違えてないか確認したらいい。たとえば urlを http://amazooooon.co.jp として先ほどのコードを実行してみると

f:id:mooooooooooriiiiii:20161209141646p:plain

こんな感じで何も実行されないまま終わってしまった。

 

 

 

 

 

xpath

 

f:id:mooooooooooriiiiii:20161209144816p:plain

 

firebug -> FirePath に //*[@id="zg_listTitle"] と打ち込み、Enter する。

そうしたらこんな感じになる。

ほんのまま //*[@id=\"zg_listTitle\"] このコードを打つのは間違い。これは正規表現だから、Xpath とは別。

 

 

 

 

まさかこんな愚か者はいないだろうが、1週目は僕がまさに同じことをしていたので、だれかの後学のために書き記す。

 

本書でアマゾンのxpath がいっぱい書いてあるが、まさか丁寧に書き写すだけで、実際にアマゾンのサイトにいってないという不届きものはいませんよね?

//*[@id=\"zg_listTitle\"]/span このコードが実際のサイトの

 

f:id:mooooooooooriiiiii:20161209152439p:plain

 

ここをしめしてることを知らないでページを進めていこうとする人はいませんよね・・・・???ドキドキ

 

さらに、わざわざこのxpathのコードをわざわざ手でうってる人はいないよね??大半の人はこの firebug というソフトを使って自分で探しだしてコピペしてるのを知らない人はいないよ・・・ね???

 

 

 

 

 

 

 

 

$ ruby sample100.rb
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb

:225:in `open_loop': redirection forbidden:

http://www.amazon.co.jp/gp/rss/bestsellers/digital-text/2291657051 ->

https://www.amazon.co.jp/gp/rss/bestsellers/digital-text/2291657051

(RuntimeError) 

 

こんなエラーがでたとき、https の s が抜けていますよということ。p100はエラーコードだというわけだ。赤色のコードに s を付け足した青色のコードに書き直せばいい。

 

 

 

 

 

 

 $ ruby sample126.rb
DEPRECATED: #default_wait_time= is deprecated,


please use
#default_max_wait_time= instead
/usr/local/rvm/gems/ruby-2.3.0/gems/selenium-webdriver-3.0.3/lib/selenium/webdriver/common/service.rb
:59:in `binary_path':  Unable to find Mozilla geckodriver.

 

Please download the server from
https://github.com/mozilla/geckodriver/releases
and place it somewhere on your PATH.

More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver. (Selenium::WebDriver::Error::WebDriverError)