나의 분석일기 ♬
[웹 크롤링]웹 크롤링 기초 본문
웹 크롤링 기초
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)

'데이터 분석 > Crawling' 카테고리의 다른 글
| [웹 크롤링]OPEN API (0) | 2024.05.30 |
|---|---|
| [웹 크롤링]네이버 블로그 업로드 자동화(SELENIUM & ChatGPT) (0) | 2024.05.30 |
| [웹 크롤링]동적 웹 크롤링 (0) | 2024.05.30 |
| [웹 크롤링]정적 웹 크롤링 (0) | 2024.05.29 |