나의 분석일기 ♬

[웹 크롤링]웹 크롤링 기초 본문

데이터 분석/Crawling

[웹 크롤링]웹 크롤링 기초

Screening Jang 2024. 5. 28. 16:06

웹 크롤링 기초

1. 크롤링의 종류

정적 크롤링

-웹에 있는 정적인 데이터를 수집할 때 사용

정적인 데이터란 로그인과 같은 사전 작업 없이 바로 볼 수 있는 데이터

새로고침을 하지않는 이상 변하지 않는 데이터

주소를 통해 요청받고 결과를 전달해주고 종료

 

동적 크롤링

웹에 있는 동적인 데이터를 수집할 때 사용

동적인 데이터는 입력, 클릭, 로그인과 같이 페이지 이동 시 얻을 수 있는 데이터

단계적 접근이 필요하기 때문에 수집 속도가 느리지만 수집 대상에 한계가 거의 없다는 큰 장점

연속적인 접근이 가능, 페이지 이동이 필수적이거나 페이지 안에 정보가 은닉되어 있을 경우 사용

  정적 크롤링 동적 크롤링
연속성 주소를 통한 단발적 접근  
속도 빠름 느림
수집 성능 수집 대상에 한계가 있음 수집 대상에 한계가 거의 없음

 

2. 라이브러리

1. time 라이브러리

- time.time() : time.time()은 UTC를 사용해 현재 시간을 실수 형태로 돌려주는 함수

1970년 1월 1일 0시 0분 0초 기준으로 지난 시간을 초 단위로 return

import time
print(time.time())

 

- time.localtime() : 현재 시간을 년, 월, 일, 시, 분, 초..의 형태로 출력

import time
print(time.localtime())

 

2. 정적 크롤링 도구

requests : 간편한 HTTP 요청 처리를 하는 라이브러리, 웹서비스와 연결하기 위해 사용

beautifulsoup : html 태그를 처리하는 라이브러리, 웹에 있는 데이터 중 필요한 데이터만 추출하기 위해 사용

pd.read_html : html 내의 table만 추출할수 있는 도구

 

3. 동적 크롤링 도구

selenium : 웹 드라이버를 사용해 자동화 기능을 실현하는 라이브러리

     웹에 접속해 클릭, 이동과 같은 action을 제어

     driver 를 설치하고 이를통해 제어 가능

playwright : microsoft 에서 개발한 웹테스팅 도구

 

 

3. Web Page 가져오기

● urllib.request 패키지

from urllib.request import urlopen
import requests
from bs4 import BeautifulSoup as bs
html = urlopen("https://www.naver.com/")
soup = bs(html, "html.parser") # html 태그를 찾아서 가공하기 위해 "html.parser" 를 사용해 변환

 

● requests 패키지 사용의 결과

urlopen("https://www.naver.com/").status
200

 

※ http 응답 상태 코드

- 200 : 성공

- 300 : 리다이렉션

- 400 : 페이지가 없음, 권한이 없는 경우

- 500 : 서버 내부의 오류

 

4. Web Page와 HTML

웹페이지는 HTML(HyperText Markup Language)을 기반으로 생성

F12, Ctrl + shift + c, Ctrl + shift + i 를통해 확인 가능

원하는 데이터가 웹페이지의 어느부분에 위치해 있는지 파악이 가능하다.

 

1. HTML 태그

  •  기본형
<태그>내용</태그>
  • HTML은 마크로 둘러싸인 언어라는 뜻으로 구조에 대한 정보를 기반으로 작성된 언어
  • 각각의 구성 요소는 마크 역할을 하는 태그로 감싸져 있다.
  •  웹페이지의 시작과 끝을 의미하는
<html></html>
  • 문서의 제목을 의미하는
<title></title>
  • 웹에 실제로 표시되는 내용을 의미하는
<body></body>

 

 

2. HTML 태그의 종류

  • ul : unordered list.
  • li : list item.
    • 목록의 내용이 되는 실질적 태그
    • 참고
  • a
  • p
    • paragraph(단락)의 약자, 긴 글 뭉텅이.
  • table : 표를 나타내는 태그
  • html 태그
    • find("태그") - 첫번째 태그만 검색
    • find_all("태그") - 전체 태그 검색후 list로 반환
# bs4 객체에서 사용할 수 있는 METHOD
html = urlopen("https://www.naver.com/")
soup = bs(html, "html.parser")
type(soup)
bs4.BeautifulSoup
find_div = soup.find("div", id="u_skip") # div 태그에서 id가 u_skip 인 태그중에 첫번째 태그만을 검색 
print(find_div)

 

  • nate.com 에서 DIV 태그로 감싸진 class 가 area_gnb 인 내용들만(TEXT) 리스트로 변경하여 반환해보기

 

html = requests.get("https://www.nate.com/")
soup = bs(html.text, "html.parser")
find_div = soup.find("div", class_ = "area_gnb")
for i in find_div.find_all("li"):
    print(i.text)

 

3. SELECTOR

  • 태그 중에는 동일한 태그가 존재할 수있다.
  • 선택자(Selector)는 동일한 태그 여러 개 중에서도 각 태그를 구별할 수 있는 일종의 주소이다.

- Selector의 필요성

<div>    
    <div>
        <span> Python </span>
        <span> Hello world </span>
    </div>

    <div>
        <span> Java </span>
        <span> Coffee </span>
    </div>
<div>
  • 태그는 다양한 내용을 담을 수 있다.
  • 태그가 4개나 있어서 컴퓨터가 구분하기 어렵다. 이러한 문제를 해결하기 위해 선택자를 사용함.
<div id = "contents">    
    <div class = "metadata1">
        <span class = "language"> Python </span>
        <span class = "project" > Hello world </span>
    </div>

    <div class = "metadata2">
        <span class = "language"> Java </span>
        <span class = "project"> Coffee </span>
    </div>
<div>

- id와 class

  • 태그의 선택자는 주로 id와 class를 사용
  • id는 어떤 요소의 고유한 값
    • html에서도 id는 하나의 고유한 선택자로, 중복 되지 않고 하나만 존재한다.
    • 참고
  • class 태그는 같은 속성을 지닌 데이터를 묶어주는 값
    • 한 태그가 여러 개 의 class를 가질 수 있다.
    • 참고

비슷한 속성끼리 묶어줄 때 class 태그를 사용한다.

 

- Selector 사용법

<div id='123' class='456'>
  • 선택자에 따라 데이터를 찾는 코드에 차이가 있다.
  • id는 '#'를 붙이고, class는 '.'을 붙여준다.
  • 태그만 사용해 데이터를 찾을 경우 -> 태그
    • div
  • 태그와 id를 사용해 데이터를 찾을 경우 -> 태그#id
    • div#123
  • 태그와 class를 사용해 데이터를 찾을 경우 -> 태그.class
    • div.456
  • 태그, id, class 모두 사용해 데이터를 찾을 경우 -> 태그#id.class
    • div#123.456
  • 참고 : class 이름에 공백이 포함될 경우가 종종 있는데, 이럴 경우 공백을 .으로 대체해서 작성하면 된다.
    • ex)
<div class='hello python'>

>> div.hello.python

 

# css selector 를 이용해 찾는 방법
css_selector = soup.select("#divGnb > ul")
css_selector[0].find_all("a")[0].text

>> '메일'

 

for i in css_selector[0].find_all("a"):
    print(i.text)

Comments