BeautifulSoup를 이용한 크롤링

파도·2022년 9월 5일

1. requests와 beautifulsoup4를 설치

pip install requests
pip install beatifulsoup4

2. requests와 beautifulsoup4를 임포트

import requests 
from bs4 import BeautifulSoup 

3. requsts.get 함수를 통해 html문서 요청

  • html 문서요청: requsts.get("홈페이지 주소")
    req = requests.get("https://m.blog.naver.com/luvpolo/221300832833")

  • 요청결과를 content화
    req.content

b'\n\n\n\n\n<!doctype html>\n<html lang="ko">\n<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#">\n\n\n\n\n\n<meta http-equiv="Content-type" content="text/html; charset=utf-8">\n<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">\n\n<meta name="robots" content="index,follow"/>\n\n\n\n<link rel="icon" type="image/png" href="/favicon_192x192.png?1">\n\n<link rel="apple-touch-icon-precomposed" href="/mobileweb_icon_96.png?1" />\n\n<link rel="stylesheet" type="text/css" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_w-189816406_https.css" charset="UTF-8" />\n<link rel="stylesheet" type="text/css" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_view-105403197_https.css" charset="UTF-8" />\n<style>\n\tdiv.spi_unity {\n\t\twidth:291px;\n\t}\n</style>\n\n\n\n\n\n \n\n\t\n\t\t<meta property="og:title" 
  • 요청 결과를 text화
    req.text
'\n\n\n\n\n<!doctype html>\n<html lang="ko">\n<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#">\n\n\n\n\n\n<meta http-equiv="Content-type" content="text/html; charset=utf-8">\n<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">\n\n<meta name="robots" content="index,follow"/>\n\n\n\n<link rel="icon" type="image/png" href="/favicon_192x192.png?1">\n\n<link rel="apple-touch-icon-precomposed" href="/mobileweb_icon_96.png?1" />\n\n<link rel="stylesheet" type="text/css" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_w-189816406_https.css" charset="UTF-8" />\n<link rel="stylesheet" type="text/css" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_view-105403197_https.css" charset="UTF-8" />\n<style>\n\tdiv.spi_unity {\n\t\twidth:291px;\n\t}\n</style>\n\n\n\n\n\n \n\n\t\n\t\t<meta property="og:title" content="예쁜 한국말 / 
  • soup이라는 변수에 BeatifulSoup을 통해 만들어진 객체를 저장
    soup = BeautifulSoup(req.content, "html.parser")

  • soup 출력
    print(soup)

# 결과: 깔끔 😃

<!DOCTYPE html>

<html lang="ko">
<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#">
<meta content="text/html; charset=utf-8" http-equiv="Content-type"/>
<meta content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover" name="viewport"/>
<meta content="index,follow" name="robots">
<link href="/favicon_192x192.png?1" rel="icon" type="image/png"/>
<link href="/mobileweb_icon_96.png?1" rel="apple-touch-icon-precomposed">
<link charset="UTF-8" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_w-189816406_https.css" rel="stylesheet" type="text/css"/>
<link charset="UTF-8" href="https://ssl.pstatic.net/t.static.blog/nmobile/versioning/lego_view-105403197_https.css" rel="stylesheet" type="text/css"/>
<style>
	div.spi_unity {
		width:291px;
	}
</style>
<meta content="예쁜 한국말 / 예쁜 뜻이 담긴 순수 한국말 한글 단어" property="og:title">
<meta content="https://blogimgs.pstatic.net/nblog/mylog/post/og_default_image_160610.png" property="og:image"/>

📢 req.textreq.content의 차이
1️⃣ req.text: 응답의 내용을 웹페이지 유니코드(Unicode)로 표현
2️⃣ req.content: 응답의 내용을 바이트(bytes)로 표현

4. 크롤링할 요소 찾기 및 크롤링

4.1 크롤링 할 요소 찾기

1️⃣ 크롤링할 블로그에서 F12버튼 클릭

2️⃣
형광색 버튼 클릭

3️⃣ 추출하고 싶은 내용 클릭 👉 단어가 어떤 태그로 구성되어 있는지 확인
ex) 가람슬기: 강처럼 푸르게, 그리고 슬기롭게: span으로 태그

4.2 크롤링하기

1️⃣ html 문서 내 특정 태그 필터링: find vs find_all
find : 태그 중 웹페이지에서 가장 처음으로 등장하는 태그 반환

soup.find("span")

#결과
<span class="Nicon_service">블로그</span>

find_all : 웹페이지 내 모든 태그 반환

soup.find_all("span")

#결과
[<span class="Nicon_service">블로그</span>,
 <span class="td">
 <a class="_cur_category _returnFalse" href="#" id="_categoryName" onclick="nclk(this, 'pgn.blogname', '', '');">
 <span class="sp ico">카테고리 이동</span>
 </a>
 </span>,
 <span class="sp ico">카테고리 이동</span>,

2️⃣ 태그의 리스트 좁히기
html 문서 구조 : tbody → tr[3] → td[2] → div → p → span

soup.find("tbody").find_all("span") 

#결과 
[<span class="se-fs- se-ff-" id="SE-1bcdc575-3b76-497d-baf7-04a6cef06a37" style=""><b>예쁜 한국말! 예쁜 뜻이 담긴 순수 한국말</b></span>,
 <span class="se-fs- se-ff-" id="SE-2e4161e0-814c-4afd-bb16-1874acae1580" style="">1</span>,
 <span class="se-fs- se-ff-" id="SE-3b254fd9-a715-473c-a9b2-7b0e8618bd52" style="">가람: 강</span>,

3️⃣ 태그 안의 내용만 들고오기 : 태그를 text화

span-list = soup.find("tbody").find_all("span")
span_list[0].text # 태그 👉 text

#결과
'예쁜 한국말! 예쁜 뜻이 담긴 순수 한국말'

4️⃣ for문으로 모든 요소 text화

span_list2 = []
for span in span_list:
	span_list2.append(span.text)
print(span_list2)


#결과
['예쁜 한국말! 예쁜 뜻이 담긴 순수 한국말', '1', '가람: 강', '2', '가람슬기: 강처럼 푸르게, 그리고 슬기롭게', '3', '가랑비: 조금씩 내리는 비', '4', '가온: 가운데', '5', '가온누리 : 어떠한 일이있어도 세상의 중심이되리라', '6', '가온누리: 세상의 중심', '7', '고수련: 병자를 정성껏 돌보는 일', '8', '고운 : 말 그대로 고운 삶을 살아라라는 뜻이 좋은 한글이름', '9', '고타야: 안동', '10', '괴다 : 유난히 귀엽게생각하여 사랑한다', '11', '그루잠: 깨었다가 다시 드는 잠', '12', '그린나래 : 그린듯이 어여쁜 날개를 뜻하는 순우리말 단어', '13', '그린나래: 그린 듯이 아름다운 날개', '14', '그린비: 그리운 남자', '15', '그미: 그 여자', '16', '길가온: 길 가운데', 

5️⃣ 필요 없는 부분 빼기 : del 이용

del span_list2[0]

*참고: https://blog.naver.com/jsk6824/221964251302

profile
우당탕탕 / 블로그 이사 중

0개의 댓글