[python] 웹 크롤링(Web Crawling)

Cjw.dev·2023년 3월 22일

웹 크롤링에 대해 간단하게 살펴보자.

웹 크롤링

- 웹 상에 존재하는 컨텐츠를 수집하는 작업
- HTML페이지를 가져와서 html/css를 파싱하고 필요한 데이터만 추출하는 기법
- OPEN API를 제공하는 서비스에 호출해서 받은 데이터 중 필요한 데이터만 추출
- Selenium등 브라우저를 프로그래밍으로 조작해서 필요한 데이터만 추출

웹크롤링을 위한 모듈 설치

- npm install bs4
- npm install lxml
- npm install requests

각 모듈에 대한 설명은 아래 예제들을 통해 살펴보도록 하자.


간단하게 웹 크롤링을 어떻게 하는 것인지 코드를 통해 살펴보자


# bs4 모듈 연결
from bs4 import BeautifulSoup
# requests 모듈 연결 : HTTP 요청,응답 해주는 모듈
import requests
# re 모듈 연결 : 정규 표현식 처리하는 기능을 제공하는 모듈
import re

# 웹크롤링의 원리 이해 

html='''
<ul>
   <li>호카소</li>
   <li>에이전트가위손</li>
   <li>지혜겅듀</li>
</ul>
'''

# 뷰리풀숲 모듈로 html 크롤링
soup = BeautifulSoup(html, 'lxml')
result = soup.select('ul li')
print(result)
for i in result:
   print(i.text)

실제 웹 페이지의 내용을 크롤링 해보자

웹페이지 크롤링 예제1

# 웹크롤링 해보기 
import requests
# re 모듈 연결 : 정규 표현식 처리하는 기능을 제공하는 모듈
response = requests.get("http://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd=035720")
print(response.text)

웹 페이지의 내용을 크롤링하기 위해선 데이터를 송수신하기 위한 준비를 해야한다.
클라이언트-서버 간에 데이터 송수신을 위해 http가 필요하다
requests 모듈은 http 요청과 응답을 처리해주는 모듈이다.
이 모듈을 사용하면 http 메소드를 사용하여 데이터를 송수신 할 수 있다.

웹페이지 크롤링 예제2

# 다음 뉴스기사 웹 크롤링
res = requests.get('https://v.daum.net/v/20230203043158160')
soup = BeautifulSoup(res.content, 'html.parser')
# find : 가장 먼저 검색되는 태그 리턴
title = soup.find('title')
# # get_text() 메소드를 통해 text 값만 가져오기  
print(title.get_text())

웹페이지 크롤링 예제 3

태그 뿐 아니라 class, id의 값을 지정해서 원하는 데이터만 가져올 수도 있다.


html='''
<body>
    <h1 id="title">구트동 범죄자 명단</h1>
    <p class="crime">에이전트 가위손 : 살인(무음살인술)</p>
    <p id="body">댄스왕 : 풍기문란</p>
    <p id="footer">핵이빨 : 특수폭행</p>
</body>
'''
soup = BeautifulSoup(html, 'html.parser')
# find_all : 전체 태그 반환. 리스트로 받아온다.
title_data = soup.find_all('p')
title_id = soup.find_all(id='footer')
title_class = soup.find(class_= 'crime')

print(title_data) # [<p class="crime">에이전트 가위손 : 살인(무음살인술)</p>, <p id="body">댄스왕 : 풍기문란</p>, <p id="footer">핵이빨 : 특수폭행</p>]
print(title_data[0].string) # 에이전트 가위손 : 살인(무음살인술)
print(title_data[1].get_text()) # 댄스왕 : 풍기문란
print(title_id) # [<p id="footer">핵이빨 : 특수폭행</p>]
print(title_id[0].string) # 핵이빨 : 특수폭행
print(title_id[0].get_text()) # 핵이빨 : 특수폭행
print(title_class.string) # 에이전트 가위손 : 살인(무음살인술)
print(title_class.get_text()) #에이전트 가위손 : 살인(무음살인술)
profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글