BeautifulSoup를 이용한 크롤링

파도·2022년 9월 5일
0

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개의 댓글