์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- select
- ๋ณ์
- ํจ์
- Ajax
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฐ์ด
- SQL
- optionํ๊ทธ
- like
- JS
- JSP
- ์๋ฐ์คํฌ๋ฆฝํธ
- DATE_FORMAT
- ํ ์ด๋ธ
- ๋ฐฑํฑ
- oracle
- ๋ฆฌ๋ ์ค
- ๋์ปค
- post๋ฐฉ์
- ์ธ๋ผ์ธ๋ทฐ
- order by
- Update
- ๋์ ํ ์ด๋ธ
- JavaScript
- MySQL
- Spring
- ์ฝํ
- ๋ช ๋ น์ด
- ์ปจํธ๋กค๋ฌ
- ๋์
- Today
- Total
bom's happy life
Python(ํ์ด์ฌ) - ์น์คํฌ๋ํ(ํฌ๋กค๋ง) ์ฌ์ฉ๋ฒ, bs4 ๋ณธ๋ฌธ
Python(ํ์ด์ฌ) - ์น์คํฌ๋ํ(ํฌ๋กค๋ง) ์ฌ์ฉ๋ฒ, bs4
bompeach 2022. 6. 3. 11:26ํฌ๋กค๋ง(crawling)์ด๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ถ๋ฅํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฃผ๋ก ์ธํฐ๋ท์์ ์นํ์ด์ง๋ฅผ ์์งํด์ ๋ถ๋ฅํ๊ณ ์ ์ฅํ๋ ๊ฒ์ ๋ปํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ
์ด๋์ ์ ์ฅ๋์ด ์๋์ง ์์น์ ๋ํ ๋ถ๋ฅ ์์ ์ด ํฌ๋กค๋ง์ ์ฃผ์ ๋ชฉ์ ์ด๋ค. [Google 'ํฌ๋กค๋ง ๋ป']
# "ํฌ๋กค๋ง"์ ํ๋ ค๋ฉด ๋๊ฐ์ง ์ผ์ ํด์ผํ๋ค.
1. ์ฃผ์์ฐฝ์ ์์ฒญํด์ html์ ๊ฐ์ ธ์์ผ ํ๋ค.
( ์์ ์ requests๋ฅผ ๊ฐ์ง๊ณ ์ด๋ฏธ ํด๋ณธ ๊ฒ.)
2. beautifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
beautifulsoup ์ค์นํ๊ธฐ(requests ์ค์น ๋๋ ๊ฐ์)
'ํ์ผ' → '์ค์ ' → 'ํ๋ก์ ํธ: prac_python' → Python ์ธํฐํ๋ฆฌํฐ ํ๋ฉด์์ + ๋ฒํผ ๋๋ฆ.
→ 'bs4' ๊ฒ์ํด์ ์ค์น!
# ์ง๊ธ๋ถํฐ beautifulsoup ์ฌ์ฉ๋ฐฉ๋ฒ!!
[์ฝ๋์ค๋ํซ] ํฌ๋กค๋ง ๊ธฐ๋ณธ ์ธํ
import requests
from bs4 import BeautifulSoup
# ํ๊ฒ URL์ ์ฝ์ด์ HTML๋ฅผ ๋ฐ์์ค๊ณ ,
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'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# HTML์ BeautifulSoup์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๊ฒ์ํ๊ธฐ ์ฉ์ดํ ์ํ๋ก ๋ง๋ฆ
# soup์ด๋ผ๋ ๋ณ์์ "ํ์ฑ ์ฉ์ดํด์ง html"์ด ๋ด๊ธด ์ํ๊ฐ ๋จ
# ์ด์ ์ฝ๋ฉ์ ํตํด ํ์ํ ๋ถ๋ถ์ ์ถ์ถํ๋ฉด ๋๋ค.
soup = BeautifulSoup(data.text, 'html.parser')
#############################
# (์
๋ง์ ๋ง๊ฒ ์ฝ๋ฉ)
#############################
print(soup)์ ํ๋ฉด ๋ฐ์ ์คํ์ฐฝ์ html์ด ๋ค์ด์ค๋ ๊ฑธ ๋ณผ ์ ์๋ค. (์ ๋ค์ด์ค๋์ง url ๋ถ์ฌ๋ฃ๊ณ ๊ผญ ํ์ธํด๋ณด๊ธฐ)
# select / select_one์ ์ฌ์ฉ๋ฒ์ ์ตํ๋ณด์.
์์ )
์ํ ์ ๋ชฉ์ ๊ฐ์ ธ์๋ณด๊ธฐ!
ํ๊ทธ ์์ ํ ์คํธ๋ฅผ ์ฐ๊ณ ์ถ์ ๋ → ํ๊ทธ.text
ํ๊ทธ ์์ ์์ฑ์ ์ฐ๊ณ ์ถ์ ๋ → ํ๊ทธ['์์ฑ']
import requests
from bs4 import BeautifulSoup
# URL์ ์ฝ์ด์ HTML๋ฅผ ๋ฐ์์ค๊ณ ,
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'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# HTML์ BeautifulSoup์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๊ฒ์ํ๊ธฐ ์ฉ์ดํ ์ํ๋ก ๋ง๋ฆ
soup = BeautifulSoup(data.text, 'html.parser')
# select๋ฅผ ์ด์ฉํด์, tr๋ค์ ๋ถ๋ฌ์ค๊ธฐ
movies = soup.select('#old_content > table > tbody > tr')
# movies (tr๋ค) ์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๊ธฐ
for movie in movies:
# movie ์์ a ๊ฐ ์์ผ๋ฉด,
a_tag = movie.select_one('td.title > div > a')
if a_tag is not None:
# a์ text๋ฅผ ์ฐ์ด๋ณธ๋ค.
print (a_tag.text)
if a_tag is not None : ์ ์๋ฏธ๋? (if a_tag != ← is not None์ด๋ ๊ฐ์ ์๋ฏธ.)
None์ ํ๋ฉด์ ๋ณด์ด๋ ๊ฐ๋ก์ ! ๊ทธ๋์ ๊ฐ๋ก์ ์ ์ ์ธํ๊ณ ๊ฐ์ ๋์ค๊ฒ ํ๊ธฐ์ํจ์.
# beautifulsoup ๋ด select์ ๋ฏธ๋ฆฌ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ณด์.
# ์ ํ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ (copy selector)
soup.select('ํ๊ทธ๋ช
')
soup.select('.ํด๋์ค๋ช
')
soup.select('#์์ด๋๋ช
')
soup.select('์์ํ๊ทธ๋ช
> ํ์ํ๊ทธ๋ช
> ํ์ํ๊ทธ๋ช
')
soup.select('์์ํ๊ทธ๋ช
.ํด๋์ค๋ช
> ํ์ํ๊ทธ๋ช
.ํด๋์ค๋ช
')
# ํ๊ทธ์ ์์ฑ๊ฐ์ผ๋ก ์ฐพ๋ ๋ฐฉ๋ฒ
soup.select('ํ๊ทธ๋ช
[์์ฑ="๊ฐ"]')
# ํ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ ๊ฒฝ์ฐ
soup.select_one('์์ ๋์ผ')
# ํฌ๋กฌ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ์ฐธ๊ณ ํ ์๋ ์๋ค.
1. ์ํ๋ ๋ถ๋ถ์์ ๋ง์ฐ์ค ์ฐํด๋ฆญ → ๊ฒ์ฌ
2. ์ํ๋ ํ๊ทธ์์ ๋ง์ฐ์ค ์ฐํด๋ฆญ
3. Copy → Copy selector๋ก ์ ํ์๋ฅผ ๋ณต์ฌํ ์ ์์
# "ํฌ๋กค๋ง" ์ฐ์ต
url: https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829
๋ค์ด๋ฒ ์ํ๋ญํน ํ์ด์ง์์ ํฌ๋กค๋ง(์น์คํฌ๋ํ) ํด๋ณด๊ธฐ!
์์, ์ ๋ชฉ, ๋ณ์ ๋์ค๊ฒ ํด๋ณด์!
import requests
from bs4 import BeautifulSoup
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'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
movies = soup.select('#old_content > table > tbody > tr')
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
for movie in movies :
a = movie.select_one('td.title > div > a')
if a is not None:
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
print(rank,title,star)
for ๋ฌธ์ ๋๋ฆฌ๊ฒ ๋ค๋ ์๋ฏธ. (์ ํํ๊ฒ ๋๋ฆฐ๋ค๋๊ฒ ๋จผ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋๋์ ์๊ฒ ์ ;)
if a is not None : (ํ๋ฉด์ ๋ณด์ด๋ ๊ฐ๋ก์ ์ ์ธํ๋ค๋ ์๋ฏธ.)
title์ ๋ํ ์ค๋ช :
a๋ก ์ง์ ํด์ค ๋ถ๋ถ์์ text(ํ ์คํธ)๋ง ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ์๋ฏธ.
rank์ ๋ํ ์ค๋ช :
์์(rank)๋ฅผ ๋ด๊ณ ์ถ์๋ฐ! ๋จผ์ movie.select_one ๊ฐ๋ก์ด๊ณ ,
์ฐํด๋ฆญ ํฌ๋กฌ๊ฒ์ฌ → copy → copy selector ์์ ๋ณต๋ถํ๋ฉด
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
์ด๋ ๊ฒ ๊ธธ๊ฒ ๋์ค๋๋ฐ,
์์์
movies = soup.select('#old_content > table > tbody > tr')
์ด๋ ๊ฒ ์ง์ ์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์์(rank) ๋ณต์ฌํด์จ ๊ฒ์์ ์์ tr๋ถ๋ถ๊น์ง ์ง์ฐ๊ณ
td:nth-child(1) > img ์ด๊ฒ๋ง ๋ฃ์ด์ค๋ค! ๊ทธ๋ฆฌ๊ณ [ ' alt ' ] ์ถ๊ฐํด์ฃผ๋ฉด ์์๋ง ๊น๋ํ๊ฒ ๋์จ๋ค.
('alt' ์ถ๊ฐ ์ํด์ฃผ๋ฉฐ ๋ณต์กํ๊ฒ ๊ธธ๊ฒ ๋์ด.)
star ์ ๋ํ ์ค๋ช :
rank์ ๋ง์ฐฌ๊ฐ์ง!
#old_content > table > tbody > tr:nth-child(2) > td.point
๋ณ์ ๋ณต์ฌํด์ ๊ฐ์ ธ์จ ๋ถ๋ถ ์ค tr๊น์ง ์ง์ฐ๊ณ
๋ค์ td.point ๋ง ๋ถ์ฌ์ค๋ค. ์ด๋ ๊ฒ๋ง ํ๋ฉด ๋ณต์กํ๊ฒ ๊ธธ๊ฒ ๋์ค๋๋ฐ
.text๋ฅผ ํด์ฃผ๋ฉด ๋ณ์ ์ซ์๋ง ๊น๋ํ๊ฒ ๋์จ๋ค!
๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ ์ํ๋ ์์๋๋ก ์ ์ด์ printํ๋ฉด
print ( rank, title, star )
์ด๋ฐ์์ผ๋ก ๋์จ๋ค~!
01 ๋ฐฅ์ 9.64
02 ๊ทธ๋ฆฐ ๋ถ 9.59
03 ๊ฐ๋ฒ๋์ 9.59
'Deveolpment Study๐๏ธ > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Python(ํ์ด์ฌ) - ํจํค์ง ์ค์น, requests ๋ง๋ณด๊ธฐ (0) | 2022.06.02 |
---|---|
Python(ํ์ด์ฌ) - ๊ธฐ์ด๋ฌธ๋ฒ (0) | 2022.05.31 |