์นํฌ๋กค๋ง์ ์ธํฐ๋ท์์ ์ ๋ณด๋ฅผ ์์งํ๋ ํ๋ก์ธ์ค๋ก, python์ ์ด๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ์๋ฆฌ๋งค๊นํ๊ณ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ํ์ด์ฌ์ ์ฌ์ฉํ์ฌ ์นํฌ๋กค๋งํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
1. ์นํฌ๋กค๋ง์ ์ดํด๐ค
์นํฌ๋กค๋ง์ ์นํ์ด์ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ผ๋ก, HTTP ์์ฒญ์ ํตํด ์นํ์ด์ง์ ์์ค์ฝ๋๋ฅผ ๊ฐ์ ธ์ต๋๋ค. 'requests' ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์นํ์ด์ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import requests # requests ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. ์ด ๋ชจ๋์ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
url = 'https://www.naver.com/' # ํฌ๋กค๋งํ ์นํ์ด์ง์ URL ์ฃผ์๋ฅผ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
response = requests.get(url) # ์ง์ ํ URL๋ก GET ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋ฐ์์ต๋๋ค.
print(response.text) # ์๋ต ๊ฐ์ฒด์ ํ
์คํธ ์์ฑ์ ์ถ๋ ฅํ์ฌ ์นํ์ด์ง์ HTML ์์ค์ฝ๋๋ฅผ ํ์ธํฉ๋๋ค.
2. BeautifulSoup์ ํ์ฉํ ์นํ์ด์ง ํ์ฑ๐
BeautifulSoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด HTML ๋ฌธ์๋ฅผ ํ์ฑ ํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- find() ๋ฉ์๋ : ์นํ์ด์ง์ ํน์ ํ๊ทธ ์ฐพ๊ธฐ
- find_all() ๋ฉ์๋ : ๋ชจ๋ ํ๊ทธ ์ฐพ๊ธฐ
from bs4 import BeautifulSoup # BeautifulSoup ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. ์ด ๋ชจ๋์ HTML์ ํ์ฑํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
html = '''
<div>
<a href="https://www.naver.com">๋ค์ด๋ฒ</a> <!-- ๋ค์ด๋ฒ ๋งํฌ -->
<a href="https://www.kakao.com">์นด์นด์ค</a> <!-- ์นด์นด์ค ๋งํฌ -->
</div>
'''
soup = BeautifulSoup(html, 'html.parser') # BeautifulSoup ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , HTML์ ํ์ฑํ์ฌ ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ฅํฉ๋๋ค.
print(soup.find('a').text) # ์ฒซ ๋ฒ์งธ ๋งํฌ์ ํ
์คํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print(soup.find_all('a')) # ๋ชจ๋ ๋งํฌ ํ๊ทธ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํํฉ๋๋ค.
์๋๋ ๋ค์ ๋ด์ค์์ ๋ด์ค ์ ๋ชฉ์ ํฌ๋กค๋งํ๋ ์์ ์ฝ๋์
๋๋ค.
import requests # requests ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. ์ด ๋ชจ๋์ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
from bs4 import BeautifulSoup # BeautifulSoup ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. ์ด ๋ชจ๋์ HTML์ ํ์ฑํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
url = 'https://news.daum.net/' # ํฌ๋กค๋งํ ๋ค์ ๋ด์ค์ URL ์ฃผ์๋ฅผ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
response = requests.get(url) # ์ง์ ํ URL๋ก GET ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋ฐ์์ต๋๋ค.
html = response.text # ์๋ต ๊ฐ์ฒด์ ํ
์คํธ ์์ฑ์ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
soup = BeautifulSoup(html, 'html.parser') # BeautifulSoup ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , HTML์ ํ์ฑํ์ฌ ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ฅํฉ๋๋ค.
result = soup.find_all('strong', class_='tit_g') # HTML ์์ค์ฝ๋์์ strong ํ๊ทธ ์ค class ์์ฑ์ด 'tit_g'์ธ ์์๋ฅผ ๋ชจ๋ ์ฐพ์ต๋๋ค.
# print(result) # ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ์ถ๋ ฅํฉ๋๋ค.
for i in result:
print(i.text.strip()) # ๊ฒฐ๊ณผ์์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณ , ํ
์คํธ๋ง์ ์ถ๋ ฅํฉ๋๋ค.
3. ์ด๋ฏธ์ง ํ์ผ ๋ค์ด๋ก๋๐ฅ๏ธ
์นํ์ด์ง์์ ์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ํ์ฌ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด ์๋ค. 'requests'๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ํ์ผ์ ๋ณ์์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
import requests
image_url = 'https://example.com/image.jpg' # ๋ค์ด๋ก๋ํ ์ด๋ฏธ์ง์ URL ์ฃผ์๋ฅผ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
imgdata = requests.get(image_url) # ์ง์ ํ URL๋ก GET ์์ฒญ์ ๋ณด๋ด๊ณ , ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์๋ต์ผ๋ก ๋ฐ์์ต๋๋ค.
with open('image.jpg', 'wb') as f: # 'image.jpg'๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ๋ฐ์ด๋๋ฆฌ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ฝ๋๋ค.
f.write(imgdata.content) # ์๋ต์์ ๋ฐ์์จ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์๋๋ค.
4. ์นํ์ด์ง ๋ด ์ด๋ฏธ์ง ํ๊บผ๋ฒ์ ๋ค์ด๋ก๋๐๏ธ
์ด๋ฒ์๋ ์ฌ๋ฌ ์ด๋ฏธ์ง ํ์ผ์ ํ๊บผ๋ฒ์ ๋ค์ด๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์ฐพ์ URL์ ์ถ์ถํ๊ณ , ์ด๋ฅผ ํ์ฉํ์ฌ ์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
import requests
from bs4 import BeautifulSoup
url = 'https://example.com/page-with-images' # ์ด๋ฏธ์ง๊ฐ ์๋ ์นํ์ด์ง์ URL ์ฃผ์๋ฅผ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
response = requests.get(url) # ์ง์ ํ URL๋ก GET ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋ฐ์์ต๋๋ค.
html = response.text # ์๋ต ๊ฐ์ฒด์ ํ
์คํธ ์์ฑ์ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
soup = BeautifulSoup(html, 'html.parser') # BeautifulSoup ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , HTML์ ํ์ฑํ์ฌ ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ฅํฉ๋๋ค.
for img_tag in soup.find_all('img'): # HTML ์์ค์ฝ๋์์ ๋ชจ๋ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์ฐพ์ต๋๋ค.
img_url = img_tag.get('src') # ๊ฐ ์ด๋ฏธ์ง ํ๊ทธ์์ src ์์ฑ์ ์ถ์ถํ์ฌ ์ด๋ฏธ์ง์ URL์ ๊ฐ์ ธ์ต๋๋ค.
img_data = requests.get(img_url) # ์ด๋ฏธ์ง์ URL๋ก GET ์์ฒญ์ ๋ณด๋ด๊ณ , ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์๋ต์ผ๋ก ๋ฐ์์ต๋๋ค.
with open('downloaded_images/' + img_url.split('/')[-1], 'wb') as f: # ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ํ์ผ์ ๋ฐ์ด๋๋ฆฌ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ฝ๋๋ค.
f.write(img_data.content) # ์๋ต์์ ๋ฐ์์จ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์๋๋ค.
ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ๋ถ์ํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ CSVํ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ณ ๊ฐ๊ณตํ์ฌ ๋ถ์์ ํ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ ๋ํด ์กฐ๊ธ ๋ ์๊ณ ์ถ๋ค๋ฉด ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
5. ์ฃผ์์ฌํญ๐ต๏ธโ๏ธ
ํฌ๋กค๋ง์ ํ ๋์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ ์ธก๋ฉด๊ณผ ์ํฐ์ผ์ ์ค์ํด์ผ ํฉ๋๋ค.
- ๋ก๋ด ๋ฐฐ์ ํ๋กํ ์ฝ(robots.txt) ์ค์
- ๋ก๋ด ๋ฐฐ์ ํ๋กํ ์ฝ(robots.txt)์ ํ์ธํ์ฌ ํฌ๋กค๋ฌ๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์ ํ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์น์ฌ์ดํธ๊ฐ ๋ก๋ด ๋ฐฐ์ ํ๋กํ ์ฝ์ ์ ๊ณตํ๋ค๋ฉด ์ด๋ฅผ ์ค์ํด์ผ ํฉ๋๋ค.
- ์น์ฌ์ดํธ ์ด์ฉ ์ฝ๊ด ์ค์
- ํฌ๋กค๋ง์ ํ ๋์๋ ํด๋น ์น์ฌ์ดํธ์ ์ด์ฉ ์ฝ๊ด์ ์ค์ํด์ผ ํฉ๋๋ค.
- ์น์ฌ์ดํธ์ ์ด์ฉ ์ฝ๊ด์ ๋ช ์๋ ์ ํ์ฌํญ์ ์งํค๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ ์ ํ ์์ฒญ ๋น๋
- ๋๋ฌด ์์ฃผ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ์ง ์๋๋ก ์ ์ ํ ์์ฒญ ๋น๋๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค.
6. ํต์ฌ ๋ด์ฉ๐