Selenium
Selenium ์ด๋?
์๊ฒฉ์ผ๋ก ํน์ ์นํ์ด์ง์ ๋ฒํผ ํด๋ฆญ, ์
๋ ฅ์์์์ ์๋ฃ ์
๋ ฅ ๋ฑ์ผ๋ก ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ๋ฑ์ ๋ค์ํ ์น ํ์ด์ง์ ์ฌ์ฉ์ ๊ฐ์ ์ํธ์์ฉ์ ๋์ ์ผ ๋ก ์ ์ดํ๋ ๊ธฐ์ ๋๋ ํ๋ก๊ทธ๋จ
์ฉ๋ : ๋์ ์นํ์ด์ง ์๋ฃ ์์ง(์ํ ๋ฆฌ๋ทฐ), ๊ตฌ๊ธ ์ด๋ฏธ์ง ์์ง(์ ์ฐจ)
๋์ ํ์ด์ง vs ์ ์ ํ์ด์ง
1) ์ ์ ํ์ด์ง
- ์ด๋ฏธ ์ค๋น๋์ด ์๋ ์น๋ฌธ์๋ฅผ ์ฌ์ฉ์(client)์๊ฒ ์ ๊ณต
- ์ธ์ ์ ์ํด๋ ๋์ผํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ์น์ฌ์ดํธ
- BeautifulSoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์น๋ฌธ์ ์์ง
2) ๋์ ํ์ด์ง
- ์ฌ์ฉ์(client)์ ์์ฒญ์ ๋ฐ์ ์์ ์์ ์น๋ฌธ์๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๊ณต
- ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ์น์ฌ์ดํธ
- Selenium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์น๋ฌธ์ ๋ฐ ์ด๋ฏธ์ง ์์ง
ex) google ์ด๋ฏธ์ง, SNS(Instagram, Youtube, Facebook) ์๋ฃ ์์ง
Selenium ์ค์น
(base) conda activate tensorflow
(tensorflow) pip install selenium
Web Driver
Selenium ์ง์๋ฅผ ๋ฐ์ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํ์ฌ ๋์ ํ์ด์ง ์ ์ดํ๋ ํ๋ก๊ทธ๋จ
ํฌ๋กฌ ๋๋ผ์ด๋ฒ ๋ค์ด๋ก๋(chromedriver.exe)
๋จ๊ณ1: ์ฌ์ฉ์ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฒ์ ํ์ธ
๋จ๊ณ2: ํฌ๋กฌ ๋๋ผ์ด๋ฒ ๋ค์ด๋ก๋ https://chromedriver.chromium.org/downloads
์๋ฆฌ๋จผํธ(element)
์น๋ฌธ์๋ฅผ ์์ฑํ๋ ํ๊ทธ(tag)
ํ์) <์์ํ๊ทธ ์์ฑ> ๋ด์ฉ </์ข
๋ฃํ๊ทธ>
์) <a href=โhttp://www.naver.comโ class=โa_linkโ> ๋ค์ด๋ฒ </a>
Selenium Crawling
์๋ฆฌ๋จผํธ ์์ง Selenium ํจ์
find_element_by_class_name('class์ด๋ฆ') # class ์์ฑ์ ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ
find_element_by_id('id์ด๋ฆ') # id ์์ฑ์ ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ
find_element_by_name('name์ด๋ฆ') # name ์์ฑ์ ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ
find_element_by_tag_name('tag์ด๋ฆ') # tag ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ
find_element_by_link_text('text') # a ํ๊ทธ์ ํ
์ค๋ก ์ฐพ๊ธฐ
find_element_by_css_selector('css_selector') # ์ ํ์๋ก ์ฐพ๊ธฐ(. or #)
find_element_by_xpath('xpath') # tag ์ ๋๊ฒฝ๋ก or ์๋๊ฒฝ๋ก ์ฐพ๊ธฐ
1) ๋ฒํผ ํด๋ฆญํ๊ธฐ ์
browser.get("https://naver.com") # url ์ด๋
elem = browser.find_element_by_class_name("link_login") # ๋ฒํผ element
elem.click() # ๋ฒํผ์ ๋๋ฆ
browser.back() # ํ์ด์ง ๋ค๋ก ์ด๋
browser.forward() # ํ์ด์ง ์์ผ๋ก ์ด๋
browser.refresh() # ํ์ด์ง ์๋ก๊ณ ์นจ(F5)
2) ๊ฒ์์ด ์
๋ ฅ ๋ฐ ๊ฒฐ๊ณผ ๊ฒ์ ์
1. ๋์ url
driver.get("https://www.google.com/") # ๊ตฌ๊ธ ํ์ด์ง ์ด๋
2. name ์์ฑ์ผ๋ก element ๊ฐ์ ธ์ค๊ธฐ
elem = driver.find_element_by_name("q") # 1๊ฐ element ์์ง
3. ๊ฒ์์ด ์
๋ ฅ -> ์ํฐ
elem.send_keys("์
๋ ๋ฆฌ์ ํฌ๋กค๋ง") elem.send_keys(Keys.ENTER) # ๊ฒ์๊ฒฐ๊ณผ ํ์ด์ง ์ด๋
3) Selenium์ด์ฉ ์
๋ฝ ์ด๋ฏธ์ง ์์ง
1. Google ์ด๋ฏธ์ง ๊ฒ์ ํ์ด์ง ์ ์
# ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์์ฑ Driver = webdriver.Chrome() #google ์ด๋ฏธ์ง๊ฒ์ url ์ ์ driver.get("https://www.google.co.kr/imghp?h1=ko&tab=wi&ogb1")
2. Google ๊ฒ์์ด ์
๋ ฅ์์ ์ฐพ๊ธฐ & ๊ฒ์์ด ์
๋ ฅ๊ณผ ์ฐพ๊ธฐ ๋ฒํผ ํด๋ฆญ
# ๊ฒ์์ด ์
๋ ฅ์์ : name์์ฑ element ์ฐพ๊ธฐ elem = driver.find_element_by_name("q") # ๊ฒ์์ด ์
๋ ฅ ๋ฐ ์ํฐ elem.send_keys('ํ์ ์ฐ') # ๊ฒ์์ด ์
๋ ฅ elem.send_keys(Keys.RETURN) # ์ํฐํค๋๋ฆ
3. ์์ ์ด๋ฏธ์ง ์ ์ฒด element ์์ง
# class์ด๋ฆ์ผ๋ก element ์ฐพ๊ธฐ images = driver.find_elements_by_class_name("rg_i.Q4LuWd")
4. ์์ ์ด๋ฏธ์ง ํด๋ฆญ -> ํฐ ์ด๋ฏธ์ง save
# ์์ ์ด๋ฏธ์ง ํด๋ฆญ -> ํฐ ์ด๋ฏธ์ง save for image in images : image.click() # ์์ ์ด๋ฏธ์ง ํด๋ฆญ -> ํฐ ์ด๋ฏธ์ง ๋ํ๋จ # ํฐ ์ด๋ฏธ์ง url ํ๋ : copy full Xpath ๋จ์ถ ๋ฉ๋ด ์ด์ฉ imageUrl = driver.find_element_by_xpath("/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div/a/img").get_attribute("src") # ํ์ฌ ํด๋์์น์ image ์ ์ฅ urlretrieve(imageUrl, 'image'+str(cnt)+".jpg")
button click
1. naver page ์ด๋
2. login ๋ฒํผ ํด๋ฆญ
3. ํ๋ฉด ์ ํ
from selenium import webdriver #module import time #ํ๋ฉด ์ผ์ ์ ์ง
1. driver ๊ฐ์ฒด ์์ฑ
path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe') dir(driver)
'find_element', : 1๊ฐ element ์์ง
'find_elements', : n๊ฐ element ์์ง
'get' : ํน์ url ์ด๋
'forward' : ํ์ด์ง ์์ผ๋ก ์ด๋
'back' : ํ์ด์ง ๋ค๋ก ์ด๋
2. ๋์ url ์ด๋
driver.get('https://www.naver.com/') #url ์ด๋
3. ๋ก๊ทธ์ธ ๋ฒํผ element ๊ฐ์ ธ์ค๊ธฐ
copy element : <a href="https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com" class="link_login" data-clk="log_off.login"><i class="ico_naver"><span class="blind">๋ค์ด๋ฒ</span></i>๋ก๊ทธ์ธ</a>
1) class name์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ
login_ele = driver.find_element_by_class_name("link_login")
login_ele.click() # ๋ฒํผ ํด๋ฆญ
time.sleep(2) # 2์ด ์ผ์ ์ค์ง
2) xpath๋ก ๊ฐ์ ธ์ค๊ธฐ
copy xpath : ์๋๊ฒฝ๋ก - //*[@id="account"]/a
copy full xpath : ์ ๋๊ฒฝ๋ก - /html/body/div[2]/div[3]/div[3]/div/div[2]/a
์๋๊ฒฝ๋ก : ์ง์ ์์ํ๊ทธ/ํ์ฌํ๊ทธ ๊ฒฝ๋ก
์ ๋๊ฒฝ๋ก : ์์ํ๊ทธ๋ถํฐ ํ์ฌ ํ๊ทธ ๊ฒฝ๋ก
login_ele2 = driver.find_element_by_xpath('//*[@id="account"]/a') login_ele2.click() #๋ฒํผ ํด๋ฆญ time.sleep(2) #2์ด ์ผ์ ์ค์ง driver.back() #ํ์ฌํ์ด์ง -> ์ด์ ์ผ๋ก time.sleep(2) #2์ด ์ผ์ ์ค์ง driver.forward() #์ด์ -> ์์ผ๋ก driver.refresh() #ํ์ด์ง ์๋ก๊ณ ์นจ(F5) time.sleep(2) #2์ด ์ผ์ ์ค์ง driver.close() #ํ์ฌ ์ฐฝ ๋ซ๊ธฐ
text input
์
๋ ฅ์์ -> ๊ฒ์์ด ์
๋ ฅ -> [๊ฒ์ ํ์ด์ง ์ด๋] -> element ์์ง
from selenium import webdriver #driver ์์ฑ from selenium.webdriver.common.keys import Keys #์ํฐํค ์ญํ
def keyword_search(keyword) : # 1. driver ๊ฐ์ฒด ์์ฑ path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe') # 2. ๋์ url ์ด๋ driver.get('https://www.google.com/') # url ์ด๋ # 3. ๊ฒ์์ด ์
๋ ฅ์์ : name ์์ฑ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ''' <input class="gLFyf gsfi" maxlength="2048" name="q" type="text" aria-autocomplete="both" aria-haspopup="false" autocapitalize="off" autocomplete="off" autocorrect="off" autofocus="" role="combobox" spellcheck="false" title="๊ฒ์" value="" aria-label="๊ฒ์" data-ved="0ahUKEwiJqbLLxuf0AhU4slYBHXMEBNQQ39UDCAY"> ''' input_ele = driver.find_element_by_name('q') # 1๊ฐ element # 4. ๊ฒ์์ด ์
๋ ฅ -> ์ํฐ input_ele.send_keys(keyword) input_ele.send_keys(Keys.ENTER) # ์ํฐํค ๋๋ฆ -> ๊ฒ์ ํ์ด์ง ์ด๋ # 5. ๊ฒ์ ํ์ด์ง element ์์ง : tag ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ a_elems = driver.find_elements_by_tag_name('a') # n๊ฐ element ์์ง : list๋ฐํ # 6. element ์์ฑ(href) ์์ง : url urls = [] # url ์ ์ฅ for a in a_elems : url = a.get_attribute("href") # href ์์ฑ ๊ฐ ์ถ์ถ urls.append(url) # 7. element ๋ด์ฉ ์์ง conts = [] for a in a_elems : conts.append(a.text) driver.close() # ์ฐฝ ๋ซ๊ธฐ return urls, conts
keyword = input('๊ฒ์์ด ์
๋ ฅ : ') urls, conts = keyword_search(keyword) print(urls) print(conts)
text input
์
๋ ฅ์์ -> ๊ฒ์์ด ์
๋ ฅ -> [๊ฒ์ ํ์ด์ง ์ด๋] -> element ์์ง
from selenium import webdriver #driver ์์ฑ from selenium.webdriver.common.keys import Keys #์ํฐํค ์ญํ
def keyword_search(keyword) : #1. driver ๊ฐ์ฒด ์์ฑ path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe') #2. ๋์ url ์ด๋ driver.get('https://www.google.com/') #url ์ด๋ #3. ๊ฒ์์ด ์
๋ ฅ์์ : name ์์ฑ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ''' <input class="gLFyf gsfi" maxlength="2048" name="q" type="text" aria-autocomplete="both" aria-haspopup="false" autocapitalize="off" autocomplete="off" autocorrect="off" autofocus="" role="combobox" spellcheck="false" title="๊ฒ์" value="" aria-label="๊ฒ์" data-ved="0ahUKEwiJqbLLxuf0AhU4slYBHXMEBNQQ39UDCAY"> ''' input_ele = driver.find_element_by_name('q') #1๊ฐ element #4. ๊ฒ์์ด ์
๋ ฅ -> ์ํฐ input_ele.send_keys(keyword) input_ele.send_keys(Keys.ENTER) #์ํฐํค ๋๋ฆ -> ๊ฒ์ ํ์ด์ง ์ด๋ #5. ๊ฒ์ ํ์ด์ง element ์์ง : tag ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ a_elems = driver.find_elements_by_tag_name('a') #n๊ฐ element ์์ง : list๋ฐํ #6. element ์์ฑ(href) ์์ง : url urls = [] #url ์ ์ฅ for a in a_elems : url = a.get_attribute("href") #href ์์ฑ ๊ฐ ์ถ์ถ urls.append(url) #7. element ๋ด์ฉ ์์ง conts = [] for a in a_elems : conts.append(a.text) driver.close() #์ฐฝ ๋ซ๊ธฐ return urls, conts
keyword = input('๊ฒ์์ด ์
๋ ฅ : ') urls, conts = keyword_search(keyword) print(urls) print(conts)
movie review crawling
naver ์ํ review ํ
์คํธ ์์ง
find_element_by : 1๊ฐ element ์์ง
find_elements_by : n๊ฐ element ์์ง - list ๋ฐํ
from selenium import webdriver #module import time #ํ๋ฉด ์ผ์ ์ ์ง
1. driver ๊ฐ์ฒด ์์ฑ
path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe')
2. ๋์ url ์ด๋
driver.get('https://movie.naver.com/') #naver ์ํ ๊ฒ์ url ์ด๋
3. [ํ์ .๋ฆฌ๋ทฐ] ๋งํฌ ํด๋ฆญ : ์ ๋๊ฒฝ๋ก ์ด์ฉ 1๊ฐ element ๊ฐ์ ธ์ค๊ธฐ
<a href="/movie/point/af/list.naver" title="ํ์ ยท๋ฆฌ๋ทฐ" class="menu07"><strong>ํ์ ยท๋ฆฌ๋ทฐ</strong></a>
a_ele = driver.find_element_by_xpath('/html/body/div/div[3]/div/div[1]/div/div/ul/li[4]/a') a_ele.click() #a tag ํด๋ฆญ -> ํ์ด์ง ์ด๋ print(driver.current_url) #ํ์ฌ ํ์ด์ง url ์ถ๋ ฅ
https://movie.naver.com/movie/point/af/list.naver -> base url
https://movie.naver.com/movie/point/af/list.naver?&page=1 -> query : base?&page={n}
https://movie.naver.com/movie/point/af/list.naver?&page=2
https://movie.naver.com/movie/point/af/list.naver?&page=3
4. ์ํ์ ๋ชฉ, ํ์ , ๋ฆฌ๋ทฐ ์์ง : 1page(10๊ฐ)
title_txt = [] #์ํ์ ๋ชฉ ์ ์ฅ star_txt = [] #ํ์ ์ ์ฅ cont_txt = [] #๋ฆฌ๋ทฐ ์ ์ฅ for n in range(1, 21) : #20page ์์ง url = f"https://movie.naver.com/movie/point/af/list.naver?&page={n}" driver.get(url) #page ๋ฒํธ ์ด๋ time.sleep(1) #1์ด ์ผ์ ์ ์ง #1) ์ํ์ ๋ชฉ ์ ์ฅ : copy xpath ''' //*[@id="old_content"]/table/tbody/tr[1]/td[2]/a[1] - 1๋ฒ //*[@id="old_content"]/table/tbody/tr[2]/td[2]/a[1] - 2๋ฒ //*[@id="old_content"]/table/tbody/tr[10]/td[2]/a[1] - 10๋ฒ //*[@id="old_content"]/table/tbody/tr/td[2]/a[1] - ์ํ์ ๋ชฉ ํจํด ''' titles = driver.find_elements_by_xpath('//*[@id="old_content"]/table/tbody/tr/td[2]/a[1]') for title in titles : title_txt.append(title.text) print(title_txt) #2) ํ์ ์ ์ฅ ''' //*[@id="old_content"]/table/tbody/tr[1]/td[2]/div/em //*[@id="old_content"]/table/tbody/tr[2]/td[2]/div/em //*[@id="old_content"]/table/tbody/tr/td[2]/div/em - ํ์ ํจํด ''' stars = driver.find_elements_by_xpath('//*[@id="old_content"]/table/tbody/tr/td[2]/div/em') for star in stars : star_txt.append(star.text) print(star_txt) #3) ๋ฆฌ๋ทฐ ์ ์ฅ ''' //*[@id="old_content"]/table/tbody/tr[1]/td[2] //*[@id="old_content"]/table/tbody/tr[2]/td[2] //*[@id="old_content"]/table/tbody/tr[3]/td[2] //*[@id="old_content"]/table/tbody/tr/td[2] - ๋ฆฌ๋ทฐ ํจํด ''' conts = driver.find_elements_by_xpath('//*[@id="old_content"]/table/tbody/tr/td[2]') for cont in conts : #print(cont.text) # ํ์ element ๋ชจ๋ text ์ถ๋ ฅ ''' ์คํ์ด๋๋งจ: ๋
ธ ์จ์ด ํ : ์ ๋ชฉ[0] ๋ณ์ - ์ด 10์ ์ค : ๋ณ์ [1] 10 : ํ์ [2] ์ค๊ตญ๋ฌธํ์ ์ ๋ฌผ, ๊ฒ์ดBL๋ฌผ๋ก ์ง์ณ๊ฐ๋ ๋ง๋ธํฌ์๊ฒ ๋๋์ด ์ฌํ์์์ ์ฑ๊ณต ์ ๊ณ : ๋ฆฌ๋ทฐ[3] ''' txt_token = str(cont.text).split('\n') review = txt_token[3] cont_txt.append(review[:-3]) #'์ ๊ณ ' ์ ์ธ print(cont_txt) print('์ ๋ชฉ ๊ฐ์ :', len(title_txt)) #10 -> 200 print('ํ์ ๊ฐ์ :', len(star_txt)) #10 -> 200 print('๋ฆฌ๋ทฐ ๊ฐ์ :', len(cont_txt)) #10 -> 200 driver.close() #์ฐฝ ๋ซ๊ธฐ
5. file save
1) DataFrame
import pandas as pd df = pd.DataFrame({'title':title_txt,'star':star_txt, 'review':cont_txt}, columns=['title','star','review'])
2) csv file save
df.to_csv('movie_review.csv', index=False) print('file saved...')
3) csv file read
movie_review = pd.read_csv('movie_review.csv') movie_review.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 title 200 non-null object
1 star 200 non-null int64
2 review 189 non-null object
movie_review.head() movie_review.tail()
celeb image crawling
์
๋ฝ ์ด๋ฏธ์ง ์์ง
Selenium + BeautifulSoup
(base) conda activate tensorflow
(tensorflow) pip install beautifulsoup4
from selenium import webdriver #๋์ ํ์ด์ง ์ ์ด from bs4 import BeautifulSoup #์ ์ ํ์ด์ง ์ฒ๋ฆฌ from urllib.request import urlretrieve #server image -> local file save import numpy as np #์ค๋ณต image url ์ ๊ฑฐ import os #ํด๋ ๊ด๋ฆฌ(๊ฒฝ๋ก, ์์ฑ, ์ด๋)
def celeb_img_crawler(name) : #1. driver ๊ฐ์ฒด ์์ฑ path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe') #2. ์ด๋ฏธ์ง ๊ฒ์ url ์ด๋ driver.get('https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl') #3. ๊ฒ์์ด ์
๋ ฅ์์ : name์์ฑ ๊ฐ์ ธ์ค๊ธฐ search_box = driver.find_element_by_name("q") search_box.send_keys(name) # ๊ฒ์์ด ์
๋ ฅ #4. [์ฐพ๊ธฐ] ๋ฒํผ ํด๋ฆญ : copy xpath : //*[@id="sbtc"]/button search_btn = driver.find_element_by_xpath('//*[@id="sbtc"]/button') search_btn.click() #๋ฒํผ ํด๋ฆญ driver.implicitly_wait(3) #3์ด ๋๊ธฐ(์์ loading) #5. ์ด๋ฏธ์ง ํฌํจํ๋ div ํ๊ทธ ์์ง -> image ํ๊ทธ ์์ง #1) ์ด๋ฏธ์ง ํฌํจํ๋ div ํ๊ทธ ์์ง image_url = [] for i in range(50) : #0 ~ 49 src = driver.page_source #ํ์ฌ ํ์ด์ง ์์ค ์์ง html = BeautifulSoup(src, 'html.parser') #html ํ์ฑ div_img = html.select_one(f'div[data-ri="{i}"]') #'tag[์์ฑ="๊ฐ"]' #2) image ํ๊ทธ ์์ง img_tag = div_img.select_one('img[class="rg_i Q4LuWd"]') #img element try : #img tag -> src ์์ฑ ๊ฐ ์ถ์ถ -> list ์ ์ฅ image_url.append(img_tag.attrs['src']) print(str(i+1) + '๋ฒ์งธ image url ์ถ์ถ') except : print(str(i+1) + '๋ฒ์งธ image url ์์') #6. ์ค๋ณต image url ์ ๊ฑฐ print(len(image_url)) # 28 image_url = np.unique(image_url) print(len(image_url)) # 28 #7. image ์ ์ฅ ํด๋(dir) ์์ฑ & ์ด๋ pwd = os.getcwd() #C:\ITWILL\5_Tensorflow\workspace\chap06_Selenium_Crawling\lecture/name os.mkdir(name) #ํ์ฌ ์์น์ ํด๋ ์์ฑ(์
๋ฝ์ด๋ฆ) os.chdir(pwd +'/'+ name) #ํด๋ ์ด๋ #8. image_url -> file save for i in range(len(image_url)) : #0 ~ 27 try : file_name = "test"+ str(i+1)+".jpg" #test1.jpg ~ test50.jpg urlretrieve(image_url[i], file_name) #file save print(str(i+1) + '๋ฒ์งธ image ์ ์ฅ') except : print('ํด๋น url์ image ์์ :', image_url[i]) os.chdir(pwd) #์ฒ์ ์์น ์ด๋(๋ค์ ์
๋ฝ ์ ์ฅ) driver.close() #์ฐฝ ๋ซ๊ธฐ
ํจ์ ํธ์ถ test
ex) celeb_img_crawler("์ฐจ์ธํ")
์ฌ๋ฌ๋ช
์
๋ฝ ์ด๋ฏธ์ง ์์ง
nameList = ["์ฌ์์ค", "์กํ๊ต", "๊ฐ๋์"] #48, 36, 32 for name in nameList : celeb_img_crawler(name) #3ํ ํธ์ถ
celeb image crawling scrolling
์
๋ฝ ์ด๋ฏธ์ง ์์ง
Selenium + BeautifulSoup
(base) conda activate tensorflow
(tensorflow) pip install beautifulsoup4
from selenium import webdriver #๋์ ํ์ด์ง ์ ์ด from bs4 import BeautifulSoup #์ ์ ํ์ด์ง ์ฒ๋ฆฌ from urllib.request import urlretrieve #server image -> local file save import numpy as np #์ค๋ณต image url ์ ๊ฑฐ import os #ํด๋ ๊ด๋ฆฌ(๊ฒฝ๋ก, ์์ฑ, ์ด๋)
def celeb_img_crawler(name) : #1. driver ๊ฐ์ฒด ์์ฑ path = r"C:\ITWILL\5_Tensorflow\workspace" driver = webdriver.Chrome(path + '/chromedriver.exe') #2. ์ด๋ฏธ์ง ๊ฒ์ url ์ด๋ driver.get('https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl') #3. ๊ฒ์์ด ์
๋ ฅ์์ : name์์ฑ ๊ฐ์ ธ์ค๊ธฐ search_box = driver.find_element_by_name("q") search_box.send_keys(name) # ๊ฒ์์ด ์
๋ ฅ #4. [์ฐพ๊ธฐ] ๋ฒํผ ํด๋ฆญ : copy xpath : //*[@id="sbtc"]/button search_btn = driver.find_element_by_xpath('//*[@id="sbtc"]/button') search_btn.click() #๋ฒํผ ํด๋ฆญ driver.implicitly_wait(3) #3์ด ๋๊ธฐ(์์ loading) # ------------ ์คํฌ๋กค๋ฐ ๋ด๋ฆฌ๊ธฐ ------------------------------------------------------ last_height = driver.execute_script("return document.body.scrollHeight") #ํ์ฌ ์คํฌ๋กค ๋์ด ๊ณ์ฐ while True: # ๋ฌดํ๋ฐ๋ณต # ๋ธ๋ผ์ฐ์ ๋๊น์ง ์คํฌ๋กค๋ฐ ๋ด๋ฆฌ๊ธฐ driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 2์ด ๋๊ธฐ - ํ๋ฉด ์คํฌ๋กค ํ์ธ # ํ๋ฉด ๊ฐฑ์ ๋ ํ๋ฉด์ ์คํฌ๋กค ๋์ด ๊ณ์ฐ new_height = driver.execute_script("return document.body.scrollHeight") # ์๋ก ๊ณ์ฐํ ์คํฌ๋กค ๋์ด์ ๊ฐ์ผ๋ฉด stop if new_height == last_height: try: # [๊ฒฐ๊ณผ ๋๋ณด๊ธฐ] : ์๋ ๊ฒฝ์ฐ ์์ - ์์ธ์ฒ๋ฆฌ driver.find_element_by_class_name("mye4qd").click() # class์ด๋ฆ์ผ๋ก element์ฐพ๊ธฐ #driver.find_element_by_css_selector(".mye4qd").click() # ์ ํ์(.class์ด๋ฆ) except: break last_height = new_height # ์๋ก ๊ณ์ฐํ ์คํฌ๋กค ๋์ด๋ก ๋์ฒด #------------------------------------------------------------------------- #5. ์ด๋ฏธ์ง ํฌํจํ๋ div ํ๊ทธ ์์ง -> image ํ๊ทธ ์์ง #1) ์ด๋ฏธ์ง ํฌํจํ๋ div ํ๊ทธ ์์ง image_url = [] for i in range(50) : #0 ~ 49 src = driver.page_source #ํ์ฌ ํ์ด์ง ์์ค ์์ง html = BeautifulSoup(src, 'html.parser') #html ํ์ฑ div_img = html.select_one(f'div[data-ri="{i}"]') #'tag[์์ฑ="๊ฐ"]' #2) image ํ๊ทธ ์์ง img_tag = div_img.select_one('img[class="rg_i Q4LuWd"]') #img element try : #img tag -> src ์์ฑ ๊ฐ ์ถ์ถ -> list ์ ์ฅ image_url.append(img_tag.attrs['src']) print(str(i+1) + '๋ฒ์งธ image url ์ถ์ถ') except : print(str(i+1) + '๋ฒ์งธ image url ์์') #6. ์ค๋ณต image url ์ ๊ฑฐ print(len(image_url)) # 28 image_url = np.unique(image_url) print(len(image_url)) # 28 #7. image ์ ์ฅ ํด๋(dir) ์์ฑ & ์ด๋ pwd = os.getcwd() #C:\ITWILL\5_Tensorflow\workspace\chap06_Selenium_Crawling\lecture/name os.mkdir(name) #ํ์ฌ ์์น์ ํด๋ ์์ฑ(์
๋ฝ์ด๋ฆ) os.chdir(pwd +'/'+ name) #ํด๋ ์ด๋ #8. image_url -> file save for i in range(len(image_url)) : #0 ~ 27 try : file_name = "test"+ str(i+1)+".jpg" #test1.jpg ~ test50.jpg urlretrieve(image_url[i], file_name) #file save print(str(i+1) + '๋ฒ์งธ image ์ ์ฅ') except : print('ํด๋น url์ image ์์ :', image_url[i]) os.chdir(pwd) #์ฒ์ ์์น ์ด๋(๋ค์ ์
๋ฝ ์ ์ฅ) driver.close() #์ฐฝ ๋ซ๊ธฐ

ํจ์ ํธ์ถ test
ex) celeb_img_crawler("์ฐจ์ธํ")
์ฌ๋ฌ๋ช
์
๋ฝ ์ด๋ฏธ์ง ์์ง
nameList = ["์ฌ์์ค", "์กํ๊ต", "๊ฐ๋์"] #48, 48, 48 for name in nameList : celeb_img_crawler(name) #3ํ ํธ์ถ
'๋ฐ์ดํฐ๋ถ์๊ฐ ๊ณผ์ > Tensorflow' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DAY71. Tensorflow Face detection (2) (0) | 2021.12.30 |
---|---|
DAY70. Tensorflow Face detection (1)face landmark (0) | 2021.12.29 |
DAY68. Tensorflow CNN model (2)ImageGenerator (0) | 2021.12.27 |
DAY67. Tensorflow CNN model (0) | 2021.12.24 |
DAY66. Tensorflow Keras model (2)Overfitting solution (0) | 2021.12.23 |