-
2021.03.24 - [✎ 21.上/Data] - [티스토리 게시글 추천 시스템 만들기] #1 계획
한글만 분석하기 위해 한글 형태소 분석기를 사용했다. 나는 이 중에 정규화까지 가능하다는 OKT를 사용했다.
사실.. HDFS에 저장할 필요도 없이 바로 HIVE로 쏠까 했는데 다 한번씩 만져보고싶어서 HDFS에 중간에 한번 저장하는 과정을 거쳤다.
from typing import List, Optional from bs4 import BeautifulSoup import requests import logging import re from konlpy.tag import Okt from pyspark.sql import SparkSession from tqdm import tqdm logger = logging.getLogger() def analysis_nlp(texts: List) -> List: okt = Okt() article_pos_list = [] for text in texts: article_pos = okt.pos(text) if article_pos: for pos in article_pos: article_pos_list.append({"morpheme": [pos[1]], "text": [pos[0]]}) return article_pos_list def get_content_main(post_num: int) -> List: contents: List = [""] * 500 for num in tqdm(range(1, post_num)): result = get_content(num) if result: contents[num]: Optional[List] = result else: logger.warning("존재하지 않는 게시글입니다.") total_pos = [] for content in contents: if content: nlp_set: list = analysis_nlp(content) total_pos.extend(nlp_set) return total_pos def get_content(post_num: int) -> Optional[List]: url: str = "https://weejw.tistory.com/%d" % post_num content = requests.get(url).content logger.info("URL:%s" % url) soup = BeautifulSoup(content, 'html.parser') exists_post = soup.select_one('div.absent_post') if exists_post is not None: return None contents = soup.select_one('div.tt_article_useless_p_margin') if contents is None: return None results: str = str(contents.findAll('p')) results: List = re.sub('<.+?>', '', results).replace("[", "").replace("]", "").split(",") results: List = [result for result in results if (result not in ['', ' '])] return results if results else None def get_spark_session(): app_name = "Python Example - PySpark Parsing Dictionary as DataFrame" master = "local" spark = SparkSession.builder \ .appName(app_name) \ .master(master) \ .getOrCreate() return spark def log_init(): logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s') stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) def main(): log_init() spark = get_spark_session() #total_pos = get_content_main(post_num=500) #spark_df = spark.createDataFrame(total_pos) file_path = "hdfs://localhost:9000/user/jiwonwee/crawler_data/crawler_data.parquet" # HDFS에 파일 저장 spark_df.write.parquet(file_path) if __name__ == '__main__': main()
HDFS에 저장된 파일을 다시 불러와서 출력하면 다음과 같다. 굿 ^_^
spark_df = spark.read.parquet(file_path) spark_df.show()
REFERENCES
'2021년 > Data' 카테고리의 다른 글
[티스토리 게시글 추천 시스템 만들기] #4 worldCloud 만들기 (0) 2021.03.26 [티스토리 게시글 추천 시스템 만들기] #3 클롤링 데이터 TF-IDF 계산하기 (0) 2021.03.25 [티스토리 게시글 추천 시스템 만들기] #1 계획 (0) 2021.03.24 koalas (0) 2021.03.23 [DB 공부] PostgreSQL Query (0) 2021.03.22