js 사이트를 스크래핑하면 selenium보다 splash!

헤드리스 브라우저 splash 가 편리했기 때문에 지견을 공유합니다

동기 부여



js로 구성된 사이트를 스크래핑하고 싶다고 생각했을 때 selenium이 defact의 선택으로 들 수 있다고 생각합니다.
그러나 selenum을 포함한 헤드리스 브라우저는 브라우징이 들어오기 때문에 처리가 너무 느려집니다. 많은 양의 페이지를 스크래핑하는 용도에는 적합하지 않습니다.
거기서, 사이트를 확실히 브라우징하면서도 퍼포먼스를 양립하는 헤드리스 브라우저라고 하는 요건으로 selenum의 대신을 찾아내고 있었는데, splash에 시라바네의 화살이 서 있었습니다.

splash란?



scrapy의 개발원인 scrapinghub사가 개발하고 있는 스크래핑에 특화한 헤드리스 브라우저입니다.
splash는 다른 헤드리스 브라우저와는 모색이 달라 Docker로 배포되는 HTTP API입니다.
문서 에도 써있듯이
- 並列でページを処理する
- ページレンダリング速度を上げるためにアドブロックや画像表示をオフにできる
- Luaで細かいブラウジング用のスクリプトをかける

같은 스크래핑에 기쁜 기능이 많이 담겨 있습니다.

만져보기



문서 과 같이 docker를 통해 설치해 봅시다.
docker pull scrapinghub/splash
docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

그러면 localhost:8050 에서 splash UI에 액세스할 수 있습니다.
이 UI에서 splash API를 두드리는 요청을 시도할 수 있습니다.



사이트를 방문해 보세요.



우선은 UI상의 Render me! 버튼을 시도해 보세요.
아래와 같이 splash를 실행한 결과를 볼 수 있습니다.



기본적으로 제공되는 브라우징을 위한 Lua 스크립트는 다음과 같습니다.
function main(splash, args)
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }  
end

여기에
  • 주어진 URL을 방문
  • 0.5초 기다린다
  • html, png, har 등의 리소스를 반환합니다.

    라고 하는 처리가 기술되고 있습니다.

    브라우징 스크립트 작성



    Lua의 브라우징 스크립트를 작성해 봅시다.
    아래는 부동산 사이트의 도도부현을 선택하는 페이지를 방문하여 부동산 등록 매물 목록 페이지를 얻는 스크립트입니다.

    방금 전의 Google 링크를 http://chintai.mhe.co.jp/search/area.php?area_cd=03로 다시 작성하고 스크립트 항목을 아래에 다시 작성하십시오.
    function main(splash)
      splash:go(splash.args.url)
    
      local area = splash:select('.items input#id11')
      area:click()
      local submit_area = splash:select('.tools-wrap input[type=image]')
      submit_area:click()
      while not splash:select('input[alt="検索結果を見る"]') do
        splash:wait(0.1)
      end
    
      local city = splash:select('h4.city_name input#id_saitama')
      city:click()
      local submit_city = splash:select('section.button input[type=image]')
      submit_city:click()
      while not (splash:select('section.pager-head') and splash:select('form#search_form')) do
        splash:wait(0.1)
      end
    
      return {html = splash:html(), png = splash:png()}
    end
    

    여기에
  • 지역 선택 url 방문
  • 사이타마의 체크 박스를 클릭하고 시정구 마을을 선택하는 버튼을 눌러 검색 결과를 보는 버튼이 나타날 때까지 기다린다
  • 모든 도시 마을을 선택하려면 체크 박스를 클릭하고 검색 버튼을 누른 다음 부동산 목록 화면이 나타날 때까지 기다립니다
  • HTML 및 png 리소스를 반환합니다.

    라고 하는 처리가 기술되고 있습니다.
    실행 결과는 다음과 같습니다.



    요약



    위와 같이 Lua 언어로 미세한 브라우징 거동 설명 수 있습니다.
    또한 splash는 기본적으로 병렬 처리를 지원하므로 splash API에 여러 요청을 보낸 경우에도 브라우징을 효율적으로 처리합니다.
    그리고, splash API에 대한 요청을 래핑하는 scrapy 플러그인 도 있으므로, 좋으면 꼭 해 보세요.
  • 좋은 웹페이지 즐겨찾기