studying data

문제의 본질을 꿰뚫어 해결책을 찾는 법을 공부합니다

콤퓨타 공부/Python

[python 공부] 웹 서버-클라이언트 구조와 라이브러리

study_data 2021. 8. 21. 15:44

웹, HTML, CSS, JS, 브라우저

우리가 인터넷 웹 서비스를 사용할 때 서버는 항상 답을 주는 구조라는 걸 유념해야 합니다. HTML은 사이트를 만드는 뼈대와 같고 JS는 어떻게 상호작용해야하는지 알려주는 역할을 합니다. 그리고 CSS는 보이는 모습을 단정하게 구현해줍니다.

웹 크롤러는 스파이더링(spidering)이라고 하기도 합니다. 검색엔진에서 굉장히 많이 진행하죠. 구글의 크롤러가 열심히 돌아다니면서 크롤링을 하고 타고타고 가다가 네이버의 블로그도 수집을 해오는것이죠. 검색결과가 위로 올라온다는 것은 사람들이 많이 찾거나, 정확하거나, 광고를 붙인 경우인데요 구글은 이런 정보검색에 최적화되어있습니다. 구글은 상위에 보여지는 알고리즘이 잘 되어있는데, rank가 위에 있는 것을 띄워줍니다. 쉽게 말해서 페이지 링크를 걸어놓는다면 다른 사람들이 많이 참고했다는 의미기도 합니다. 웹크롤러란 빠른 인덱싱을 위해 하기도 해요. 그러나 크롤링은 모든 것을 다 방문해서 저장하고 인덱싱해서 데이터베이스로 만드는 개념이고 스크래핑은 웹사이트에서 필요한 부분만 모은다는 점에서 웹 크롤링의 수집량이 훨씬 방대합니다.


requests, BeautifulSoup

requests Python HTTP 라이브러리(HTTP 요청을 주고 받을 수 있는 파이썬 라이브러리)
BeautifulSoup HTML 문서를 파싱하는 라이브러리

 

requests를 사용하기 위해서는 import를 이용합니다. 요청을 보낼 때 header라는 곳에 정보를 넣어 보내기도 하는데, get뒤에 파라미터로 넣으면 되는 것이죠. BeautifulSoup은 파싱을 해줍니다.

여기서 등장하는 라이브러리란 무엇일까요? 라이브러리는 대부분 남이 짜놓은 코드입니다. 어떤 기능을 하기 위해 미리 짜져있는 것이라 import를 통해 이용하죠. 우리가 모든 것을 알지 못할 때 도서관에서 정보를 가져오는 것처럼, 라이브러리는 파이썬으로 짜여있는 코드를 가져올 수 있는 것입니다. 프레임은 틀이라고 할 수 있어요. 프레임워크(framework)는 개발쪽에서 상당히 많이 쓰이는데, 뭔가를 하기 위해서 라이브러리보다 큰 개념으로 쓰이곤 합니다. 좀 더 많은 것들을 하도록 유도하기 위해서요! 프레임워크는 spring(자바로 되어있는 웹페이지)으로 구성돼있어요. 프레임워크 중 유명한 것은 jango도 있고 flask, ROR이라는 것도 있습니다. 웹을 만들기 위해 미리 정리해두고, 다른 사람들의 논의에 대해서도 모아놓은 것입니다. 정의된 것을 가져다 쓰기만 하면 돼요. 파싱(parcing)은 구문을 분석해서 우리가 가져다쓸 수 있도록 만들어주는 것입니다. 규칙이 있는 문서를 규칙에 맞춰 우리가 쓸 수 있도록 변환하는 행위죠. 애플리케이션은 우리가 만든 앱과 동일하고, 웹페이지에서 돌아가는 코드도 웹 어플리케이션이라고 부르기 때문에 소프트웨어를 총칭한다고 볼 수 있습니다.

클래스 기준으로 하나의 엘리먼트에 클래스가 여러 개 지정돼있을 수 있는데 이런 경우에는 모두 붙여서 selector를 표현합니다. 그리고 클래스를 기준으로 하위의 엘리먼트를 지정하고 싶을 때는 slector상의 띄어쓰기(공백)으로 표현하면 됩니다.


selenium

