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

조회수 2566회

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 

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

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 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] ]
    

    결과 이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)