์น ํฌ๋กค๋ง
์น ์์์ ์น ํ์ด์ง๋ฅผ ํ์ํ๊ณ , ํ์ํ ์ ๋ณด๋ฅผ ์์งํ๋ ํ๋ก์ธ์ค
โข
ํ์ด์ฌ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : urllib, requests
์น ์คํฌ๋ํ
์น ํ์ด์ง์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ฑฐ๋ ๊ฐ์ ธ์ค๋ ๊ณผ์
โข
ํ์ด์ฌ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : BeatifulSoup
urllib
URL ๊ด๋ จ ํ์ด์ฌ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
๋ชจ๋
๋ชจ๋ | ์ค๋ช
|
request | ์์ฒญ ๊ด๋ จ ๊ธฐ๋ฅ |
response | ์๋ต ๊ด๋ จ ๊ธฐ๋ฅ |
parse | URL ๋ฌธ์์ด์ ํ์ฑํ๋ ๊ธฐ๋ฅ |
error | request ๋ชจ๋์ ์ํด ๋ฐ์ํ๋ ์์ธ ํด๋์ค ์ ๊ณต |
robotparser | robots.txt ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ธฐ๋ฅ ์ ๊ณต |
urllib ํจํค์ง
urllib.requests ๋ชจ๋
URL ๋ฌธ์์ด์ ๊ฐ์ง๊ณ HTTP ์์ฒญ์ ์ํ
โข
์์ฒญ ๋ฐฉ์์ GET, POST ๋ฐฉ์์ผ๋ก ์ง์ ํ URL ์ ์์ฒญํ๊ธฐ
import urllib.request
res = urllib.request.urlopen(" [URL] ") # GET ์์ฒญ
res = urllib.request.urlopen(" [URL] ", data=xxx) # POST ์์ฒญ
Python
๋ณต์ฌ
โข
request ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
import urllib.request
url = "https://~~~.com" # ์์ฒญ์ ๋ณด๋ผ URL
request = urllib.request.Request(url, method="๋ฉ์๋๋ฐฉ์") # GET, POST, PUT, DELETE ๋ฑ
response = urllib.request.urlopen(request) # ์์ฒญ ๋ณด๋ด๊ธฐ
result = response.read() # ์๋ต ๋ฐ์ดํฐ ์ฝ๊ธฐ
print(result) # ์๋ต ๋ฐ์ดํฐ ์ถ๋ ฅ
Python
๋ณต์ฌ
์์ ์ฝ๋
โข
๋ค์ด๋ฒ ๋ฉ์ธ ํ์ด์ง๋ฅผ ์์ฒญํ๊ณ , 1000 byte ๋ง ์ถ๋ ฅํ๊ธฐ
โข
๊ฐ์ธ ํํ์ด์ง์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ๋ด์ฉ๊ณผ ์๋ต ํค๋ ํ์ธํ๊ธฐ
โข
์ด๋ฏธ์ง url ์ฃผ์ ์์ฒญํ๊ณ , ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฅํ๊ธฐ
๋ค์ด๋ฒ ๋ฉ์ธ ํ์ด์ง๋ฅผ ์์ฒญํ๊ณ , 1000 byte ๋ง ์ถ๋ ฅํ๊ธฐ
import urllib.request
res = urllib.request.urlopen("http://www.naver.com/")
print(type(res))
print(res.status)
print("NAVER ์นํ์ด์ง์ ์์ค ๋ด์ฉ----------------------------------------------------------------")
print(res.read(1000).decode('utf-8'))
Python
๋ณต์ฌ
โข
res.status : ์๋ต ์ํ์ฝ๋
โข
res.read() : ์๋ต ํ์ด์ง๋ฅผ ๋์ฝ๋ฉํ์ง ์๊ณ ๋ฐ์ด๋๋ฆฌ ํ
์คํธ๋ก ๊ฐ์ ธ์จ๋ค
โข
res.read().decode(โutf-8โ) : ์๋ต ํ์ด์ง๋ฅผ UTF-8 ๋ฌธ์์
์ผ๋ก ๋์ฝ๋ฉํ๋ค.
โข
res.read(1000).decode(โutf-8โ) : ์๋ต ํ์ด์ง๋ฅผ 1000 ๋ฐ์ดํธ๋ง ๊ฐ์ ธ์จ๋ค
๊ฐ์ธ ํํ์ด์ง์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ๋ด์ฉ๊ณผ ์๋ต ํค๋ ํ์ธํ๊ธฐ
import urllib.request
res = urllib.request.urlopen("https://xn--pe5b27r.com/")
print("[ header ์ ๋ณด ]----------")
res_header = res.getheaders()
for s in res_header :
print(s)
print("[ body ๋ด์ฉ ]-----------")
print(res.read().decode('utf-8'))
Python
๋ณต์ฌ
์ด๋ฏธ์ง url ์ฃผ์ ์์ฒญํ๊ณ , ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฅํ๊ธฐ
import requests
from PIL import Image
from io import BytesIO
r = requests.get('์ด๋ฏธ์ง url ์ฃผ์')
i = Image.open(BytesIO(r.content))
print(type(i))
i.save("./ํ์ผ๋ช
.jpg")
Python
๋ณต์ฌ
์ ์ฅํ ์ด๋ฏธ์ง ์ด์ด๋ณด๊ธฐ
from PIL import Image
img = Image.open(fileanme)
img.show()
Python
๋ณต์ฌ
BeautifulSoup
HTML, XML (๋งํฌ์
๋ฌธ์) โ์น ํ์ด์ง ์ฝ๋โ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ธฐ ์ํ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
HTML, XML ํ์ผ์ ๋ด์ฉ์ ์ฝ์ด๋๋ ค์ ๋ณํ์ ํด์ผํ๋ค.
ํ์ฑ (Parsing)
: ํน์ ๋ฌธ๋ฒ ๋๋ ํ์์ ๋ง๊ฒ ๊ตฌ๋ฌธ์ ํด์ํ๊ณ ๋ถ์ํ๋ ๋๊ตฌ๋ฅผ ์ด์ฉํ์ฌ ๋ณํํ๋ ๊ณผ์
HTML ํ์ฑ ๊ณผ์
1.
BeautifulSoup ๋ชจ๋ import
2.
BeautifulSoup ๊ฐ์ฒด ์์ฑ
a.
์ธ์1 : HTML
b.
์ธ์2 : parser ๊ฐ์ฒด
3.
HTML ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , BeautifulSoup ํตํด ์ ๊ทผ ๊ฐ๋ฅ
BeautifulSoup ๋ชจ๋ import
from bs4 import BeautifulSoup
Python
๋ณต์ฌ
2.
BeautifulSoup ๊ฐ์ฒด ์์ฑ
a.
์ธ์1 : HTML
b.
์ธ์2 : parser ๊ฐ์ฒด
bs = BeautifulSoup( html, 'html.parser' )
Python
๋ณต์ฌ
3.
HTML ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , BeautifulSoup ํตํด ์ ๊ทผ ๊ฐ๋ฅ
ํ๊ทธ ์ ๊ทผ
bs.ํ๊ทธ๋ช
Python
๋ณต์ฌ
โข
์์
โฆ
bs.div
โฆ
bs.h1
โฆ
bs.p
ํ๊ทธ๋ช ์ถ์ถ
bs.ํ๊ทธ๋ช
.name
Python
๋ณต์ฌ
ํ๊ทธ ์์ฑ ์ถ์ถ
bs.ํ๊ทธ๋ช
['์์ฑ๋ช
']
bs.ํ๊ทธ๋ช
.attrs
Python
๋ณต์ฌ
ํ๊ทธ ์ปจํ ์ธ ์ถ์ถ
bs.ํ๊ทธ๋ช
.string
bs.ํ๊ทธ๋ช
.text
bs.ํ๊ทธ๋ช
.contents
bs.ํ๊ทธ๋ช
.get_text()
Python
๋ณต์ฌ
๋ถ๋ชจ ํ๊ทธ
bs.ํ๊ทธ๋ช
.parent
Python
๋ณต์ฌ
์์ ํ๊ทธ
bs.ํ๊ทธ๋ช
.children
Python
๋ณต์ฌ
ํ์ ํ๊ทธ
bs.ํ๊ทธ๋ช
.next_sibling
bs.ํ๊ทธ๋ช
.next_siblings
bs.ํ๊ทธ๋ช
.previous_sibling
bs.ํ๊ทธ๋ช
.previous_siblings
Python
๋ณต์ฌ
์์ ํ๊ทธ
bs.ํ๊ทธ๋ช
.descendants
Python
๋ณต์ฌ
์น ์คํฌ๋ํ ์ค์ต
โข
BeautifulSoup ๋ชจ๋ import ํ๊ณ , ๊ฐ์ฒด ์์ฑํ๊ธฐ
โข
ํ๊ทธ, ํ๊ทธ๋ช
, ์์ฑ๊ฐ ์ ๊ทผํ๊ธฐ
์ํ์ ๋ชฉ ๊ฐ์ ธ์ค๊ธฐ
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
# ํฐ๋ฏธ๋ >
# pip install requests
# pip install beautifulsoup4
# pip install lxml
import requests
from bs4 import BeautifulSoup
# ํน์ ์ฌ์ดํธ์ html ๊ฐ์ ธ์ค๊ธฐ
url = "https://movie.naver.com/movie/bi/mi/basic.naver?code=74977"
html = requests.get(url)
# print(html)
# html ๋ถ์
soup = BeautifulSoup(html.text, 'lxml')
# ์ํ ์ ๋ชฉ
h3 = soup.find('h3', class_='h_movie')
a = h3.find('a')
text = a.get_text()
# print(h3)
# print(a)
print(text)
Python
๋ณต์ฌ
๋ด์ค ๊ธฐ์ฌ ๊ฐ์ ธ์ค๊ธฐ
# ์น ํฌ๋กค๋ง
# pip install requests
# pip install beautifulsoup4
# pip install lxml
# import : ๋ชจ๋, ํจํค์ง๋ฅผ ํฌํจํ๋ ํค์๋
import requests
from bs4 import BeautifulSoup
# 'User-Agent' ํค๋ ์ถ๊ฐ (์ฌ์ฉ์ ์ ๋ณด)
# http://m.avalon.co.kr/check.html <- ์ฌ๊ธฐ์ ๋ณต์ฌ
headers = {
'User-Agent' : ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'),
}
url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=105"
html = requests.get(url, headers=headers)
print(html)
# html ๋ถ์
soup = BeautifulSoup(html.text, 'lxml')
# # ์ ํ์๋ก ์ง์ ํด์ ํ๊ทธ ๊ฐ์ ธ์ค๊ธฐ
newsList = soup.select('.sh_item')
# ๋ด์ค ์ ๋ชฉ
# ๊ธฐ์ฌ๋ด์ฉ
# ์ ๋ฌธ์ฌ
# --------------
# ์ ๋ชฉ (์ ๋ฌธ์ฌ)
# : ๊ธฐ์ฌ๋ด์ฉ
# --------------
for news in newsList:
title = news.select('.sh_text_headline')[0].get_text()
company = news.select('.sh_text_press')[0].get_text()
content = news.select('.sh_text_lede')[0].get_text()
print('----------------------------')
print('{} ({})'.format(title, company))
print(' : {}'.format(content))
print('----------------------------')
# ์์ ํ์์ผ๋ก ์ถ๋ ฅํด๋ณด์ธ์...
# print(news)
Python
๋ณต์ฌ