Python 웹 크롤링하기 PART1을 못 보신 분은 아래 링크를 통해 순서대로 진행해 주세요
Python 웹 크롤링 하기 PART 1
Python으로 웹 크롤링하는 방법에 대해 살펴보겠습니다. 예제로 유튜브 크롤링을 진행하려고 합니다. 진짜 크롤링이라기에는 부족하고 단편적인 코드입니다. 진짜 누구에게나 크롤러라고 할 수
lcs1245.tistory.com
지난 포스팅에서 우리는 Selenium을 통해
HTML 태그에 접근하여 텍스트를 입력하거나 클릭하는 법을 알았고
더불어 자바스크립트를 실행하는 방법에 대해 살펴보았습니다.
유튜브 콘텐츠 제목, 채널명, URL 출력하기
이제 크롤링하기 위해 필요한 기능에 대해서는 거의 준비가 되었습니다.
PART 2에서 살펴본 기능을 토대로 유튜브 콘텐츠의 제목, 채널명, Url을 확인해 보겠습니다.
items = driver.find_elements(By.TAG_NAME, 'ytd-video-renderer');
for item in items:
title = item.find_element(By.ID, 'video-title').get_attribute('title');
url = item.find_element(By.ID, 'video-title').get_attribute('href');
channelName = item.find_element(By.CSS_SELECTOR, '#channel-name a.yt-simple-endpoint').get_attribute('innerHTML');
print(channelName);
print(title);
print(url);
비디오 태그들을 가져온 다음 돌면서 제목, URL, 채널명에 대한 정보를 가져와 출력했습니다.
코드에대한 자세한 설명은 PART 2에 있기에 생략하겠습니다.
크롤링한 결과물을 엑셀로 만들기
위 정보를 pandas 모듈을 통해 엑셀(csv) 파일로 만들어 보겠습니다.
import pandas as pd
df = pd.DataFrame(columns=['index', 'title', 'channelName', 'url']);
items = driver.find_elements(By.TAG_NAME, 'ytd-video-renderer');
for item in items:
title = item.find_element(By.ID, 'video-title').get_attribute('title');
url = item.find_element(By.ID, 'video-title').get_attribute('href');
channelName = item.find_element(By.CSS_SELECTOR, '#channel-name a.yt-simple-endpoint').get_attribute('innerHTML');
index = items.index(item);
df = df.append({
'index': index,
'channelName': channelName
'title': title,
'url': url
}, ignore_index=True);
filename = 'youtube_Crawled.csv';
df.to_csv(filename, encoding='utf-8-sig', index=False)
driver.stop_client();
driver.close();
driver.quit();
위 코드를 보시면 변수 df에 데이터 프레임 객체를 만듭니다.
데이터 프레임 객체에 가져온 채널명, 제목, URL 정보를 넣어줍니다.
최종적으로 데이터를 CSV 파일로 내려받습니다.
그 뒤 브라우저를 닫고 종료합니다.
현재 WORKSPACE에 파일이 생성된 것을 확인할 수 있습니다.
아래 최종 모든코드를 보여드리며 포스팅을 마치겠습니다.
( 모듈 추가코드는 모두 상단으로 옮겼습니다. )
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import pandas as pd
from selenium.webdriver.common.by import By
import time
# Chrome Browser의 Option 설정
options = Options();
options.add_argument('--no-sandbox');
options.add_argument('--incognito');
options.add_argument('--window-size=1920,1980');
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options);
driver.get('https://www.youtube.com');
search = driver.find_element(By.ID, 'search');
search.send_keys('하나님의교회');
btnSearch = driver.find_element(By.ID, 'search-icon-legacy');
btnSearch.click();
scroll_Cnt = 1;
while (scroll_Cnt > 0):
scroll_Cnt = scroll_Cnt - 1;
print('페이지 스크롤 다운이 ' + str(scroll_Cnt) + '번 남았습니다.');
# scroll to bottom
driver.execute_script('window.scrollTo(0, document.getElementById("content").scrollHeight);')
time.sleep(3);
df = pd.DataFrame(columns=['index', 'title', 'channelName', 'url']);
items = driver.find_elements(By.TAG_NAME, 'ytd-video-renderer');
for item in items:
title = item.find_element(By.ID, 'video-title').get_attribute('title');
url = item.find_element(By.ID, 'video-title').get_attribute('href');
channelName = item.find_element(By.CSS_SELECTOR, '#channel-name a.yt-simple-endpoint').get_attribute('innerHTML');
index = items.index(item);
df = df.append({
'index': index,
'channelName': channelName,
'title': title,
'url': url
}, ignore_index=True);
filename = 'youtube_Crawled.csv';
df.to_csv(filename, encoding='utf-8-sig', index=False);
driver.stop_client();
driver.close();
driver.quit();