Hello creators ๐
3-7_์น์คํฌ๋ํ(ํฌ๋กค๋ง) ๊ธฐ์ด 1 ๋ณธ๋ฌธ
3-7_์น์คํฌ๋ํ(ํฌ๋กค๋ง) ๊ธฐ์ด 1
๋ถ์๋งค๋_HA 2023. 10. 13. 07:07โ . ์ด๋ฒ ํ์ฐจ ํ์ต ๋ชฉํ (goal)
1. ๋ฐฐ์ฐ๊ณ ์ ํ๋ ๊ฒ
- ์ ๋ชฉ & ํ์ ๋ฑ์ ๊ฐ์ ธ์ค๊ธฐ
โ ก. ํฌ๋กค๋ง์ ํ๋ ค๋ฉด 2๊ฐ์ง๋ฅผ ํด์ผ ํจ
1. ํด๋น ์ฃผ์์ ์์ฒญํด์ ํด๋น html ์ ๊ฐ์ ธ์ค๋ ๊ฒ!
- ์ด ์ฃผ์์ ๊ฐ์ html ์ ๊ฐ์ ธ์์ผ ํจ.
- ์ด๊ฑด requests ๋ฅผ ๊ฐ์ง๊ณ ์ด๋ฏธ ํ์.
๐ ์ฆ, requests
ํจํค์ง๋ฅผ ํตํด html
์ ๊ฐ์ ธ์ค๋ ์์
์ ์ด๋ฏธ ํ์.
โญ ์, `requests` ๋ฅผ ํตํด ํ๋๊ฒ html ์ ๊ฐ์ ธ์ค๋ ๊ฑฐ ๊ตฌ๋! โญโญโญโญโญโญ
2. ๊ฐ์ ธ์จ html ์์์ '์ ๋ชฉ' ์ ์ฐพ์ผ๋ ค๋ฉด? : beautifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
1) beautifulsoup ์ค์น
- pip ์
๊ทธ๋ ์ด๋
python3 -m pip install --upgrade pip python -m pip install --upgrade pip
โ ์ด ์
๊ทธ๋ ์ด๋๋ฅผ ์ ํด์ผ ํ๋ ๊ฑฐ์ง? ์์ง ์ ๋ชจ๋ฅด๊ฒ ์
<br>
2. beautifulsoup4 ์ค์น
``` powershell
pip install beautifulsoup4
- ๊ฒฐ๊ณผ๋ฌผ
2) ๋ฝ๊ณ ์ถ์ ๊ฒ ์ฐํด๋ฆญ
> ๊ฒ์ฌ์์ copy selector
- ๋ฝ๊ณ ์ถ์ ๊ฒ > ์ฐํด๋ฆญ > ๊ฒ์ฌ
- copy selector
3) beautifulsoup ๊ธฐ๋ณธ ์์ ์ฝ๋ ๋ฃ์ด๋ณด๊ธฐ
#python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ธ๋ค.
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
print(soup)
- ๊ฒฐ๊ณผ๋ฌผ
- ๊ทธ๋ฌ๋ฉด, ์ง์ง,
html ๋ฉ์ด๋ฆฌ
๊ฐ ๋ค์ด์จ๋ค.
- ๊ทธ๋ฌ๋ฉด, ์ง์ง,
4) soup.select_one
๊ณผ ==ํ๋์== copy selector
๋ฅผ ์ด์ฉํด์ html ๋ฉ์ด๋ฆฌ์ ์ค ์ํ๋ ๋ถ๋ถ์ ์ถ๋ฆฌ๊ธฐ
#python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
# ๋ด์ ์จ ๊ฒ ์ค copy selector ๋ฅผ ์ด์ฉํด์ ์์๋ธ๋ค.
# ๊ฒฐ๊ณผ๋ฌผ์ a ํ๊ทธ ์ ํ
์คํธ๋ก ๋์จ๋ค.
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
print(title.text)
print(title['href'])
print(title)
๊ฒฐ๊ณผ๋ฌผ>>> print(title) <a href="/movie/bi/mi/basic.naver?code=186114" title="๋ฐฅ์ ">๋ฐฅ์ </a>
- ๋๋์
- ์ฌ๊ธฐ์ ๋ง๋ํ๊ฒ ๋์ค๋๊ฑด ์๋๊ตฌ๋,
- ์ฆ, ๋ด๊ฐ ์ํ๋ ๊ฑด, '๋ฐฅ์ ' ๊ธ์จ ์ธ๋ฐ, ==ํ ๋ฒ์ ๋์ค๋๊ฒ ์๋๋ผ, a ํ๊ทธ๋ ์์ฌ์ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์์ ๋ด์ค์ผ ํ๋ค. ==
print(title.text)
๊ฒฐ๊ณผ๋ฌผ>>> print(title.text) ๋ฐฅ์
print(title['href'])
๊ฒฐ๊ณผ๋ฌผ>>> print(title['href']) /movie/bi/mi/basic.naver?code=186114
5) soup.select
์ ==์ฌ๋ฌ๊ฐ์== copy selector
๋ฅผ ์ด์ฉํด์ html ๋ฉ์ด๋ฆฌ์ ์ค ์ํ๋ ๋ถ๋ถ์ ์ถ๋ฆฌ๊ธฐ
a) ์ด๋๊น์ง ๋๊ฐ์์ง ํ์ธ
- ๋ค์ด๋ฒ ์ํ์ ๊ฒฝ์ฐ,
old_content > table > tbody > tr
๊น์ง๋ ๋์ผ
b) ๊ทธ๊ฑธ select ์ ๋ฃ๊ณ ์คํํ๋ฉด?
#python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
# ๋ด์ ์จ ๊ฒ ์ค copy selector ๋ฅผ ์ด์ฉํด์ ์์๋ธ๋ค.
# ๊ฒฐ๊ณผ๋ฌผ์ a ํ๊ทธ ์ ํ
์คํธ๋ก ๋์จ๋ค.
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
- ์คํํ๋ฉด, ์ด๋ ๊ฒ ๋ฌด์๋ฌด์ ํ๊ฒ ์ฐํ โญโญโญโญโญโญ
๐ ์ด๊ฒ ์๋ฏธํ๋ ๊ฑด? ์ข ๋ ํ์ธํด๋ณด์.
c) copy selector ์ ๊ฒ์ฌ๋ฅผ ๋๋ฌ์ ๋ณผ ์ ์๋ ๊ฑธ ๋น๊ตํ๋ฉด, ํํธ๋ฅผ ์ป์ ์ ์์.
copy selector
ํ ๋ถ๋ถ#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
select ํจ์์ ๋ฃ์ ๋ถ๋ถ
movies = soup.select('#old_content > table > tbody > tr')
- ๊ฒ์ฌ ๋๋ฌ์ ๋์จ ๊ฒฐ๊ณผ
tr ๊น์ง๋ง ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด๊ฐ ๋์ค๊ฒ ๋์์.
์ด๋, ์ ์ฒด๊ฐ '๋ฆฌ์คํธ' ์ ๋ด๊ฒจ ๋์ค๊ฒ ๋จ.
๊ทธ๋์ ๋ฌด์๋ฌด์ ํ๊ฑฐ ์์.
- ๊ทธ๋ฌ๋ฉด, ์ด๊ฑธ ์ด์งธ?
- ๋ฆฌ์คํธ๋ก ๋ด๊ฒจ ์์ผ๋๊น for ๋ฐ๋ณต๋ฌธ์ผ๋ก ํน์ ๊ฐ์ ์ ๊ทผํ๊ณ -> ๊ทธ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์ํ๋ ์ ๋ชฉ ๊น์ง ๊ฐ ์ ์์ ๊ฒ
d) ๊ฒฐ๊ณผ์ ์ผ๋ก, 1) ๊ณตํต ๋ถ๋ถ ๊น์ง๋ฅผ ์ถ์ถ ํ๊ธฐ ๋๋ฌธ์, ์ ์ฒด๊ฐ ๋์ค๊ฒ ๋๊ณ 2) ํด๋น ๋ถ๋ถ์ ๋ฆฌ์คํธ์ ๋ด๊ฒจ ์๊ธฐ ๋๋ฌธ์ 3) ๋ฆฌ์คํธ + ๋ฐ๋ณต๋ฌธ์ ํตํด ์ํ๋ ๊ฐ์ผ๋ก ์ ๊ทผํ ์ ์์.
- ๋ฆฌ์คํธ + ๋ฐ๋ณต๋ฌธ์ด ์๋ํ๋ ์ฝ๋ #python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests from bs4 import BeautifulSoup
์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
๋ณต์๊ฐ์ copy selector ๋ฅผ ํ์ฉํ๊ณ ์ถ์.
'๋ฐฅ์ ' ๊ณผ '๊ทธ๋ฆฐ ๋ถ' copy selector ๋ฅผ ์ฐ์ด๋ด
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
๊ณตํต๋๋ ๋ถ๋ถ์ select ํจ์์ ๋ฃ๊ธฐ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
print(a)
<br>
- ๊ณผ์ ์ค๋ช
![](https://i.imgur.com/7Q4RxEo.png)
<br>
- ๊ฒฐ๊ณผ๋ฌผ ![](https://i.imgur.com/FeEKrx0.png)
<br>
##### e) ๋ฐ์ค(none) ์์ ๊ณ ์ ๋ชฉ ๋ฝ๊ธฐ
- ๋ฐ์ค ์ ํ์
![](https://i.imgur.com/0QHrY8m.png)
![](https://i.imgur.com/PGR8kcW.png)
- ์๋ํ๋ ์ฝ๋ #python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
``` python
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ๋ณต์๊ฐ์ copy selector ๋ฅผ ํ์ฉํ๊ณ ์ถ์.
# '๋ฐฅ์ ' ๊ณผ '๊ทธ๋ฆฐ ๋ถ' copy selector ๋ฅผ ์ฐ์ด๋ด
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
# ๊ณตํต๋๋ ๋ถ๋ถ์ select ํจ์์ ๋ฃ๊ธฐ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
if a != None: # if a is not None ({๋์ผ})
print(a.text)
- ๊ฒฐ๊ณผ๋ฌผ
๐ญ What i learned
- ํฌ๋กค๋ง์์ ํ์ํ ๊ณผ์ 1) ํด๋น url ์์ html ๊ฐ์ ธ์ค๊ธฐ 2) ๊ฐ์ ธ์จ html ์์ ํ์ํ ๋ถ๋ถ ๋ฝ์๋ด๊ธฐ ๊ตฌ๋!!! โญโญโญ ์ด๋ ๊ฒ ๋จ๊ณํ ํ ์ ์๊ฒ ๋ค.
- select ๋ฅผ ์ด๋ค๊ณ ํด์ ==ํ ๋ฒ์ ๋์ค๋๊ฒ ์๋๋ผ, a ํ๊ทธ๋ ์์ฌ์ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์์ ๋ด์ค์ผ ํ๋ค. ==
'[WEB & AI] (feat. ์ทจ์ค) > ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ_์น๊ฐ๋ฐ์ข ํฉ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3-9_DB๊ฐ๊ด (0) | 2023.10.16 |
---|---|
3-8_Quiz_์น์คํฌ๋ํ(ํฌ๋กค๋ง) ์ฐ์ต 1 (4) | 2023.10.13 |
3-6_requests ํจํค์ง ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2023.10.13 |
3-5_ํ์ด์ฌ ํจํค์ง ์ค์นํ๊ธฐ (4) | 2023.10.08 |
3-4_ํ์ด์ฌ ๊ธฐ์ด๊ณต๋ถ (feat ํ์ด์ฌ ๋ฌธ๋ฒ, ๋ณ์, ์๋ฃํ, ํจ์, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ) (0) | 2023.10.08 |