티스토리 뷰

본 포스팅은 제가 한 내용을 복기하는 것과 혹여나 저와 같은 에러를 발견하신 분들을 위해 작성했습니다

오늘은 데이터베이스에 데이터를 매분마다 자동으로 적재하기를 해보겠습니다. 

전체 프로세스
1. 아프리카티비에서 데이터 가져오기
2. 리눅스에서 파일 실행(디비 적재)
3. 크론탭 설정


전체코드 

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# coding: utf-8
# afreeca.py
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import pymysql as sql
from sqlalchemy import create_engine
import pandas.io.sql as pSql
from selenium import webdriver as wd
import os
import time
from selenium.webdriver.chrome.options import Options
 
 
######################## 브라우저 가동 (리눅스용)##########################
# 리눅스가 아마존 서버에서 돌아가기 때문에 디비는 로컬이 아니라 반드시 아마존 디비여야한다
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")
 
 
# 아프리카티비 시청자수 크롤링하기
class ExchangeDataCrawler:
        # 멤버변수
        AFREECA_DOMAIN   = 'http://afreecatv.com/' 
        DB_CONNECTION_TEST_URL = 'mysql+pymysql://root:12341234@localhost:3306/game'
        DB_CONNECTION_REAL_URL = 'mysql+pymysql://root:12341234@pythondb.cqejth9odmnz.ap-northeast-2.rds.amazonaws.com:3306/game'
        DB_CONNECTION_USE_URL  = ''
 
        def __init__(self, flag=None):
                if flag: # 상용 : aws에서 데이터 적재
                        self.DB_CONNECTION_USE_URL = self.DB_CONNECTION_REAL_URL
                else:    # 개발용 : local DB에서 데이터 적재
                        self.DB_CONNECTION_USE_URL = self.DB_CONNECTION_TEST_URL
 
        def gethtmlChunk(self):
                # 아프리카 접속 excutable_path 절대경로로 지정하자! 
                self.driver = wd.Chrome( executable_path='/home/ubuntu/sch/data/chromedriver', chrome_options=chrome_options )
                self.driver.get( 'http://afreecatv.com/?hash=game' )
                time.sleep(2)
                viewer = self.driver.find_elements_by_css_selector('span.viewer')
                viewer_list = [v.text for v in viewer]
                self.driver.save_screenshot('./data/afreeca_01.png')
                return viewer_list
        
        def crawling(self):
                viewer_list = self.gethtmlChunk()
                df = pd.DataFrame( viewer_list )
                # 디비에 넣을 데이터 df의 컬럼명과 디비 컬럼이 동일해야한다
                df.columns = ['viewer']
                self.insertCrawlingData(df) # DB에 수집한 데이터를 입력
                self.driver.close()
                self.driver.quit()
 
 
        def insertCrawlingData(self, df):
                # DB 오픈
                engine = create_engine(self.DB_CONNECTION_USE_URL, encoding='utf8')
                conn = engine.connect()
                # 시청자 정보입력 
                df.to_sql( name='afreeca', con=conn, if_exists='append', index=False)
                # 닫기
                conn.close()
 
 
if __name__ == '__main__':
        obj = ExchangeDataCrawler('aws')
        obj.crawling()
        # 객체 해제
        del obj
        # 프로세스 종료
        import sys
        print'프로세스 종료 :) ')
        sys.exit()
 
cs





찬찬히 살펴봅시다. 데이터는 아프리카 TV에서 간단하게 긁어보겠습니다.



                         




아프리카TV의 게임탭 화면입니다. 여기서 첫 페이지에 보이는 bj들의 시청자 수만 긁어왔습니다. 
(데이터를 전부 크롤링하는게 목적이 아니므로 간단하게만 긁었습니다)
이 페이지의 검사를 눌러서 보면 



분명 다음과 같이 span 태그의 class viewer밑에 시청자수가 보입니다. 그래서 BeautifulSoup으로 해당 태그를 가져왔으나 계속해서 시청자수가 보이지 않는 일이 발생했습니다. 이유는 아래와 같습니다. viewer의 em태그를 보시면 {{=it.SUBJECT}} 명 시청 . 이렇게 숫자가 없는게 보입니다. 해당 웹페이지가 라이브 방송이라 그런건지모르겠지만 여튼, 개발자가 이렇게 만들었기때문에 BeautifulSoup으로는 긁어지지 않습니다. 따라서 셀레니움을 사용해서 가져옵니다.







제가 이 작업을 하면서 계속 애를 먹었던 부분입니다. 
첫째, 리눅스에서 웹드라이버를 쓸 때 executable_path는 절대경로로 지정해줍시다. 상대경로로 하니 못찾더군요. 
데이터를 모두 모았으면 디비에 적재해야겠죠. 둘째, 제 리눅스는 아마존 서버이기때문에 디비도 아마존서버에서 받아온 것이어야합니다. 
처음에 이걸 모르고 계속 로컬디비로 넣어서 안됐었죠 ㅎㅎ;



FileZilla로 우분투에 파일을 올리고, crontab을 수정합니다. (수정은 crontab -e 입니다)




주석은 모두 치우시고, 제일 아래쪽을 보시면 매분마다 세팅해놓은것을 볼 수 있습니다. * * * * * 의미는 각각 분, 시간, 일, 월, 요일이며 afreeca.py 파일을 run.sh로 감쌌습니다.

리눅스에서 파이썬을 직접구동( python3 afreeca.py )시키고 디비에 쌓인 결과를 봅시다. 분 단위로 잘 들어오는 것을 볼 수 있습니다. 




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함