[HARMAN] 세미콘 아카데미/공부내용

[Harman 세미콘 아카데미] Day_7 (Python)

uiop1716 2025. 2. 12. 23:04

교육을 들으러 가는 오늘 아침은 눈이 많이 왔다. 

다들 조심히 출/퇴근 하시길 바란다.

 

웹 크롤링, 스크래핑
 - 웹사이트에서 데이터를 자동으로 가져오는 기술을 말한다
 - 검색 엔진도 크롤링 및 스크래핑을 활용해 정보를 수집한다.

둘의 차이라고 한다면,

크롤링: 여러 웹페이지를 탐색하면서 정보를 가져옴

스크래핑: 특정 웹페이지에서 필요한 데이터만 추출함

크롤링은 바닥을 기어 가면서 모든 것을 빨아들이는 청소기 같은 개념, 스크래핑은 Book Scrap과 같은 개념으로 이해했다.

 

정보를 수집하기 위해, robots.txt를 사용한다. 설명을하자면

 

 - 액세스 하거나 정보수집을 해도 되는 페이지를 알려주는 파일
 - 검색엔진은 해당 텍스트 내용을 기반으로 허용되지 않는 페이지로부터 정보수집을 하지 않음

예를 들어, http://naver.com/robots.txt 를 하게 된다면 네이버에서 지정한 허용범위를 알 수 있다. (경고판 느낌)

텍스트 파일이 제공하는 정보들의 의미

 

 

이때, 요청을 하며 User-Agent에 대한 개념도 나온다.

 - HTTP 요청 헤더의 일부로, 사용자가 사용하는 브라우저나 기기의 정보를 서버에 전달하는 문자열

 - 웹사이트 서버는 이 정보를 통해 요텅을 보낸 주체가 웹, 모바일, 봇 인지를 식별한다

----> 계속 response를 하면 사이트에서 디도스를 의심하므로 사이트 서버에 내 정보를 알리는 기능이라고 이해했다.

 

주로,  headers = {"Users-Agent":"Mozilla/5.0(Windows NT 11.0; Win64; x64)"}

ex)    response = requests.get(url = url_naver, headers=headers)   -> 네이버에 User-Agent 개념을 탑재하여 요청한다.

User-Agent 사용한 예제

 

 

또한, requests 라이브러리를 활용하여 정보를 수집할 수 있다.

기본적으로, 웹페이지 데이터를 가져오기 위한 HTTP 요청 라이브러리로 get(), post() 요청을 사용한다.

get(), post() 방식의 차이

 

get은 query string 방식으로 URL에 데이터가 존재하고, post는 데이터가 URL에 포함되지 않는 것이 큰 차이점이다.

 

requests 라이브러리를 활용한 예제이다.

get()함수 사용

 

네이버의 url을 통해 홈페이지 HTML을 가져오기 위해 요청을 보낸다. 출력하면 [200 = 승인]을 응답 받는다.

이 코드들로 상태를 확인할 수 있다.

 

이러한 상태들에 관한 오류를 예외 처리하는 예제도 다뤄보았다.

예외처리 예제

 

 

 requests를 통해 response 승인을 받아 얻은 데이터를 처리하는 방법

     1) response.text : 응답 본문을 문자열로 반환

     2) response.content : 응답 본문을 바이트로 반환

     3) response.json() : 응답 본문을 딕셔너리로 변환 

 

 

정보수집에 대한 또다른 라이브러리 - BeautifulSoup - HTML/XML을 파싱해 데이터를 쉽게 추출한다.

주로, find(), find_all() 매서드를 활용해 특정 태그를 검색한다.

 

find("태그")를 통해 태그를 찾고, 첫번째 요소를 가져온다. 이후, .text를 통해 텍스트 형식으로 추출한다.

find()함수 예제

 

find_all("태그")를 통해 태그가 포함된 모든 요소를 반환한다. 이때, 태그는 <"태그명">의 형식을 지닌다.

find_all() 예제

 

 

선택자를 활용해 데이터를 가져올 수도 있다.

형태 : select(.클래스명)

ex) 
     news_title_list = soup_news.select(".sa_text_strong")
     for i in range(5):
         print(news_title_list[i].get_text())

select() 활용, 상위 5개 기사 제목을 출력

 

 

이를 활용해 특정 키워드를 지닌 기사의 제목을 가져오기도 할 수 있다.

select()를 활용해 "AI" 키워드를 지닌 기사의 제목을 가져온다.

 

 

이에 대한 예제로, 네이츠 홈페이지의 오늘 날짜 기준, 약 10시경 1-10페이지에서 "AI" 단어가 있는 기사 제목을 추출했다.

1페이지의 기사 제목을 담당하는(".tit")을 select()를 활용해 "AI" 데이터를 가져온다.
1-10 페이지의 정보를 가져오기 위해 for문과 리스트를 활용한 예제

 

 

 

HTTP:인터넷에서 하이퍼텍스트 문서를 교환하기 위해 사용되는 통신 규약

Hyper Text : 현재 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트

 

HTML (Hyper Text Markup Language) : 웹 페이징에 정보를 담아 표시하기 위한 **마크업 언어**

      ㄴ 형태 : <시작태그> 요소 </끝태그>

                     <시작태그 = "속성"> 요소 </끝태그>

