코딩에서 손 뗀 지 어언 500년.. 간만에 내 특기(?)인 텍스트 긁어서 워드클라우드 만들기를 한 번 더 할 기회가 생겼다. 간단한 크롤링+워드클라우드 원툴인 나는 자신만만하게 검색해서 코드들을 봤으나 어쩐지 너무 어려웠다.
결국 배운 게 도둑질이라고 내 벨로그에 다시 와서 그 코드를 참고해서 크롤링 코드를 짰더니 무사히 코드를 완성했다. Thanks to 과거의 나. 그런 의미에서 이번에도 또 기록을 해본다.
아 졸라 길게 썼는데 날아감.
def get_news_list(keyword, page):
url = f"https://www.google.com/search?q={keyword}&sca_esv=594127581&tbm=nws&sxsrf=AM9HkKk2GHGxRdc8VzZxAXkwJzAKe94ooQ:1703730654080&ei=3t2MZeC_BJrY1e8PyLK08Ak&start={page}&sa=N&ved=2ahUKEwjgpreji7GDAxUabPUHHUgZDZ4Q8tMDegQIBBAG&biw=1861&bih=891&dpr=1"
response = requests.get(url, headers=headers)
html = bs(response.text, "lxml")
title_list = html.select("#rso > div > div > div > div > div > a > div > div.iRPxbe > div.n0jPhd.ynAwRc.MBeuO.nDgy9d")
content_list = html.select("#rso > div > div > div > div > div > a > div > div.iRPxbe > div.GI74Re.nDgy9d")
title_list_txt = []
for i in range(len(title_list)) :
title_list_txt.append(title_list[i].text)
content_list_txt = []
for i in range(len(content_list)) :
content_list_txt.append(content_list[i].text)
df_title_list_txt = pd.DataFrame(title_list_txt)
df_content_list_txt = pd.DataFrame(content_list_txt)
title_content = pd.concat([df_title_list_txt, df_content_list_txt],axis=1)
return title_content
뉴스 긁는 코드. (검색키워드, 페이지 번호)
news_list_df = pd.DataFrame()
for i in range(0, 60, 10):
title_content = get_news_list('밀당피티', i)
news_list_df = pd.concat([news_list_df,title_content])
페이지 매핑해서 긁고, 그 결과 합쳐주는 코드. 이 경우엔 헤드라인하고 요약을 합쳐주는 거임.
news_list_df = news_list_df.reset_index(drop=True)
news_list_df.columns = ["제목","미리보기"]
칼럼명 바꿔주기.
참고 : 웹소설 스크래핑
뭉쳐져있는 코퍼스에서 각각 한글과 영어를 따로 분리해서 각각 카운팅해서 분석 후 워드클라우드 그려주는 코드
def make_good_style_wordcloud(keyword):
tmp = keyword.apply(lambda x: str(x["제목"]) + str(x["미리보기"]), axis=1)
corpus = " ".join(tmp.tolist())
#영어 한국어 추출
english_text = ' '.join(re.findall(r'[a-zA-Z]+', corpus))
korean_text = ' '.join(re.findall(r'[ㄱ-ㅎㅏ-ㅣ가-힣]+', corpus))
#한국어 처리
okt = Okt()
def tokenize_kor(korean_text):
return [n for n in okt.nouns(korean_text) if len(n) > 1] # 단어의 길이가 1개인 것은 제외
#영어 처리
def tokenize_eng(english_text):
is_noun = lambda pos: pos[:2]=="NN"
tokenized = nltk.word_tokenize(english_text)
return [word for (word,pos) in nltk.pos_tag(tokenized) if is_noun(pos)]
all_nouns = tokenize_kor(korean_text) + tokenize_eng(english_text)
c = Counter(all_nouns)
custom_stopwords = ["불용어 리스트 입력"]
return stylecloud.gen_stylecloud(font_path='System/Library/Fonts/JejuGothic.ttf',text=c,icon_name="fas fa-circle", custom_stopwords = custom_stopwords, output_name=f"wordcloud.png")
keyword 자리엔 데이터프레임을 넣으면 된다. 이미 코퍼스를 가지고 있다면
tmp = keyword.apply(lambda x: str(x["제목"]) + str(x["미리보기"]), axis=1)
corpus = " ".join(tmp.tolist())
데이터프레임을 코퍼스로 바꿔주는 부분인 이 부분을 지우고 (keyword)대신 (corpus)로 바꾸고 그 자리에 코퍼스 변수를 넣어주면 됨!