루비에서 크롤링할 때 자바스크립트로 인해 데이터를 못 얻어오는 경우는 어떡해야 하나요?


nokogiri를 이용하여 웹크롤링을 연습하고 있는데요. http://media.daum.net/digital/mobile/#page=1&type=tit_cont 이 url에서 아래와 같이 빨간색 친 부분의 기사의 url를 출력하는 코드를 만들어봤습니다. 이미지

하지만 해당 부분은 자바스크립트로 만들어지는 부분이라 페이지소스보기 하면 보이지않습니다. 그래서 nokogiri를 통하여 원하는 결과값이 나오지 않습니다. 크롬 개발자도구를 통하여는 아래와 같이 코드가 보입니다. 이미지

제가 짠 코드는 아래와 같습니다.


url = "http://media.daum.net/digital/mobile/#page=1&type=tit_cont"
page1 = Nokogiri::HTML(open(url))

cl =page1.css("#listWrap")
child1=cl.children
child1.each do |c| 
    if c.name == "li"
        html_a= c.css('a').attr("href")
        strH = html_a.to_s
        puts strH    
    end 

end 

자바스크립트로 인하여 크롤링이 안되는 부분을 어떻게 해야 크롤링 할 수 있나요? 궁금합니다.

  • 2016년 08월 13일에 작성됨

조회수 158


1 답변


좋아요
2
싫어요
채택취소하기

open-uri대신 phantomjs, selenium, watir를 이용하시면 됩니다. open-uri 는 url 데이터 그대로 획득하는 용도라 브라우저에서 동적으로 만들어내는 컨텐츠를 읽어오지 못합니다.

CapybaraPoltergeist(phantomjs)로 다음과 같은 방식으로 구현할 수 있습니다.

visit url
within ("div#listWrap") do
  all("li").map do |base|
    img_url = base.find("img")["src"] 
    title = base.find("a.tit").text
    content = base.find("a.txt").text
    [img_url, title, content]
  end
end

find 예외처리를 추가하고, 코드를 간추리면 다음과 같이 됩니다.

require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

include Capybara::DSL
Capybara.default_driver = :poltergeist

visit("http://media.daum.net/digital/mobile/#page=1&type=tit_cont")
type_daum_news1 = ->b { ([b.find("img")["src"] rescue "no_img"),
                         b.find("a.tit").text, b.find("a.txt").text] }
contents = within ("div#listWrap") { all('li').map(&type_daum_news1) } 
p contents #=> [[img, title, contents], ... [..,contents] ]

결과 이미지

  • 2016년 08월 14일에 작성됨

  • 자세한 설명 감사합니다!    youngyol   2016.8.16 14:32     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close