Today I Learned

멜론 차트 / 네이버 이미지 주소 스크래핑

개발자 김혜린 2021. 10. 9. 00:51

-request는 단순히 그냥 get 방식으로 요청하고, 돌아온 결과로 이런 저런 활동을 하지만

"셀레니움"은 브라우저를 직접 작동시키는 것(브라우저 제어 프로그램)

 

-크롤링(웹스크래핑!) 복습하기

크롤링이란, 자동화하여 주기적으로 웹 상에서 페이지들을 돌아다니며 분류/색인하고 업데이트된 부분을 찾는 등의 일을 하는 것이고

 

우리가 하는 것은 웹 스크래핑!

 

-프로젝트03 설정 착착착...

멜론 차트 스크래핑 하는 코드!

import requests
from bs4 import BeautifulSoup

url = "https://www.melon.com/chart/day/index.htm"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url, headers=headers)

req = data.text
soup = BeautifulSoup(req, 'html.parser')

songs = soup.select("#frm > div > table > tbody > tr")
print(len(songs))

for song in songs:
    title = song.select_one("td > div > div.wrap_song_info > div.rank01 > span > a").text
    artist = song.select_one("td > div > div.wrap_song_info > div.rank02 > span > a").text
    likes = song.select_one("td > div > button.like > span.cnt").text
    print(title, artist, likes)

그런데 좋아요 수가 잘 안나온다... request로는 안되나보다

셀레니움을 써보자!


HTML이 로드되고 나서, Ajax로 정보 가져와서 페이지를 바꾸는 것을 동적인 웹페이지!  (좋아요 수도 그러함) 

동적인 웹페이지를 스크래핑할 때는 브라우저를 띄운 뒤에 소스코드를 가져와야 한다.

셀레니움으로 해보자

from bs4 import BeautifulSoup
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome('./chromedriver')  # 드라이버를 실행합니다.


url = "https://www.melon.com/chart/day/index.htm"
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# data = requests.get(url, headers=headers)

driver.get(url)  # 크롬 드라이버에 해당 url의 웹페이지를 띄웁니다.
sleep(5)  # 페이지가 로딩되는 동안 5초 간 기다립니다. 

req = driver.page_source  # html 정보를 가져옵니다.
driver.quit()  # 정보를 가져왔으므로 드라이버는 꺼줍니다.

# soup = BeautifulSoup(data.text, 'html.parser')
soup = BeautifulSoup(req, 'html.parser')  # 가져온 정보를 beautifulsoup으로 파싱해줍니다.

songs = soup.select("#frm > div > table > tbody > tr")
print(len(songs))

for song in songs:
    title = song.select_one("td > div > div.wrap_song_info > div.rank01 > span > a").text
    artist = song.select_one("td > div > div.wrap_song_info > div.rank02 > span > a").text
    likes_tag = song.select_one("td > div > button.like > span.cnt")
    likes_tag.span.decompose()  # span 태그 붙은 것 없애기
    likes = likes_tag.text.strip()  # 텍스트화한 후 앞뒤로 빈 칸 지우기
    print(title, artist, likes)

 

네이버에.. 이미지들이 뜬 곳에.......

웹 스크래핑을 하는 것..........

from bs4 import BeautifulSoup
from selenium import webdriver
from time import sleep


driver = webdriver.Chrome('./chromedriver')

url = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query=%EC%95%84%EC%9D%B4%EC%9C%A0"
driver.get(url)
sleep(10)
driver.execute_script("window.scrollTo(0, 1000)")  # 1000픽셀만큼 내리기
sleep(1)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#쌍따옴표 안에 적은 명령을 크롬 브라우저가 실행해줘!
#내가 보는 창(윈도우)에서 스크롤해줘 (x좌표,y좌표) and (내가 보는 문서의 높이만큼)
sleep(10)


req = driver.page_source
driver.quit()

soup = BeautifulSoup(req, 'html.parser')
images = soup.select(".tile_item._item ._image._listImage")
print(len(images))

for image in images:
    src = image["src"]
    print(src)