์น์คํฌ๋ํ,,,, ๊ทธ๊ฒ์ ์ ๊ธฐํ๊ณ ๋ ์ฌ๋ฐ๊ณ ๋ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํ ๊ทธ๊ฒ,,,,
ํ๋ฒ Request, BeutifulSoup, Selenium ๋ชจ๋ ์์๋ณด๊ฒ ๋ค.
HTTP๋ HTML ๋ฌธ์์ ๊ฐ์ ๋ฆฌ์์ค๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ ๋๋ค. HTTP๋ ์น์์ ์ด๋ฃจ์ด์ง๋ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตํ์ ๊ธฐ์ด์ด๋ฉฐ, ํด๋ผ์ด์ธํธ-์๋ฒ ํ๋กํ ์ฝ์ด๊ธฐ๋ ํฉ๋๋ค.
๋ด PC์ ์น์๋ฒ๊ฐ์ ํต์ . ๋ฐ์ดํฐ๋ฅผ ๋ฌ๋ผ๊ณ ํ๊ฑฐ๋(request) ์ฃผ๊ฑฐ๋(response) ํ ๋ ์ํตํ๋ ์ธ์ด.
์ฐ๋ฆฌ๊ฐ ํฌ๋กค๋ง์ ํ ๋ ์ด ์ธ์ด๋ก ์น์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌ๋ผ๊ณ ์๊ตฌํ๋ ๊ฑฐ๋ค.
์ฐธ๊ณ ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ ๋๋ GET, ๋ฐ์ดํฐ๋ฅผ ์ค๋๋ POST
HTML (Hypertext Markup Language,ํ์ดํผํ ์คํธ ๋งํฌ์ ์ธ์ด)๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์๋๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ์นํ์ด์ง๊ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋์ด ์๋์ง ๋ธ๋ผ์ฐ์ ๋ก ํ์ฌ๊ธ ์ ์ ์๋๋ก ํ๋ ๋งํฌ์ ์ธ์ด์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์น์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ๋ฉด ์น์๋ฒ๋ HTML๋ก ์ฐ์ฌ์ง ์์ค์ฝ๋๋ฅผ ์ค๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ด ์ฝ๋๋ฅผ ํด์ํด์ ์ฐ๋ฆฌ๊ฐ ํญ์ ๋ณด๋ ์นํ์ด์ง ํํ๋ก ๋์ด์ค๋ค.
๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํฌ๋กค๋ง์ ํ๋ ค๋ฉด ์น์๋ฒํํ ๋ฆฌํ์คํธ๋ฅผ ์ค์ html๋ก ์ด๋ฃจ์ด์ง ์์ค์ฝ๋๋ฅผ ๋ฐ๊ณ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ถ๋ถ์ ์ถ์ถํด์ผํ๋ค.
import requests
url = 'https://naver.com'
response = requests.get(url)
response.text
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ.
url = 'https://search.naver.com/search.naver'
params = {
'where':'image',
'sm':'tab_jum',
'query':'youtube'
}
response = requests.get(url, params=params)
htmml = response.content
ํ๋ผ๋ฏธํฐ๋ค์ ๋์ ๋๋ฆฌ๋ก ๋๊ฒจ์ค ์ ์๋ค. ๋์ ๋๋ฆฌ๋ก ๋๊ฒจ์ฃผ๋ฉด url์ param๋ค์ ์์์ ์ ์ ๋ฆฌํด ๋ง๋ค์ด์ค๋ค.
https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%95%84%EC%9D%B4%ED%8F%B0
์์ url์ ์ด๋ ๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก text์ content์ ์ฐจ์ด์ ์ text๋ ์ ๋์ฝ๋๋ฅผ ์ฝ์ด๋ค์ด๊ณ content๋ ๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ค๊ณ ํ๋ค.
๋ฑ ํ
์คํธ๋ง ํ์ํ๋ค -> text
์ด๋ฏธ์ง๋ ์๊ณ ์ฌ๋ฌ๊ฐ์ง ๋ค ์ฝ๊ณ ์ถ๋ค -> content
html์ฝ๋๋ฅผ ์ข ๋ ์์๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค. (์ด๊ฑธ soup์ด๋ผ๊ณ ํ๋ค)
soup์์ ์ํ๋ ๋ถ๋ถ์ ์ถ์ถํ ์ ์๋ค. select, select_one์ ์ด์ฉํ๋ค.
import requests
from bs4 import BeautifulSoup as bs
soup = BeautifulSoup(html)
soup.select('.photo_group._listGrid')
url = 'https://search.naver.com/search.naver'
params = {
'where' : 'news',
'sm' : 'tab_jum',
'query' : '์์ดํฐ'
}
response = requests.get(url, params = params)
response.url
soup = BeautifulSoup(response.content)
elements = soup.select('.news_area')
news_list = []
for element in elements:
news = element.select_one('.news_tit')
print(news)
news_data ={
'title' : news['title'],
'link' : news['href']
}
news_list.append(news_data)
import pandas as pd
pd.DataFrame(news_list)
๋ค์ด๋ฒ ๊ธฐ์ฌ 10๊ฐ ์ฝ์ด์ ๊ฐ ๊ธฐ์ฌ์ title, link ๋์ ๋๋ฆฌ ์์ฑ ํ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค.
select๋ list๋ฅผ ๋ฐํํ๋ค. ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ ๋ฐํ
select_one์ ์กฐ๊ฑด๋ง์กฑํ๋ ์ฒซ๋ฒ์งธ ๊ฐ์ฒด๋ง ๋ฐํ
์๋ํ ๋๊ตฌ์ด๋ค. ์น์์ ์ฐ๋ฆฌ๊ฐ ํ๋ ํ๋๋ค์ ์๋ํํ ์ ์๋ค.
๋ฒํผ์ ๋๋ฅด๊ณ ์์ด๋ ๋น๋ฒ ์
๋ ฅํ๊ณ ์ด๋ฐ ํ๋๋ค์ด๋ค.
from selenium import webdriver
driver = webdriver.Chrome('./chromedriver')
driver.get('https://www.naver.com')
driver.find_element_by_xpath('//*[@id="account"]/a').click()
driver.find_element_by_xpath('//*[@id="id"]').send_keys('123')
driver.find_element_by_xpath('//*[@id="pw"]').send_keys('123')
driver.find_element_by_xpath('//*[@id="log.login"]').click()
driver.close()
๋ค์ด๋ฒ ๋ก๊ทธ์ธ ํ๋ ๊ณผ์ ์ด๋ค.
send_keys
๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ, click
๋ง๊ทธ๋๋ก ํด๋ฆญ time.sleep(1)
1์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ
url = 'https://color.adobe.com/ko/search?q=warm'
response = requests.get(url)
soup = BeautifulSoup(response.content)
soup
driver = webdriver.Chrome('./chromedriver')
driver.get('https://color.adobe.com/ko/search?q=warm')
driver.find_element_by_xpath('//*[@id="react-spectrum-8"]/div/div[3]').click()
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
a = soup.select('div.Theme__theme___2NcED')
a[3]
์ ๋ ๋์์ผ๋ก ํ์ ์ฐฝ x๋ฒํผ ๋๋ฅด๊ณ , ์ด๋ html์์ค์ฝ๋๋ฅผ bs๋ก ํ์ฑ