ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹크롤링_중앙일보
    PYTHON/실습 2020. 5. 28. 19:12
     
     
    from bs4 import BeautifulSoup
    import urllib.request
    from urllib import parse
     
    from wordcloud import WordCloud, STOPWORDS
    import matplotlib.pyplot as plt  
    from os import path    
    import re   
    import numpy as np  
    from PIL import Image
     
     
    def jnews_link_scroll(kw, page=1 ):
        params = []     # [링크,제목]
        kw = parse.quote(kw)     # 키워드 인코딩
        
        for i in range(1, page+1):
            # URL 처리/변환
                        # 페이지와 키워드가 변함에 따라 url 에서 바뀌는 부분을 확인 후 아래처럼 넣어주기.
            list_url = f"https://news.joins.com/Search/JoongangNews?page={i}&Keyword={kw}&SortType=New&SearchCategoryType=JoongangNews"
            url = urllib.request.Request(list_url)
            result_html = urllib.request.urlopen(url).read().decode("utf-8")
            soup = BeautifulSoup( result_html, "html.parser")
            
            # 특정 태그 찾아내기
                # find_all( tag, class_= , id= , )
            res = soup.find_all("h2", class_='headline mg')
            
            # 텍스트 및 링크 추출 (get, get_text)
            for i in res:
                for j in i:
                    params.append([j.get("href"), j.get_text("href")])
                    
        return params
     
     
    def jnews_detail_scroll(kw, page=1, path='d:\\data'):
        # 1. 링크,제목 리스트
        list_url = jnews_link_scroll(kw, page)
        
        # 2. 본문 저장
        f = open(path+f'\\jnews_{kw}{page}.txt', 'w', encoding='utf-8')
        for i in list_url:
            # URL 처리/변환
            url = urllib.request.Request(i[0])
            result_html = urllib.request.urlopen(url).read().decode("utf-8")
            soup = BeautifulSoup( result_html, "html.parser")
            
            # 특정 태그 찾아내기
            res = soup.find_all("div", id="article_body")
            # 텍스트 추출
            for j in res:
                f.write( f'기사제목: {i[1]}\n'+str(j.get_text(" ", strip=True)) +'\n' + '\n' )
        f.close()
     
     
    def draw_wordcloud(kw, shape='korea', page=1):
        
        mask1 = np.array(Image.open(f"c:/project/{shape}_im.png"))
        
        # 본문 기사 저장해서 읽어오기
        jnews_detail_scroll(kw, page, path='d:\\data')
        script = path.dirname(f'd:\\data\\jnews_{kw}{page}.txt')
        text = open(f'd:\\data\\jnews_{kw}{page}.txt', mode="r", encoding="utf-8")
        text2 = text.read()
     
        # word: 제외할 단어
        file = open('d:/project/word.txt', 'r', encoding = 'utf-8')
        word = file.read().split(' ')
        for i in word:
            text2 = re.sub(i,'',text2)
     
        # WordCloud 생성&저장
        wordcloud = WordCloud(font_path='C://Windows//Fonts//gulim',
                              stopwords=STOPWORDS,
                              max_words=1000,
                              background_color='white',
                              max_font_size = 100,
                              min_font_size = 1,
                              mask = mask1,
                              colormap='jet').generate(text2).to_file('d:/project/cnn_cloud.png')
     
        # WordCloud 출력
        plt.figure(figsize=(15,15))
        plt.imshow(wordcloud, interpolation='bilinear')  
        plt.axis("off")
        plt.show()
        file.close()
        text.close()
     
     
     
     
    1 ) parse.quote
     
    URL 인용(quoting) 함수는 특수 문자를 인용하고 비 ASCII 텍스트를 적절히 인코딩하여 프로그램 데이터를 취해서 URL 구성 요소로 안전하게 사용할 수 있도록 하는 데 중점을 둠.
     
    urllib.parse.quote ( str, safe='/', encoding=None, errors=None )
    : %xx 이스케이프를 사용하여 string 의 특수문자를 치환합니다. 
    기본적으로, 이 함수는 URL의 경로 섹션을 인용하기 위한 것.
    선택적 safe 매개변수는 인용해서는 안되는 추가 ASCII 문자를 지정
     
    예) 
    import urllib
     
    print(urllib.parse.quote('코로나'))    # %EC%BD%94%EB%A1%9C%EB%82%98
    print(urllib.parse.quote('중앙일보'))    # %EC%A4%91%EC%95%99%EC%9D%BC%EB%B3%B4
     
     
    2 ) soup = BeutifulSoup ( html, "html.parser")
     
    html 소스를 BeautifulSoup 로 python 객체로 변환하기
    첫번째 인자: html 소스코드, 두번째 인자 : 어떤 parser 를 이용할지
    이렇게 하면 soup 객체에서 원하는 정보를 찾아낼 수 있다.
     
     
    3 ) j.get( tag ) 
        j.get_text( tag )
     
    j.get    :     주로 url 찾아낼 때
    j.get_text    :    텍스트만 추출할때
     
     
     

     
     

     

    'PYTHON > 실습' 카테고리의 다른 글

    python - heapq 사용법  (0) 2022.09.28
    3차원 그래프 그리기2  (0) 2020.12.11
    3차원 그래프 그리기1  (0) 2020.12.11

    댓글

Designed by Tistory.