100. ํ์ด๋ ํ๋ก์ ํธ (5)html ๊ธฐ๋ณธ
html?
ํ๊ทธ ์ด๋ฆ / ์์ฑ(attribute) 2๊ฐ์ง๋ก ๊ตฌ์ฑ
* ํ๊ทธ ์ด๋ฆ : ํ๊ทธ๋ฅผ ์์งํ๋ <> ๊ธฐํธ ์์ ๋ค์ด๊ฐ๋ ์ ๋ณด ex) p, li, img (html์ ํญ์ ์ด๊ณ ๋ซ๋ <ํ๊ทธ><ํ๊ทธ/>๋ก ๊ตฌ์ฑ)
* ์์ฑ : ํ๊ทธ๊ฐ ๊ฐ์ง ์ถ๊ฐ์ ๋ณด. ์์ฑ ์ด๋ฆ & ์์ฑ ๊ฐ์ด ํ๋์ ์ ex) name = "value"
1.1 ๊ธฐ๋ณธ ํ๊ทธ - html, head, body
html ๋ฌธ์์ธ ๊ฑธ ํ์ํ๋ <html></html>
ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋, ๋ฌธ์ ์ ๋ณด๋ฅผ ํ์ํ ๋ ์ฐ๋ <head></head>
์น ํ์ด์ง๋ฅผ ํ์ํ ๋ ์ฐ์ด๋ <body></body>๋ก ๊ตฌ์ฑ
* <html><head><body> ํ๊ทธ๋ ํญ์ ์์ด์ผ ํจ
1.2 ๊ธฐ๋ณธ ํ๊ทธ (๋ฌธ์) - p, h1
<p></p> : ๋ฌธ์๋ฅผ ์ ์ ๋ ์ฐ๋ ํ๊ทธ
<h1></h1> : ๋ฌธ์๋ฅผ ์ ์ ๋ ์ฐ๋ ํ๊ทธ. h1์ ๋ฌธ์์ ํฌ๊ธฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํด์ ธ ์๋ค (h1,h2,h3,h4,h5,h6 ๊ฐ์ด ์ ์ ์์ ํฌ๊ธฐ์ ๋ฌธ์๋ฅผ ํ์)
1.3 ๊ธฐ๋ณธ ํ๊ทธ ํ์ฉํด๋ณด๊ธฐ - img, a href, input
<a></a> a ํ๊ทธ : ๋ค๋ฅธ ์ฌ์ดํธ์ ๋งํฌ๋ฅผ ๊ฑธ ๋
input ํ๊ทธ : ์
๋ ฅ์ ๋ฐ์ ๋. (๋ฒํผ ์์ฑ ์ ์ฌ์ฉ ex. <input></input>)
img ํ๊ทธ : ์ด๋ฏธ์ง๋ฅผ ํ์ํ ๋ ex. <img src=""/>
2. css - html ์คํ์ผ๋ง
html ํ๊ทธ๋ณ๋ก ์คํ์ผ๋ง ๊ฐ๋ฅ
2.1 html, css - id์ class์ ์ฐจ์ด์
id, class ๋ชจ๋ html ์์ฑ์ ๊ตฌ๋ถํ ๋ ์ฌ์ฉ
id์ class๋ฅผ ํตํด html ์์ฑ์ ์ ๊ทผํ๊ฑฐ๋, ๊พธ๋ฏธ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์
* id๋ <p id="my-id"> </p> ๊ฐ์ ์์ผ๋ก ์์ฑ, class๋ <p class="textStyle"></p> ์ ๊ฐ์ ํ์์ผ๋ก ์์ฑ
css์์๋ ์ํ๋ id์ class๋ง ์คํ์ผ๋ง ํด์ค ์ ์์
id๋ #id๋ก ํ๊ธฐ, ํด๋์ค๋ .class๋ก ํ๊ธฐ
2.3 CSS - ์์ ํ๊ทธ์ ์ ๊ทผํ๊ธฐ
p em์ em์ด p๋ณด๋ค ์์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ฉด ๋ค ํด๋น
๋ฐ๋ฉด > ๊ธฐํธ๊ฐ ์์ผ๋ฉด ๋ฐ๋ก ์์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ง ํด๋น
ํ์ฑ? (Parsing)
์ด๋ค ํ์ด์ง(๋ฌธ์, html ๋ฑ)์์ ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํจํด์ด๋ ์์๋ก ์ถ์ถํด ๊ฐ๊ณตํ๋ ๊ฒ
์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ถํดํ๋ ๊ฒ!
์ ํ์ ๊ฒฝ๋ก ์ฐพ๊ธฐ
์ ํ์? HTML์ ํ๊ทธ๋ค์ ์ด๋ฆ์ ๋ง๋ค์ด ์คํ์ผ์ํธ๋ก ์ ์ดํ๋ ์ญํ
html์ ๊ตฌ์กฐ๋ฅผ ํ์
ํด์ ์ง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ฒ (์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋ณต์์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ๋ ์ ์ฉ)
copy๋ฅผ ์ด์ฉํด ์ ํ์(selecor) ๊ฒฝ๋ก๋ฅผ ๋ณต์ฌ (๋จ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ๋ ์ ์ฉ)
ํด๋์ค | id | |
์ ํ์ | .ํด๋์ค๋ช | #ID |
๊ฐ๋ฅํ ๊ฐ์ | ์ฌ๋ฌ ๊ฐ | ๋จ ํ ๊ฐ |
์ฅ์ | ๋๊ฐ์ด ์๊ธด ๋ฆฌ์คํธ ์ฌ๋ฌ ๊ฐ ์ถ์ถ | ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์์์น ๋ชปํ๊ฒ ์์ง๋ ๊ฐ๋ฅ์ฑ ์กด์ฌ |
๋จ์ | ์์์น ๋ชปํ ๋ค๋ฅธ ์์๊ฐ ์ถ์ถ๋ ์ ์์ผ๋ฏ๋ก ๊ฒ์ฆ ํ์ | ์ฌ๋ฌ ์์ ํจ๊ป ๊ฐ์ ธ์ฌ ์ ์์ |
๊ด๋ จ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ
1. requests
import requests
HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์๋ฒ๋ก๋ถํฐ ์๋ต์ ์์ฒญํ๊ณ HTML ์ฝ๋๋ฅผ ๋ฐ์
์ด๋ค ๋ฐฉ์(method)์ HTTP ์์ฒญ์ ํ๋๋์ ๋ฐ๋ผ์ ํด๋นํ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ฌ์ฉ
GET ๋ฐฉ์: requests.get()
POST ๋ฐฉ์: requests.post()
PUT ๋ฐฉ์: requests.put()
DELETE ๋ฐฉ์: requests.delete()
- requests ๋ชจ๋์ get() ํจ์๋ ์๋ต (Response) ๊ฐ์ฒด๋ฅผ ๋๋ ค์ค (status_code, text, url, headers ๋ฑ)
- response๋ ๊ฐ์ฒด์ ์์๋ค ์ค text ์์๋ฅผ ๋ถ๋ฌ์ค๋ฉด html ์ฝ๋์ ํ
์คํธ๊ฐ ๋ถ๋ฌ์์ง๋ค
- html.select() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด html ๋ณ์์ ๋ด๊ธด HTML ๋ฌธ์ ์์์ ์
๋ ฅ๋ ์ ํ์๋ฅผ ๊ฐ๋ ์์๋ฅผ ๋ฆฌ์คํธ ํ์
์ผ๋ก ๋ชจ๋ ๊ฐ์ ธ์จ๋ค
* HTML๋ณ์.select('์ ํ์')์ ๊ฒฐ๊ณผ๋ ์ฌ๋ฌ ์์๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ๋ฅผ ์์ ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํ
2. Beautiful Soup
from bs4 import BeautifulSoup
์น ํ์ด์ง์ ์ ๋ณด๋ฅผ ์์๋ณผ ์ ์๋๋ก ํ์ด์ฌ ์ฉ์ด๋ก ๋ฐ๊ฟ์ค์ ์ฝ๊ฒ ์คํฌ๋ํ์ด ๊ฐ๋ฅ
html.parser, lxml๊ณผ ๊ฐ์ parser๋ฅผ ํตํด ํ์ฑํจ์ผ๋ก์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ํด์ํ ์ ์๋ ๊ตฌ์กฐ ์์ฑ
.prettify() : ๋ฌธ์ ๊ณ์ธต๊ตฌ์กฐ ์กฐํ
.select_one : 1๊ฐ์ ํ๊ทธ๋ง ๋ฐํ
.select : ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ฐํ
.find() : 1๊ฐ์ ํ๊ทธ๋ง ๋ฐํ
.find_all() : ๋ชจ๋ a ํ๊ทธ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ
.title : title ํ๊ทธ ๋ฐํ
.title.name : title ํ๊ทธ์ ์ด๋ฆ(‘title’)์ ๋ฐํ
.title.string : title ํ๊ทธ์ ๋ฌธ์์ด์ ๋ฐํ
.title.parent.name : title ํ๊ทธ์ ๋ถ๋ชจ ํ๊ทธ์ ์ด๋ฆ์ ๋ฐํ
.p : ์ฒซ pํ๊ทธ ๋ฐํ
.p[‘class’] : ‘class’ ์์ฑ์ด ์๋ ์ฒซ p ํ๊ทธ๋ฅผ ๋ฐํ
.a : a ํ๊ทธ๋ฅผ ๋ฐํ
.get() : href ์์ฑ์ ๋ฐํ
.get_text() : html ๋ฌธ์ ์์ ์๋ ํ
์คํธ๋ฅผ ๋ฐํ
์ฐธ๊ณ
https://codetorial.net/beautifulsoup/basics.html
https://beautiful-soup-4.readthedocs.io/en/latest/
https://realpython.com/python-requests/
https://www.daleseo.com/python-requests/
https://book.coalastudy.com/data-crawling/week-1/stage-4