파이썬/웹 크롤링

[웹 크롤링] 페이지 다운과 이미지 크롤링

취준생코린이 2021. 6. 4. 12:46
728x90

 

 

페이지 다운을 이용해서 유튜브에서 영상의 제목, 조회수 크롤링

from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bs
import pandas as pd
import time

# 1. 크롬 드라이버를 실행해서 유튜브 화면 실행
driver = wb.Chrome()
url="https://www.youtube.com/results?search_query=%EC%82%AC%EB%82%98%EA%B3%A0"
driver.get(url)
반응형

페이지 다운

  • Keys.PAGE_DOWN
  • 컴퓨터가 페이지 스크롤을 내릴수있게 해준다.

아래는 유튜브의 영상 제목과 영상 길이를 크롤링 해봤다.

# 컴퓨터가 페이지 다운하는 기능
body = driver.find_element_by_tag_name("body")
# 50번 페이지 다운
for i in range(1,50):
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.5)
    
# 2. 영상의 제목만 크롤링
soup = bs(driver.page_source, 'lxml')
title = soup.select("a#video-title")

titleList=[]
for i in range(len(title)):
    titleList.append(title[i].text.strip())
    
for i in titleList:
    print(i)
    
    
# 3. 영상의 길이를 확인, 순수한 텍스트까지 출력
lens = soup.select("div#overlays > ytd-thumbnail-overlay-time-status-renderer > span.style-scope")

lensList=[]
for i in range(len(lens)):
    lensList.append(lens[i].text.strip())

for i in lensList:
    print(i)

 

이제 영상의 조회수를 크롤링해보자.

여기서는 동일이름의 자식을 크롤링할때 어떻게 구분하는지 배울꺼다.

# 4. 영상의 조회수
soup.select("div#metadata  span")

 

위에서는 자식 태그가 똑같아서 조회수 말고 날짜도 나온다
우리는 자식 태그중 첫번째 자식만 가져올거다. -> nth-child(1) 사용

# 조회수 크롤링
soup.select("div#metadata  span:nth-child(1)")

# 날짜 크롤링
soup.select("#metadata-line > span:nth-child(2)")

조회수

 

날짜

 


 

이미지 크롤링

 

네이버사이트에서 고양이 사진을 크롤링해서 저장하는 걸 배워볼거다.

 

먼저 이미지를 저장해줄 폴더를 만들어 주자.

import os # 파일 시스템을 위한 라이브러리 ex) 파일, 폴더를 생성 삭제
from urllib.request import urlretrieve # 이미지의 경로를 파일로 저장

# 사진을 저장해줄 폴더를 만들어 주자
# 폴더생성
# 폴더의 존재유무 파악 (같은이름의 폴더는 만들수 없으므로)
# os : 파일의 경로를 찾아줌
# 만약 C:/Users/SM2119/Desktop/에 이미지라는 폴더가 없다면 폴더를 만들어라
if not os.path.isdir("C:/Users/SM2119/Desktop/이미지") :
    print('폴더 생성 완료')
    os.mkdir("C:/Users/SM2119/Desktop/이미지")
else:
    print("이미 동일한 이름의 폴더가 있습니다")

 

이미지는 텍스트랑 다르게 가져오려면 src속성값을 가져와야한다.

driver = wb.Chrome()
url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=image&query=%EA%B3%A0%EC%96%91%EC%9D%B4&oquery=%EA%B0%95%EC%95%84%EC%A7%80&tqi=h7EdVlp0J1sssg6TcBhssssst%2BK-502111"
driver.get(url)

soup = bs(driver.page_source, 'lxml')
img = soup.select("img._listImage")
# 안에있는 속성값만 접근하고 싶으면 대괄호[]를 이용하면 된다.
img[0]["src"]

 

 

src속성값을 가져와서 리스트에 저장

imgSrc = []

for i in img:
    imgSrc.append(i["src"])
    
len(imgSrc)

 

이제 저장한 경로를 이용해서 아까 만들어놓은 이미지 폴더에 이미지를 저장하자.

urlretrieve : 

  • URL로 표시된 네트워크 객체(URL 주소의 문서)를 로컬 파일로 저장
  • 즉, 직접 다운로드가 가능하다
from tqdm import tqdm_notebook as tq

# urlretrieve : URL로 표시된 네트워크 객체(URL 주소의 문서)를 로컬 파일로 저장, 즉 직접 다운로드가 가능하다

# 파일의 이름 생성
fileNo = 0
for i in tq(range(len(imgSrc))):
    urlretrieve(imgSrc[i], "C:/Users/SM2119/Desktop/이미지/"+str(fileNo)+".jpg")
    fileNo += 1
    time.sleep(1)

이미지 폴더에 저장된 이미지

 

 

728x90