ํฌ๋กค๋ง๊ณผ ์คํฌ๋ํ
ํฌ๋กค๋ง : ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ธํฐ๋ท์ ํ์ํ๋ ํ๋ก๊ทธ๋จ
ํฌ๋กค๋ง: ํฌ๋กค๋ฌ๊ฐ ์นํ์ด์ง๋ค์ ๋์๋ค๋๋ ํ์
์คํฌ๋ํผ: ์นํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ํ๋ก๊ทธ๋จ
์คํฌ๋ํ: ์นํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ํ์
=> ํต์์ ์ผ๋ก ํฌ๋กค๋ง๊ณผ ์คํฌ๋ํ์ ํฉ์ณ์ ํฌ๋กค๋ง์ด๋ผ๊ณ ํํํจ
ํด๋ผ์ด์ธํธ์ ์๋ฒ
ํด๋ผ์ด์ธํธ
-์น ๋ธ๋ผ์ฐ์ ๋ฐ ์น
์) ์ค๋งํธํฐ ์ฑ, ํฌ๋กฌ, ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ
์๋ฒ
-ํด๋ผ์ด์ธํธ์ ์ฒ๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ
-ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต
-์ธํฐ๋ท ์ฃผ์์ฐฝ์ ์ฃผ์๋ฅผ ์
๋ ฅํ๊ณ ์ฌ์ดํธ์ ์ ์ํ๋ ํ์
=> ์๋ฒ์ ์ ์
์๋ต์ฝ๋
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ ํ ์ํ์ ๋ฐ๋ผ ๋ฐํํ๋ ์ฝ๋
100๋ฒ๋ | 200๋ฒ๋ | 300๋ฒ๋ | 400๋ฒ๋ | 400๋ฒ๋ |
์กฐ๊ฑด๋ถ ์๋ต | ์ฑ๊ณต | ๋ฆฌ๋ค์ด๋ ์ ์๋ฃ | ์์ฒญ ์ค๋ฅ | ์๋ฒ ์ค๋ฅ |
-ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ถ๋ง ํฌํจํ ์ฑ๋ก ๋ณด๋ด์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ณด๋ด๋ฌ๋ผ๊ณ ํ๋ ์๋ต์ฝ๋ | -์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌํ ํ ๋ฐํํ๋ ์๋ต์ฝ๋ | -ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋ฃํ๊ธฐ ์ํด ์์
์ด ๋จ์์๋ ์ฝ๋ -๋ณดํต ์๋ก๊ณ ์นจ์ ํ ๊ฒฝ์ฐ ๋ฐํํ๋ ์๋ต์ฝ๋ |
-ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์๋ชป๋์ ๋ ๋ฐํํ๋ ์๋ต์ฝ๋ -๋ฌธ์ ๋ฐ์์ ์์ธ์ด ํด๋ผ์ด์ธํธ์ ์๋ค๋ ๋ป |
-์๋ฒ์ ์ค์ , ์ฝ๋ ๋ฑ์ ๋ฌธ์ ๋ก ์ค๋ฅ๊ฐ ๋ฌ์ ๋ ๋ฐํ๋๋ ์ฝ๋ |
400๋ฒ๋, ์ฃผ๋ก ์ฃผ์๊ฐ ์ฌ๋ผ์ก์ ๋ 404 not found๊ฐ ๋ฌ๋ค.
์๋ก๊ณ ์นจ์ด๋?
๋ฃธ ํด๋ฆฌ๋์ด ์๋๋ผ, ๋๊ฐ์ด ์๊ธด ๋ ๋ค๋ฅธ ๋ฐฉ์ ๋ง๋ค์ด ์ด๋์ํค๋ ๊ฒ.
300๋ฒ๋ ์ฝ๋๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
Url ๊ตฌ์กฐ
ํต์ ํ๋กํ ์ฝ = ํต์ ๊ท์ฝ : ํต์ ํ๋ ๋ฐฉ๋ฒ
- ์ธํฐ๋ท์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ http, https
-๊ทธ ์ธ์ FTP, SFTP, SSH ๋ฑ์ด ์๋ค.
์ฃผ์ ๋๋ IP
- ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ํ๊ฒ
ํฌํธ๋ฒํธ: ๊ณตํญ ๊ฒ์ดํธ ๊ฐ์ ๊ฒ
์ฝ์ ๋์ด ์์ง ์์ ํฌํธ ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ์ ์์ด ๋์ง ์๋๋ค.
๋ฆฌ์์ค ๊ฒฝ๋ก
์ฟผ๋ฆฌ์คํธ๋ง : ? ์ดํ
์๋ฒ์ ์์ฒญ
์ ๋๋ก ๋ ๋ฐ์ดํฐ์ธ์ง ๋ฌป๊ฑฐ๋ ํ ๋ ์
+์ค๋ช ์ถ๊ฐ
์ฟผ๋ฆฌ์คํธ๋ง(Query String)์ ์น ๋ธ๋ผ์ฐ์ ๋ ์น ์๋ฒ๊ฐ ์น ์๋ฒ์๊ฒ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด URL์ ์ถ๊ฐํ๋ ๋ฌธ์์ด์
๋๋ค. ์ฟผ๋ฆฌ์คํธ๋ง์ ์ผ๋ฐ์ ์ผ๋ก ? ๊ธฐํธ๋ก URL์ ๊ฒฝ๋ก์ ๊ตฌ๋ถ๋๋ฉฐ, & ๊ธฐํธ๋ก ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ์คํธ๋ง์ ์ฐ๊ฒฐํฉ๋๋ค.
์ฟผ๋ฆฌ์คํธ๋ง์ ํค-๊ฐ ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ํค-๊ฐ ์์ = ๊ธฐํธ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, https://example.com/search?q=apple&page=2์ ๊ฐ์ URL์์ ? ์ดํ์ ์ค๋ q=apple&page=2 ๋ถ๋ถ์ด ์ฟผ๋ฆฌ์คํธ๋ง์
๋๋ค. ์ด ๊ฒฝ์ฐ, q์ page๋ผ๋ ๋ ๊ฐ์ ํค๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ๊ฐ์ apple๊ณผ 2์
๋๋ค.
์น ํฌ๋กค๋ง ๋ฐฉ์
1. ์ ์ ํฌ๋กค๋ง
์ด๋ ์ํฉ์์๋ ๊ฐ์ ์ฃผ์์์ ๋ณํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ํ ์ ์๋ ๊ฒฝ์ฐ
์์ง ๋์์ ํ๊ณ๊ฐ ์์ผ๋ ์๋๊ฐ ๋น ๋ฅด๋ค.
์ฌ์ฉ ๋ชจ๋: BeautifulSoup
2. ๋์ ํฌ๋กค๋ง
-์ ๋ ฅ, ํด๋ฆญ ๋ฑ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ํํ๋ ํ๋๋ค์ ํด์ผ๋ง ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๋ ๊ฒฝ์ฐ
-์์ง ๋์์ ํ๊ณ๊ฐ ์ ์ผ๋ ์๋๊ฐ ๋๋ฆฌ๋ค.
-์ฌ์ฉ ๋ชจ๋: Selenium
์๋๊ฐ ๊ฝค ๋ง์ด ์ฐจ์ด๊ฐ ๋๋ค.
ex) 24์๊ฐ์ 1000๊ฐ(๋์ )->10๋ถ์ 1000๊ฐ(์ ์ ) ์ฑ๋ฅ UP!
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํผ์ฉํด์ ์ฐ๊ธฐ๋ ํจ
DOM(Document Object Model) tree
DOM: ์น ๋ฌธ์๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ ๊ฒ
DOM tree: HTML ๋ฌธ์๋ฅผ ๋ก๋ํ ํ ํ์ฑํ์ฌ ์์ฑํ๋ ๋ชจ๋ธ
์ค์ต
ํค๋๋?
์ฟ ํก์์ ์จ๊ฐ ์๋ฒฝ๋ฐฐ์ก ์ค๊ธฐ ์ ์ ๋ณด๋ด์ฃผ๋ ๋ฌธ์ ๊ฐ์ ๊ฒ. ํ๋ฐฐ๋ body, ๋จผ์ ๋ณด๋ด์ฃผ๋ ๋ฌธ์๋ header.
์ ์ฅ ๋๊ฑฐ๋ ์ ์ก๋๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋งจ ์์ ์์นํ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค.
ํ๊ทธ
๋ฉํ ํ๊ทธ
ํ์ดํ ํ๊ทธ
# ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ res.text์์ ํ๊ธ์ด ๊นจ์ง๋ ํ์์ ๋ฐฉ์งํ ์ ์์
print(res.content)
์ฟผ๋ฆฌ์คํธ๋ง ๋ฐ์ดํฐ ์์ฑ
res = rq.get(url, params = {"key1" : "value1", "key2" : "value2"})
print(res.url)
params๋?
params๋ HTTP ์์ฒญ์ ๋ณด๋ผ ๋ ์ฟผ๋ฆฌ์คํธ๋ง์ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ
ํ์ด์ฌ์์๋ requests ๋ชจ๋์ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ์ ๋ณด๋ผ ๋, URL ๋ค์ ์ฟผ๋ฆฌ์คํธ๋ง์ ์ถ๊ฐํ๋ ค๋ฉด params ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉ
#urllib์ผ๋ก ์นํ์ด์ง ์ ์
from urllib.request import urlopen
url = "https://www.naver.com"
page = urlopen(url)
print(page)
print(page.code)
print(headers)
print(page.url)
print(page.read())
# ์ ์ ํฌ๋กค๋ง ๋ชจ๋
from bs4 import BeautifulSoup
from urllib.request import urlopen
BeautifulSoup์ ์์ฒญ ๋ชจ๋๋ก ๊ฐ์ ธ์จ HTML ์ฝ๋๋ฅผ ํ์ด์ฌ์ด ์ธ ์ ์๋ ํํ๋ก ๋ณํํด์ฃผ๋ ์ญํ
BeautifulSoup์ HTML, XML ๋ฑ์ ๋งํฌ์ ์ธ์ด๋ก ์์ฑ๋ ๋ฌธ์๋ฅผ ํ์ฑํ๊ณ , ํ์ฑํ ๊ฒฐ๊ณผ๋ฅผ ํ์ด์ฌ์์ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ ํํ๋ก ๋ณํํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(GPT์ถ์ฒ)
url = "http://www.naver.com"
page = urlopen(url)
soup = BeautifulSoup(page, "lxml")
"lxml" << ํ์, ํ์ฑ์ด๋ ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํจํด์ด๋ ์์๋ก ์ถ์ถํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ๊ณตํด์ฃผ๋ ํ๋ก๊ทธ๋จ
-lxml , html5lib, html.parser ๋ฑ์ด ์๋ค.
lxml: C์ธ์ด๋ก ๊ตฌํ๋์ด ์๋๊ฐ ๊ฐ์ฅ ๋น ๋ฅด๋ค.
html5lib: ์น๋ธ๋ผ์ฐ์ ํํ๋ก HTML์ ๋ถ์ํ์ฌ ์๋๊ฐ ๊ฐ์ฅ ๋๋ฆฌ๊ณ ๊ฐ์ฅ ์์ ์ ์ด๋ค.
html.parser: lxml๊ณผ html5lib์ ์ค๊ฐ ์๋์ด๋ค.
์์ฑ ๋ฐ์ดํฐ
html = """<html> <head><title class="t" id="ti">test site</title></head> <body> <p>test</p> <p>test1</p> <p>test2</p> </body></html>"""
<html> ~ </html> ๊น์ง ๋ซํ์๋ค.
html ๋ด๋ถ์์ <head> ์์ ํ๊ทธ๊ฐ ์ด๋ฆฌ๊ณ ๋ซํ๋ค.
-html(๊ฐ์ฅ ์์)
-head
-title (class "t" id "ti")๋ ์์ฑ, id๋ ๊ณ ์ ํ ๊ฐ, ๋์ผํ id๋ ๋ ๋ฒ ๋ฑ์ฅํ ์ ์๋ค
-body ํ๊ทธ๋ head ํ๊ทธ์ ๋๋ฑํ ์์น, head์ body ํ๊ทธ๋ ํ์ ํ๊ทธ
-p
-p
-p
soup = BeautifulSoup(html, "lxml")
soup
<html> <head><title class="t" id="ti">test site</title></head> <body> <p>test</p> <p>test1</p> <p>test2</p> </body></html>
tag_title = soup.title
print(tag_title)
print(tag_title.attrs) # ํ๊ทธ์ ์์ฑ ๊ฐ์ ธ์ค๊ธฐ
print(tag_title["class"]) # ๋์
๋๋ฆฌ ์ฒ๋ผ ์ ๊ทผํ ์ ์๊ณ ๋์
๋๋ฆฌ ๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ ์ฉํ ์ ์์,
ํค๊ฐ ์๋ค๋ฉด ์๋ฌ ๋ฐ์
print(tag_title["id"])
<title class="t" id="ti">test site</title>
{'class': ['t'], 'id': 'ti'}
['t']
ti
ํ๊ทธ ์ ๊ทผ
soup.ํ๊ทธ์ด๋ฆ ์ ํํ๋ก ์ฒซ ๋ฒ์งธ๋ก ๋ฑ์ฅํ๋ ํ๊ทธ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํด์ฌ ์ ์๋ค.
# text์ string์ ์ฐจ์ด
tag_body = soup.body
data_text = tag_body.text
data_string = tag_body.string
pring(tag_body)
print("text :", data_text, type(data_text)) #ํ์ ํ๊ทธ๋ค์ ๊ฐ๋ ๋ชจ๋ ์ถ๋ ฅ
print("string :", data_string, type(data_string)) # ์ ํํ ํด๋น ํ๊ทธ์ ๋ํ ๊ฐ๋ง ์ถ๋ ฅ
text: ํ์ ํ๊ทธ๋ค์ ๊ฐ๋ ๋ชจ๋ ์ถ๋ ฅ
string: ์ ํํ ํด๋น ํ๊ทธ์ ๋ํ ๊ฐ๋ง ์ถ๋ ฅ
tag_body.p
<p>test</p>
tag_body.p.string
'test'
# ์ํ๋ ์์์ ์ ๊ทผํ๊ธฐ find_all()
-์ํ๋ ํ๊ทธ๋ค์ ๋ฆฌ์คํธ ํํ๋ก ๊ฐ์ ธ์ค๊ธฐ
-html
-head
-title
-body
-p
-p
-p
-a
-b
html = """<html> <head><title>test site</title></head> <body> <p id="i" class="a">test1</p><p id="d" class="d">test2</p><p class="c">test3</p></p><a>a tag</a> <b>b tag</b></body></html>"""
soup = BeautifulSoup(html, "lxml")
soup.find_all("title")
[<title>test site</title>]
ํ๋๋ฐ์ ์๋ค๊ณ ํ ์ง์ธ์ ๋ฆฌ์คํธ ํํ๋ก ๋ชจ๋ ๊ฐ์ง๊ณ ๋์จ๋ค.
soup.find_all("p")
[<p class="a" id="i">test1</p>,
<p class="d" id="d">test2</p>,
<p class="c">test3</p>]
soup.find_all("p")[1]
<p class="d" id="d">test2</p>
์ธ๋ฑ์ค ์ฌ๋ผ์ด์ฑ ํ๊ธฐ
soup.find_all(id = "d")
[<p class="d" id="d">test2</p>]
id์ ์กด์ฌ ์ฌ๋ถ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
# id์ ์กด์ฌ ์ฌ๋ถ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
soup.find_all(id = True)
[<p class="a" id="i">test1</p>, <p class="d" id="d">test2</p>]
์ํ๋ ํ๊ทธ, ์ํ๋ id ๊ฐ์ผ๋ก ํ๊ทธ ๊ฐ์ ธ์ค๊ธฐ
# ์ํ๋ ํ๊ทธ, ์ํ๋ id ๊ฐ์ผ๋ก ํ๊ทธ ๊ฐ์ ธ์ค๊ธฐ
print(soup.find_all("p", id = "d"))
[<p class="d" id="d">test2</p>]
์๋ ๋ฐ์ดํฐ >> none
print(soup.find_all("p", id = "c"))
[]
soup.find_all("p", class_ = "c")[0].text
'test3'
# find()
-ํ๋์ ์์๋ง ๊ฐ์ ธ์ด
-์ฐพ๊ณ ์ ํ๋ ์์๊ฐ ํ๋๋ง ์์ ๋ ์ฌ์ฉ
์) id ๊ฐ์ผ๋ก ์ ๊ทผ
print(soup.find("p", class_ = "d"))
print(soup.find("p", id = "i"))
print(soup.find(id = "i"))
<p class="d" id="d">test2</p>
<p class="a" id="i">test1</p>
<p class="a" id="i">test1</p>
๋ฐ๋ ํ๊ทธ ์์์๋ง ์ฐพ๊ณ ์ถ์ ๋?
์ฐ์์ผ๋ก find ํจ์ ์ฌ์ฉ
soup.find("body").find("p", class_ = "d")
<p class="d" id="d">test2</p>
Select๋ ๋ด์ผ ์ด์ด์...!!!
'๐์น ๊ฐ๋ฐ(Web) > ๐ํ์ด์ฌ(Python)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ์น ํฌ๋กค๋ง ์ ์ ํฌ๋กค๋ง selenium ๋ง์ฐ์ค ์ ์ด ํค๋ณด๋ ์ ์ด selenium๊ณผ bs4์ ์กฐํฉ (1) | 2023.05.10 |
---|---|
ํ์ด์ฌ json (0) | 2023.02.08 |
ํ์ผ๋ณต์ฌ/csvํ์ผ ์ฝ๊ธฐ ์ฐ๊ธฐ (0) | 2023.02.08 |
ํ์ผ ๋ง๋ค๊ณ ์ฝ๊ธฐ (0) | 2023.02.06 |
์ง์ญ๋ณ์(local) ์ ์ญ๋ณ์(global) (0) | 2023.02.01 |