96. ํ์ด๋ ํ๋ก์ ํธ (2)์์ฑ ํผ๋์ ํฌ๋กค๋ฌ ๋ง๋ค๊ธฐ
0. ํจํค์ง ์ํฌํธ
import os
import pandas as pd
from selenium import webdriver #module
from selenium.webdriver.common.keys import Keys #enter key
from selenium.webdriver.common.action_chains import ActionChains
import time #ํ๋ฉด ์ผ์ ์ ์ง
1. ๊ฒ์ํ ์ํ๋ช
์
๋ ฅํ๊ธฐ
query_txt = input('์ํ๋ช
:')
2. driver ๊ฐ์ฒด ์์ฑ
path = r"๊ฒฝ๋ก๋ช
"
driver = webdriver.Chrome(path + '/chromedriver.exe')
3. ์์ฑ ํผ๋์ url ์ด๋
driver.get('https://pedia.watcha.com/ko-KR')
4. ์ํ๋ช ๊ฒ์ > ์ํฐํค
time.sleep(1)
textbox = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/header/nav/div/div/ul/li[5]/div/div/form/label/input')
textbox.click()
element = driver.find_element_by_name("searchKeyword")
element.send_keys(query_txt + "\n")
์๋ฌ ๋ฐ์
driver.find_element_by_name('searchKeyword').send_keys("์ ๊ณผํจ๊ป")
textbox.send_keys(Keys.ENTER)
[์๋ฌ] 'NoneType' object has no attribute 'send_keys'
[ํด๊ฒฐ] https://stackoverflow.com/questions/58355552/how-to-combat-the-attributeerror-nonetype-object-has-no-attribute-send-keys
5. ๋ฆฌ๋ทฐํ์ด์ง ์ ์
ํน์ ์์น ํด๋ฆญ
time.sleep(2)
blank_click = driver.find_element_by_xpath('/html/body/div/div/div[1]/section/section/div[1]/div')
blank_click.click()
์ํ ํด๋ฆญ
movie_click = driver.find_element_by_xpath('/html/body/div/div/div[1]/section/section/div[3]/div[1]/section/section[1]/div/div[1]/div/ul/li[1]/a/div[1]/div[1]/img')
movie_click.click()
์คํฌ๋กค ๋ด๋ฆฌ๊ธฐ
time.sleep(2)
driver.execute_script("window.scrollTo(0, 1000)")
#ํ๊ณ์ ๋ฐ๊ฒฌ -> ๋์ด๋ ์ ๋์ ์ธ ๊ฒ์ด ์๋๋ผ ์๋์ . ๋ชจ๋ํฐ ํด์๋ ๋ฐ๋ผ ์ซ์ ์กฐ์ ํ ํ์๊ฐ ์์
๋๋ณด๊ธฐ ํด๋ฆญ
more_view = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/section/div/div[2]/div/div/div/div[1]/div[1]/div/div/section[5]/div[1]/div/header/div/div/a')
more_view.click()
๊ฐฑ์ ๋๋ ํ์ด์ง ์คํฌ๋กค ๋๊น์ง ๋ด๋ฆฌ๊ธฐ
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
#๋๊น์ง ์คํฌ๋กค ๋ด๋ฆฌ๊ธฐ
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#๋๊ธฐ
time.sleep(1)
#์คํฌ๋กค ๋ด๋ฆฐ ํ ์คํฌ๋กค ๋์ด ๋ค์ ๊ฐ์ ธ์ด
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
time.sleep(5)
6. ๋ฐ์ดํฐ ์์ง
๋ฐ์ดํฐํ๋ ์ ์์ฑ
data = pd.DataFrame(data=[], columns=['movie_title', 'writer_name','star_grade'])
๋ฐ์ดํฐ ์์ง ํจ์ ์์ฑ
def get_movie_reviews(driver, data, k):
movie_title = query_txt
writer_name = driver.find_elements_by_css_selector('.css-1agoci2')
star_grade = driver.find_elements_by_css_selector('.css-yqs4xl')
for i in range(k):
tmp = []
tmp.append(movie_title)
tmp.append(writer_name[i].text)
tmp.append(star_grade[i].text)
tmp = pd.DataFrame(data=[tmp], columns=data.columns)
data = pd.concat([data,tmp])
print(movie_title + " ๋ฆฌ๋ทฐ ์์ง ์๋ฃ")
return data
[์๋ฌ] ๋ฆฌ๋ทฐ์ด๋ช ๊ณผ ๋ณ์ ์ด html์ฝ๋๊ฐ ๊ทธ๋๋ก ๊ธํ ๋์จ๋ค.
[ํด๊ฒฐ] css_selector ๊ด๋ จ ๊ฒ์๋ฌผ๋ค ์ฝ๊ณ , for๋ฌธ๊ณผ selector ์์ ํด์ ํด๊ฒฐ
๋ฐ์ดํฐ ์์ง ํจ์ ์คํ (๋ฆฌ๋ทฐ 20๊ฐ ์์ง)
review = get_movie_reviews(driver, data, 21)
star_grade์ '๋ณด๊ณ ์ถ์ด์'๋ ์ญ์
review = review[~review['star_grade'].str.contains("๋ณด๊ณ ์ถ์ด์", na=False, case=False)]
ํ์ ํ๊ท ์ป์ด์ ์๋ก์ด ์ด์ ์ถ๊ฐ (์์์ ๋๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ)
review['star_grade'] = pd.to_numeric(review['star_grade'], downcast='float') #์ซ์ํ ๋ณํ
review = review.append({'movie_title' : query_txt, 'writer_name' : 'ํ๊ท ', 'star_grade' : review['star_grade'].mean()}, ignore_index=True)
review = review.round(2)
print(review)
๋ฐ์ดํฐ ๋์ ์ ์ฅ
review.to_csv('๊ฒฝ๋ก\ํ์ผ๋ช
.csv', sep=',', na_rep='NaN', encoding='utf-8-sig', mode='a', header=False, index=True)
#mode='a' : ๋์ ์ ์ฅ, seperator : ๊ตฌ๋ถ์, na_rep : ๊ฒฐ์ธก๊ฐ ํ๊ธฐ, encoding : ๋ฌธ์ ๊นจ์ง ๋ฐฉ์ง, header=False : ์นผ๋ผ์ ๋ชฉ ํ๊ธฐX
print(query_txt + " ๋ฆฌ๋ทฐ ์ ์ฅ ์๋ฃ")
ํฌ๋กค๋ฌ ์คํ ์์
์์ฌ์ด์ & ๋ ์์ ํด์ผํ ์
1. ์ํ๋ช ์ด ์๋ฒฝํ๊ฒ ์ผ์นํ์ง ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ๋ก ๋ ธ์ถ๋์ง ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ์ํ๊ฐ ํด๋ฆญ๋ ์ํ์ฑ์ด ์์ (ex. ๋ง์คํฐ, ๋ฒ์ฃ๋์2, ๋ ํน)
2. ๋ณ์ ์ด ์๋ '๋ณด๊ณ ์ถ์ด์'๊ฐ ์กด์ฌ. ๊ฒฐ์ธก์น๋ก ๋ฐ๊พธ์ด์ฃผ๋ ์์ ์ด ํ์ํ์ -> ๊ตฌํ ์๋ฃ
3. ๋น๊ณต๊ฐ, ์ญ์ ๋ฑ์ ์ด์ ๋ก ๋ณ์ ์ด ํ์๋์ง ์๋ ๋ฆฌ๋ทฐ๊ฐ ์์ฑ๋๋ฉด ์๋์ผ๋ก ์์ง ๋ฆฌ๋ทฐ ๊ฐ์๋ฅผ ์์ ํด์ฃผ์ด์ผ ํ์
4. input์ ์ํ ์ด๋ฆ์ ํ๋ํ๋ ์ ๋ ฅ๋ฐ์์ผ ํ๋ ๊ฒ ๋ฒ๊ฑฐ๋ก์