ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬,셀레니움으로 에브리타임 핫 게시판 크롤링 하기
    코딩 2020. 4. 7. 22:37

    https://brunch.co.kr/@carpediem7760/12

    과정에 대해서는 위의 링크에 있으니 읽으시면 이해가 더 쉽게 될 것입니다.

     

    파이썬의 셀레니움을 이용해서 에브리타임의 핫 게시판의 글들을 가져오고 엑셀(공감수, 제목, 내용, url) or 형태소 분석 하는 코드로 나누었습니다.

     

    저는 주피터 노트북으로 작업했습니다.

    사용한 라이브러리: BeautifulSoup, Selenium, requests,konlpy,openpyx

     

     

     

     

    아래는 크롤링한 정보를 토대로 엑셀로 공감수, 제목, 내용, url로  저장하는 방법입니다.

    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
    76
    77
    78
    #엑셀 저장화
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import time 
    from konlpy.tag import Kkma
    import openpyxl
    #라이브러리 불러오기
     
    kma = Kkma()
     
    excel_file = openpyxl.Workbook()
    excel_sheet = excel_file.active
    #엑셀 파일로 저장하기 위한 작업 start
     
    chromedriver ='C:\dev_python\Webdriver\chromedriver.exe'
    driver = webdriver.Chrome(chromedriver)
    #selenium 라이브러리 기본 작업
     
    driver.get('https://everytime.kr/login')
    #크롤링 할 홈페이지 가져오기
    driver.find_element_by_name("userid").send_keys("내 아이디")
    #태그의 네임이 userid 인 element 가져오고 "내 아이디" 입력
    driver.find_element_by_name("password").send_keys("비밀번호")
    #태그의 네임이 password 인 element 가져오고 "비밀번호" 입력
    driver.find_element_by_tag_name("input").send_keys(Keys.RETURN)
    #로그인 버튼 찾고 클릭
     
     
     
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="container"]/div[3]/div[2]/div/h3/a').click()
     
    time.sleep(2)
    driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a').click()
     
    time.sleep(1)
    #핫게시판으로 가능 경로로 이동하기 
     
     
    def next_page():
        driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()
        time.sleep(0.5)
        
        res = driver.page_source
        soup = BeautifulSoup(res,"html.parser")
        data_name = soup.select('#container > div.wrap.articles > article > a > h2')
        data_num = soup.select('.vote')
        data_text = soup.select('#container > div.wrap.articles > article > a > p')
        data_url = soup.select('#container > div.wrap.articles > article > a')
    #함수 next_page 생성, 핫 게시판에서 (공감수, 제목, 내용, url) 찾고 저장할 준비
        
        for num,name,text,url in zip(data_num,data_name,data_text,data_url):
            excel_sheet.append([int(num.get_text()),name.get_text(),text.get_text(),'https://everytime.kr'+url.get('href')])       
    #num,name,text,url 이라는 폴더에 (공감수, 제목, 내용, url) 각각 넣고 튜플로 저장
     
          
    driver.find_element_by_xpath('//*[@id="sheet"]/ul/li[3]/a').click()
    # 2페이지에 뜨는 광고창 1번 끄기
     
    time.sleep(0.5)
    for page_roof in range(30):
        next_page()
    # next_page를 page_roof라는 폴더에 넣고 30번 반복
     
    excel_file.save('everytime crawing.xlsx')
    # everytime crawing 라는 엑셀 파일에 저장 
    excel_file.close()
        
    driver.quit()
    cs

     

    실행 결과는 이렇습니다.

     

     

     

    다음은 형태소로 나누는 작업입니다.

    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
    #엑셀 저장화
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import time 
    from konlpy.tag import Kkma
    import openpyxl
    #라이브러리 불러오기
     
    kma = Kkma()
    #형태소 라이브러리를 kma로 칭함
     
    chromedriver ='C:\dev_python\Webdriver\chromedriver.exe'
    driver = webdriver.Chrome(chromedriver)
    #selenium 라이브러리 기본 작업
     
    driver.get('https://everytime.kr/login')
    #크롤링 할 홈페이지 가져오기
    id_every = driver.find_element_by_name("userid")
    #태그의 네임이 userid 인 element 가져오기 
    id_every.send_keys("내 아이디^ㅇ^")
    #userid에 아이디 입력
     
     
    pwd_every = driver.find_element_by_name("password")
    #태그의 네임이 password 인 element 가져오기 
    pwd_every.send_keys("비~밀번호")
    #password에 비밀번호 입력 
     
    login_btn =driver.find_element_by_tag_name("input")
    login_btn.send_keys(Keys.RETURN)
    #로그인 버튼 찾고 클릭
     
     
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="container"]/div[3]/div[2]/div/h3/a').click()
     
    time.sleep(2)
    driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a').click()
     
    time.sleep(1)
    #핫게시판으로 가능 경로로 이동하기 
     
    def next_page():
        driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()
        time.sleep(0.5)
        
        res = driver.page_source
        soup = BeautifulSoup(res,"html.parser")
        data = soup.select('#container > div.wrap.articles > article > a > p')
     
     
        for datas in data:
            print(datas.get_text())
     
    #엑셀 코드와는 다르게 내용만 가져오는 함수를 만들었습니다.
        
    driver.find_element_by_xpath('//*[@id="sheet"]/ul/li[3]/a').click()
    time.sleep(0.5)
    for page_roof in range(30):
        next_page()
    #30 번 반복 
     
    page_tex = page_roof()
    #page_roof는 page_tex에 포함
     
    word = kma.nouns(page_tex)
    #단어로 변환
     
     
    print(word)
     
     
     
    cs

    단어로 분할한 결과물입니다. 이것을 빈도수에 맞게 나열해볼까요?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #빈도수 내림차순 
    from collections import Counter
    count = Counter(word)
     
    tag_count= []
    tags = []
     
    for n,c in count.most_common(1000):
        dics = {'tag':n, 'count':c}
        if len(dics['tag']) >= 2 and len(tags)<=49:
            tag_count.append(dics)
            tags.append(dics['tag'])
            
    for tag in tag_count:
        print("{:<14}".format(tag['tag']),end='\t')
        print("{}".format(tag['count']))
     
     
    cs

     

    빈도수로 나눈 결과 값입니다!

    궁금하신 것이 있다면 댓글 남겨주세요!

    댓글

Designed by Tistory.