휴... 꾸역꾸역 여기까지 왔다. ㅠㅠ 와웃... 결국, 이게 거의 결정판인데, 아쉽게도 페이지가 업데이트돼서 제대로 실습을 못했다. 하지만, 이제 웹상에 있는 다른 크롤 예제들을 봐도, 이해하고 사용할 수 있겠다.
주로 표형태를 추출, 재가공(db 저장포함) 하고 싶으니, 다른 예제들로 더 공부해가야겠다.
나도코딩님 리스펙~~~~~~~~~~~~~~~~~~~~~~~~~~~~
후기 : 하루이틀이면 끝날 줄 알았는데, 실습하는데 하루 3-4시간씩 약 일주일 걸렸다. 흑.
삽질
2020 강의라서, 2022 년엔 ui가 태블릿 친화적으로 바껴버렸다. 빨리 했어야해.. 흑
1독 (포인트만 기록하며, 가급적 끊지 않고 보기)
보면서, 따라치면서 하니 ... 진도도 안나가고, 너무 힘들었다 ㅠ 먼저 1회 시청을 똑바로!
무비1 : requests 와 bs 만으로 시도
- requets 로 먼저 시도
- movies = soup.find_all로 추출 후, len(movies) 찍어보니, 0 이다. 왜?
- 텍스트로 확인해보기 : prettify() 사용 -->영어페이지로 출력-->headers 에 language 넣어주기
무비2 : 셀레니움으로 스크롤 반복하기
- 셀레니움으로 javascript -> 스크롤 실행
browser.execute_script("window.scrollTo(0, 1080)") - 화면 가장 아래로 스크롤 : "window.scrollTo(0, document.body.scrollHeight)"
- while True: 로 스크롤 반복 ( prev_height와 curr_height 는 스크롤 하기 전/후 높이 )
if curr_height == prev_height:
break:
prev_height = curr_height
3. headless 크롬 사용하기 + 스크린캡처
browser.get_screenshot_as_file("google_movie.png")
헤드리스크롬 옵션
options = webdriver.ChromeOptions()
options.headless = Trueoptions.add_argument(윈도우 사이즈 지정)
options.add_argument(유저 에이전트) # 안넣어주면, headless 크롬으로 인식돼서, 차단 가능성.
4. user-agent 옵션 추가
생각해보니, browser.get(url)에서 특정 요소의 텍스트만 추출( User-Agent 정보) 해서 변수값으로 사용하는 것이 재미있었다. google스프레드시트 impot_html 같은건가보다. import_html 을 실시간 반영안시키는 이유가 크롤로 인한 문제이겠거니 생각은 했었는데.. 그러네.
3. 영화1
import requests
from bs4 import BeautifulSoup
url = "https://play.google.com/store/movies/top"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
"Accept-Language":"ko-KR,ko"
}
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
movies = soup.find_all("div", attrs={"class":"ImZGtf mpg5gc"})
print(len(movies))
# with open("movie.html", "w", encoding="utf8") as f:
# #f.write(res.text)
# f.write(soup.prettify()) # html 문서를 예쁘게 출력
for movie in movies:a
title = movie.find("div", attrs={"class":"WsMG1c nnK0zc"}).get_text()
print(title)
4. 영화2
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()
# 페이지 이동
url = "https://play.google.com/store/movies/top"
browser.get(url)
# 지정한 위치로 스크롤 내리기
# 모니터(해상도) 높이인 1080 위치로 스크롤 내리기
#browser.execute_script("window.scrollTo(0, 1080)") # 1920 x 1080
#browser.execute_script("window.scrollTo(0, 2080)")
# 화면 가장 아래로 스크롤 내리기
# browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
import time
interval = 2 # 2초에 한번씩 스크롤 내림
# 현재 문서 높이를 가져와서 저장
prev_height = browser.execute_script("return document.body.scrollHeight")
# 반복 수행
while True:
# 스크롤을 가장 아래로 내림
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 페이지 로딩 대기
time.sleep(interval)
# 현재 문서 높이를 가져와서 저장
curr_height = browser.execute_script("return document.body.scrollHeight")
if curr_height == prev_height:
break
prev_height = curr_height
print("스크롤 완료")
import requests
from bs4 import BeautifulSoup
soup = BeautifulSoup(browser.page_source, "lxml")
#movies = soup.find_all("div", attrs={"class":["ImZGtf mpg5gc", "Vpfmgd"]})
movies = soup.find_all("div", attrs={"class":"Vpfmgd"})
print(len(movies))
for movie in movies:
title = movie.find("div", attrs={"class":"WsMG1c nnK0zc"}).get_text()
# 할인 전 가격
original_price = movie.find("span", attrs={"class":"SUZt4c djCuy"})
if original_price:
original_price = original_price.get_text()
else:
#print(title, " <할인되지 않은 영화 제외>")
continue
# 할인된 가격
price = movie.find("span", attrs={"class":"VfPpfd ZdBevf i5DZme"}).get_text()
# 링크
link = movie.find("a", attrs={"class":"JC71ub"})["href"]
# 올바른 링크 : https://play.google.com + link
print(f"제목 : {title}")
print(f"할인 전 금액 : {original_price}")
print(f"할인 후 금액 : {price}")
print("링크 : ", "https://play.google.com" + link)
print("-" * 100)
browser.quit()
구글무비3 : 헤드리스 + 화면 캡처
from selenium import webdriver
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument("window-size=1920x1080")
browser = webdriver.Chrome(options=options)
browser.maximize_window()
# 페이지 이동
url = "https://play.google.com/store/movies/top"
browser.get(url)
import time
interval = 2 # 2초에 한번씩 스크롤 내림
# 현재 문서 높이를 가져와서 저장
prev_height = browser.execute_script("return document.body.scrollHeight")
# 반복 수행
while True:
# 스크롤을 가장 아래로 내림
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 페이지 로딩 대기
time.sleep(interval)
# 현재 문서 높이를 가져와서 저장
curr_height = browser.execute_script("return document.body.scrollHeight")
if curr_height == prev_height:
break
prev_height = curr_height
print("스크롤 완료")
browser.get_screenshot_as_file("google_movie.png")
import requests
from bs4 import BeautifulSoup
soup = BeautifulSoup(browser.page_source, "lxml")
#movies = soup.find_all("div", attrs={"class":["ImZGtf mpg5gc", "Vpfmgd"]})
movies = soup.find_all("div", attrs={"class":"Vpfmgd"})
print(len(movies))
for movie in movies:
title = movie.find("div", attrs={"class":"WsMG1c nnK0zc"}).get_text()
# 할인 전 가격
original_price = movie.find("span", attrs={"class":"SUZt4c djCuy"})
if original_price:
original_price = original_price.get_text()
else:
#print(title, " <할인되지 않은 영화 제외>")
continue
# 할인된 가격
price = movie.find("span", attrs={"class":"VfPpfd ZdBevf i5DZme"}).get_text()
# 링크
link = movie.find("a", attrs={"class":"JC71ub"})["href"]
# 올바른 링크 : https://play.google.com + link
print(f"제목 : {title}")
print(f"할인 전 금액 : {original_price}")
print(f"할인 후 금액 : {price}")
print("링크 : ", "https://play.google.com" + link)
print("-" * 100)
browser.quit()
구글무비4 : 헤드리스 옵션s User-Agent 위장
from selenium import webdriver
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument("window-size=1920x1080")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36")
browser = webdriver.Chrome(options=options)
browser.maximize_window()
url = "https://www.whatismybrowser.com/detect/what-is-my-user-agent"
browser.get(url)
# Mozilla/5.0 (Windows NT 10.0; Win64; x64)
# AppleWebKit/537.36 (KHTML, like Gecko)
# Chrome/84.0.4147.89 Safari/537.36
detected_value = browser.find_element_by_id("detected_value")
print(detected_value.text)
browser.quit()
댓글