개인용 복습공간

[Python] 파이썬으로 유튜브 크롤링 - 3 본문

Python

[Python] 파이썬으로 유튜브 크롤링 - 3

taehwanis 2021. 6. 2. 02:44

 

 

 

text 크롤링을 위해 스크롤바를 내리는
코드를 작성하여 DB에 넣어보려고 한다.

 

 

 

 

 

저번에 이용한 테이블을 수정하여 Column을 추가한다.

testEX 테이블

 

 

 

 

 

유튜브에서 롤로 입력했을 때 유튜버의 이름, 채널 url을 가져와보려고 한다.
그리고 간단하게 스크롤바를 내리는 동작을 하는 코드를 작성했다.

crawl_data.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import selenium
from selenium import webdriver
from time import sleep
import time 
import pymysql
 
# 웹 드라이버 초기화
driver = webdriver.Chrome(executable_path='chromedriver')
driver.implicitly_wait(5)
 
conn = pymysql.connect(host="localhost",
                     user="root1234",
                     passwd="1234",
                     db="crawl_data",
                     charset="utf8")
curs=conn.cursor(pymysql.cursors.DictCursor)
 
#채널url가져오는 함수
def get_channel_url():
    name, url = [], []
    idx1 = 1
    start_url = "https://www.youtube.com/results?search_query=%EB%A1%A4&sp=CAMSBAgEEAE%253D"
    driver.get(start_url)
 
    while True:
        try:
            path='/html/body/ytd-app/div/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/div/ytd-section-list-renderer/div[2]/ytd-item-section-renderer[1]/div[3]/ytd-video-renderer[' + str(idx1) + ']/div[1]/div/div[2]'
            YouTuber = driver.find_element_by_xpath(path)
            name.append(YouTuber.text)
            YouTuber_url = driver.find_element_by_xpath(path+'/a')
            url.append(YouTuber_url.get_attribute('href'))
 
            # 한 페이지에 약 10개 불러오는 데, 동영상 목록을 추가 불러오기 위해 스크롤 내림
            if idx1 % 10 == 0 :
                driver.execute_script('window.scrollBy(0, 4320);')
                time.sleep(1)
                
            idx1 +=1
 
        except Exception as e:
                    print()
                    print(e)
                    break
 
    driver.close()
    return name, url
 
name_list, url_list = get_channel_url()
for i in range(0,len(name_list)):
    print("<"+name_list[i] +", " + url_list[i]+">")
 
for i in range(0len(name_list)):
    sql = """insert ignore into testEx(url, name) values (%s, %s)""" 
    curs.execute(sql, (url_list[i], name_list[i]))
    conn.commit()
 
conn.close()
 
 
cs

 

스크롤을 내려주지 않으면 유튜브가 동영상을 불러오지 않아 내려주는 작업이 필요한 것 같고 xpath가
동영상 20개마다 달라지므로 20개 정도만 다뤄보았다. 생각보다 중복되는 유튜버들이 많아서 db에는
20개보다 적은 수가 insert 되었다.

 

 

 

 

실행 후 TERMINAL 

 

실행 후 DB

유튜버 채널 url과 이름을 잘 가져온다.
셀레니움이라 느릴 줄 알았는데 생각보다 빨라서 만족스럽다.

Comments