Ruby로 스크래핑 해 보았습니다.

스크래핑에 도전했기 때문에 샘플 코드를 공개.
스크래핑 재미

Rails가 아닌 기본 Ruby 코드를 작성했습니다.
gem은 bundler로 설치.
bundler로 설치한 gem을 로드하는 방법은 여기 .

mechanize 편



처음 도전한 것은 mechanize 라는 gem.
WEB사이트의 인터랙션을 자동화해 주는 gem이라고 합니다.
htp // // cs. 세이 t0rb. 오 rg / 정말로 /

이번에는 그림책 네비게이션부터,
「쿠스노키단치」시리즈의 타이틀 일람과 표지 화상을 취득해,
제목을 터미널에 표시하고 이미지를 로컬에 저장합니다.

그럼 조속히 작업 개시.
$ mkdir scraping
$ cd scraping
$ rbenv local 2.2.3
$ bundle init
$ vim Gemfile
// gem 'mechanize'と追記してください。

$ bundle install --path vendor/bundle
$ touch ehon.rb

ehon.rb
# bundler経由でインストールしたgemを有効にするには下記のようにする
require 'bundler'
Bundler.require

# 検索したい絵本のタイトル URL用に日本語をエンコーディングする必要あり
keyword = "くすのきだんち".encode("Shift_JIS")

# 「K」というパラメーターにkeywordを渡してやれば検索結果の一覧を表示できるみたい
target_url = "http://www.ehonnavi.net/ehon01.asp?sel=1&K=#{keyword}"

# 画像の格納ディレクトリ なければ作る
dir_path = "./imgs"
FileUtils.mkdir_p(dir_path) unless FileTest.exist?(dir_path)

# スクレイピング用のコード
# クラス名'.detailOneCol'で絞り込んで、eachでまわしながら、
# 1件ずつタイトルを出力 画像は保存
agent = Mechanize.new
search_page = agent.get(target_url)
search_page.search('.detailOneCol').each do |item|
 puts title = item.search('div.text h3').inner_text # さらに絞り込み
 search_page.image_with(alt: "#{title}").fetch.save("#{dir_path}/#{title}.jpg") # altの値がtitleと一致しているので絞り込める
end

가능하면,
$ ruby ehon.rb

와우! 굉장한
단지 이것만으로 소망이 이루어졌습니다.

scraping.rb
agent = Mechanize.new
search_page = agent.get('http://example.com')
p search_page.links[0].click

그러면 링크 대상 페이지도 얻을 수 있습니다.

scraping.rb
agent = Mechanize.new
search_page = agent.get('http://example.com')
form = search_page.forms[0]
form.name = 'name'
form.password = 'secret'
p agent.submit(form)

그런 다음 양식 항목을 입력하여 제출한 페이지를 검색할 수 있습니다.

그러나, mechanize (은)는 보통으로 사용하면(자), JavaScript를 실행할 수 없습니다.
어라, 어떻게

Capybara + Poltergeist (PhantomJS) 편



클릭 이벤트 등 JS를 실행하여 동적으로 페이지를 조작하고 싶다면,
브라우저의 액션을 시뮬레이션 Capybara하면,
JavaScript 드라이버를 조합하여 실현합니다.

이번에는 드라이버에 PhantomJS를 사용합니다.
또한 Ruby에서 PhantomJS를 처리 할 수 ​​있도록 Poltergeist라는 gem을 도입합니다.

Capybara
htps : // 기주 b. 이 m / j에 ck ぁ s / 또는 py 장미

Poltergeist
htps : // 기주 b. 코 m / 테아 mpo l r 게이 st / pol r gei st

Gemfile에 추가.
gem 'capybara'
gem 'poltergeist'

가능하다면, bundle install.
PhantomJS도 설치하십시오.
$ brew install phantomjs

반다이 채널부터, 「이누야샤 제1기」전 44화의 각화 타이틀을 터미널에 표시해 봅니다.

h tp // w w. b-ch. 이 m/t tl/그리고 x. php? tl_c=2277
방문하면 페이지 오른쪽에 '작품 정보'가 보인다고 생각합니다.
하단 메뉴에서 "각 이야기 개요"의 링크를 클릭하면 onClick 이벤트에서 제 1 이야기의 제목과 개요가 표시됩니다.
'각 이야기 개요'라는 제목 아래의 페이지 네이션을 클릭하면 추가 onClick 이벤트에서 내용이 다시 작성되어 각 이야기의 제목과 개요를 확인할 수 있습니다.

이것을 Capybara를 사용하여 자동화하면 다음과 같습니다.
$ touch bandai.rb

bandai.rb
require 'bundler/setup'
require 'capybara/poltergeist'
Bundler.require

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :timeout => 1000 })
end
session = Capybara::Session.new(:poltergeist)
session.visit "http://www.b-ch.com/ttl/index.php?ttl_c=2277"
puts session.status_code
puts '各話タイトル'

# 「各話あらすじ」をクリックする => onClickが実行される 
session.find('div.ttlinfo-menu').all('ul')[0].all('li')[2].find('a').click

# 第1話タイトル
puts session.find('div#ttlinfo-stry').find('dt').text

# 第2話タイトル〜
# 最終話は動的に取得してもよいかも
2.upto(44) do |num|
  # onClickイベント ページネーションクリック
  session.find('div#ttlinfo-stry').find('p#page-list').click_link num.to_s
  sleep 3 # ajaxで内容が書き換えられる間少し待つ。待ち時間は適当...
  puts session.find('div#ttlinfo-stry').find('dt').text
end
$ ruby bandai.rb

또 하나의 소망이 이루어졌습니다.
어려운 일은 여전히 ​​있지만 공부가되었습니다

좋은 웹페이지 즐겨찾기