HTML 구성요소

 

 

이러한 구조의 Body의 태그 속성 부터 배워야 한다.

이를 활용하여 HTML을 이용한 웹페이지, 표 등을 이쁘게 꾸밀수 있다. 

body 태그 속성

 

- 제목 태그: html문서 본문 내 제목을 표현하는 태그 

    ㄴ ex) <h1>안녕하세요</h1>

 

- 글자 태그:

    ㄴ 본문의 내용을 단락을 표현하는 태그

          ㄴ ex) <p> 본문 </p>

    ㄴ 본문의 내용을 문장으로 표현할 떄 사용하는 태그

          ㄴ ex) <span> 본문 </span> 

               ㄴ ****스판코드는 띄어쓰려면 </br>필요

 

- 문단 태그: 시작 끝 없이 단독으로 사용 

    ㄴ 줄 바꿈 태그  :  <br/>                    

    ㄴ 단락 구분 태그, 수평선 태그  :  <hr/>

<hr/> 태그 속성

 

- 글자 태그 :

    ㄴ 다른 텍스트와 구별할 때 사용되는 태그  :  <b> 텍스트 </b>  , 시각적 강조 태그

    ㄴ 중요한 문구를 강조하는 태그  :  <strong> 텍스트 </strong>  , 

 

- 리스트 태그:

   ㄴ 번호 없는 목록을 사용할 때 사용하는 태그  :  < ul>, 정돈되지 않은 리스트

   ㄴ 번호 있는 목록을 사용할 때 사용하는 태그  :  < ol> , 정돈된 리스트, 넘버링이 붙음(type) 사용해서 변환

   ㄴ 공통적으로 사용되는 태그  :  < il> 

 

- 이미지 태그: 웹 페이지에 이미지를 보여주는 태그

 

- a 태그 : 웹 페이지에 이미지를 보여주는 태그
        형태 : <img alt "" , src = ""  ...>

a태그 활용법

 

- 테이블 태그 : 테이블/표를 만들기 위해 사용함

    ㄴ 행의 head 역할을 하는 태그 

          ㄴ <th> 태그 </th>

    ㄴ table data, 칸 안의 데이터를 나타낸다.

          ㄴ <td> 태그 </td>

    ㄴ 표 내부에서 1줄을 생성하는 태그로, table row의 준말

          ㄴ <tr> 태그 </tr> 

테이블 태그의 속성들

 

 

위에 작성한 태그 속성들을 코드와 html로 생성된 결과를 보이겠다.

 

1)  웹 페이지를 만들어보자~~!

실행 코드:
<html>
   <head>
      <title>예제 페이지</title>
   </head>
   <body bgcolor="#ff69B4">  
      <h1>안녕하세요</h1>
      <h2>방갑습니다</h2>
      <h3>점심은 짜장면</h3>
      <h4>을 먹습니다</h4>
      <p class="text">웹 크롤링을 배우는 중입니다.</br>       -><br>문단태그로 탭침
      <!-- </hr> 수평선을 긋는 태그 -->
      <hr color="red" size="140" width="150"></hr>     -      ><hr>에 수평선조건 넣기
      <hr color="orange" size="120" width="150"></hr>
      <hr color="yellow" size="100" width="150"></hr>
      <hr color="green" size="80" width="150"></hr>
      오늘은 눈이 조금 옵니다.</p>          
   <a href="https://www.naver.com">네이버</a>
   <a href="https://www.google.com">구글</a>
   </body>
</html>

 

결과:

나만의 웹페이지

 

 

2) 글자태그

 

 

결과:

 

 

3) 리스트 태그

 

결과:

 

 

 

4) 이미지 태그

 

결과:

SIUUUUUUUUUUUUU!

 

 

5) a 태그

 

 

결과:

"네이버"를 누르면 네이버 홈페이지에, 호날두 사진을 누르면 구글로 들어가진다... SIUUU

 

 

6) 테이블 태그

 

결과:

나는 한국인 MBTI 비율 1위인 ISTJ이다...

 

7) 테이블 태그2

 

결과: 

제법 메뉴판 같다...ㅋ

 

8) span함수

colspan"2"와 rowspan="2"으로 행과 열을 2개 병합한다

 

결과:

 

9) 테이블 태그 & span함수

span함수를 이용하여 조건에 맞도록 테이블을 만들었다

 

결과:

팀원들 모두 IS의 성격을 지녔다... 그래도 재미있다.

 

 

 

느낀점: 이번에는 HTML 파일을 다루며 직접 웹페이지도 만들고, 테이블도 만들어보며 정말 재미있었다. Frontend가 적성일지도...? ㅋㅋ 크롤링과 스크랩핑도 배우며, 이러한 정보들을 앞으로 있을 미니 프로젝트에 어떻게 활용해야 할 지에 대해 생각도 좀 했던것 같다. 정보들을 수집하고 가공하여 내가 HTML을 수정하여 만든 나만의 웹페이지에 저장하여 제 2의 결과물을 만들어 낼 수 있을것 같다. 내일도 열심히 공부하자. <strong> 화이팅! </strong>