셀레니움은 아나콘다에 포함된 라이브러리가 아니기 때문에 새로 설치해야합니다. 셀레니움으로 가져오는 방법이 조금 더 복잡하고 성능이 떨어진다는 이야기도 있긴 해요. 더 효율적인 것은 beautifulsoup도 함께 쓸 때 가능합니다.  이제 구글에서 코로나 데이터를 가져와봅시다.

from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome("./chromedriver")
# 페이지가 로드될때까지 암시적으로 5초 기다리는 코드 (단, 무조건 5초를 기다리는 건 아님)
driver.implicitly_wait(5)
# Selenium을 통해 실제 크롬창을 열어 해당 URL의 내용을 가져옴
driver.get("https://news.google.com/covid19/map?hl=ko&gl=KR&ceid=KR%3Ako")
#소스를 읽어 BeautifulSoup를 이용해 파싱
html = driver.page_source
soup = BeautifulSoup(html,"html.parser")
covid_list = soup.select("tr.sgXwHf.wdLSAe")
print(covid_list[0].prettify())
driver.close()

prettify는 띄어쓰기 맞게 표현해주는 것입니다. BeautifulSoup에 파싱하면 띄어지지 않은 채, 그냥 표현되기 때문에 정리할 때 편하죠. 아래 결과처럼 옆으로 쏙쏙 잘 정리되어서 결과가 출력되는 건 모두 prettify 덕분이에요.

<tr class="sgXwHf wdLSAe ROuVee" data-id="/m/02j71" jsaction="click:KoQL8" jslog="110767; track:click">
 <th class="l3HOY" role="rowheader" scope="row">
  <div class="TWa0lb">
   <div class="ggJ3df" jsaction="JIbuQc:ROTNpb" jslog="113728; track:click">
    <button aria-label="고정 해제됨" class="VfPpkd-Bz112c-LgbsSe yHy1rc eT1oJ Vs1w5b" data-disable-idom="true" data-n-mid="/m/02j71" jsaction="click:cOuCgd; mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; mouseleave:JywGue; touchstart:p6p2H; touchmove:FwuNnf; touchend:yfqBxc; touchcancel:JMtRjd; focus:AHmuwe; blur:O22p3e; contextmenu:mg9Pef;" jscontroller="soHxf">
     <div class="VfPpkd-Bz112c-Jh9lGc">
     </div>
     <span aria-hidden="true" class="VfPpkd-kBDsod gsIK3e">
      <svg class="Xa3RBb NMm5M" focusable="false" height="16" viewbox="0 0 24 24" width="16">
       <path d="M0 0h24v24H0z" fill="none" stroke="#000" stroke-opacity=".008" stroke-width="0">
       </path>
       <path d="M17 4v7l2 3v2h-6v5l-1 1-1-1v-5H5v-2l2-3V4c0-1.1.9-2 2-2h6c1.11 0 2 .89 2 2zM9 4v7.75L7.5 14h9L15 11.75V4H9z">
       </path>
      </svg>
     </span>
    </button>
   </div>
   <img alt="" class="oIC36d" loading="lazy" src="https://www.gstatic.com/images/icons/material/system_gm/1x/language_googblue_24dp.png"/>
   <div class="pcAJd">
    전 세계
   </div>
  </div>
 </th>
 <td class="l3HOY">
  210,325,635
 </td>
 <td aria-label="데이터 없음" class="l3HOY">
  <span class="EtcnFb CjOhJb">
   데이터 없음
  </span>
 </td>
 <td class="l3HOY">
  <img alt="60일 동향 차트" aria-label="60일 동향 차트" class="dt3Iuf zC7z7b nBjBX" loading="lazy" src="//www.gstatic.com/covid-trends/images/NC60/_m_02j71.svg"/>
  <img alt="60일 동향 차트" aria-label="60일 동향 차트" class="dt3Iuf krHqHb nBjBX" loading="lazy" src="//www.gstatic.com/covid-trends/images/NC60/_m_02j71_dark.svg"/>
 </td>
 <td class="l3HOY">
  27,049
 </td>
 <td class="l3HOY">
  4,408,713
 </td>
</tr>

 

본 자료는 데잇걸즈 5기에서 어수웅강사님의 파이썬 수업(2021.08.21)을 수강하며 정리한 자료입니다.