Ruby로 스크래핑 해 보았습니다.
12618 단어 루비CapybaraMechanizepoltergeist스크래핑
스크래핑 재미
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
또 하나의 소망이 이루어졌습니다.
어려운 일은 여전히 있지만 공부가되었습니다
Reference
이 문제에 관하여(Ruby로 스크래핑 해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rinkun/items/cebd8e25aec13b6bb933텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)