목차
[네이버 어벤저스] 내가 보는 상품 홍보문구, 실은 AI가 썼다고?
뭔가 우리 팀에서 진행했던 파이널프로젝트 결과가 나오고 나서 부랴부랴 기사를 낸 것 같은 착각이 들어서 뿌듯했다. 기업에서도 이런 생각을 하고 있었고, 우리가 이걸 해냈구나? 하는 느낌.. 빨리 파이널 프로젝트 글을 쓰고 나서 다른 글도 올려야 하는데, 추가로 gpt3와 자연어 공부를 같이 하고 있어서 글 쓰는 시간도 부족한 것 같다. 그리고 정리를 해놨던 파일이 갑자기 증발이 되는 바람에 목차도 많이 줄였다.
우리가 필요한 데이터는 기업 설명(단순 기업명 가지고는 안 됐다)과 슬로건, 광고 문구였다. 하지만 온라인 상에는 그러한 데이터셋이 존재하지 않았다. 슬로건, 광고문구 데이터를 어떻게 모았는가 하면, 블로그에서 기업명과 함께 크롤링을 하고, 기업명을 네이버, 나무위키, 사람인 등에 다시 검색해서 기업의 정보를 모았다. 사람인에서 기업 설명이 깔끔하게 입력이 됐으면 이를 사용했을텐데 이상하게 분류된게 많아서 결국 손으로 데이터 전처리를 진행했다.
(* 잡담 : 도전하자. 프로젝트에 올라온 글들의 제목이 매력이 없어 보인다. 추후에 구글에서 검색이 되면서 사람들이 클릭하게끔 또 만들어야할 듯 싶다)
어떻게 프로젝트를 진행했는지 다시 생각해보니, 다양한 시도를 하긴 했구나 하는 느낌? style gan을 사용해서 로고생성까지 시도하려고 했으나 생각보다 결과가 좋지 않고 비효율적이었다. 그래서 새로운 캐릭터를 생성하자는 느낌으로 해볼까 했는데, 캐릭터를 크롤링하고 찾는 것도 일일 것 같아서 우선 할 수 있는 부분에 더욱 중점을 뒀다.
네이버 블로그 크롤링의 문제점
1. 우선 java script로 구성이 돼서 동적 크롤링을 사용해야 한다. 2. iframe으로 둘러 쌓여서 크롤링이 쉽지 않았다. 그리고 스마트 에디터 one과 2.0 버전에 따라 크롤링 해야하는 방법이 다르다.
동적 크롤링인 셀레니움이 속도도 느리고 중간중간 빠지는 데이터들도 있어서 사용하는 것을 별로 안 좋아해서 어떻게 하면 beautiful soup으로 할까 하다가.. 네이버 블로그 검색창에 제목을 검색해서 하니까 잘 진행이 됐다. link가 포함된 부분을 크롤링하고 get('href')로 링크만 크롤링을 했다.
1
2
3
4
5
6
7
8
9
10
11
12
|
# 네이버 블로그 iframe 제거 함수
def delete_iframe(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
req = requests.get(url, headers=headers)
req.raise_for_status() # 문제시 프로그램 종료
soup = BeautifulSoup(res.text, "lxml")
src_url = "https://blog.naver.com/" + soup.iframe["src"] # iframe 안에 있는 src 부분을 가져옴
return src_url
|
cs |
출처 : https://github.com/tiger-beom/naverblog_scraping
iframe 제거 함수를 미리 정의해놓으면 나중에 네이버 블로그 크롤링하는데 편리할 것이다. 2.0 -> 3.0 -> one 다 써봤었는데 2.0보다는 one이 더 깔끔하긴 하지만.. 정말 초반에는 오류 투성이었다. 글을 써야 하는데 평상시보다 몇 배가 더 걸렸던 기억이 있다. 투데이 2만이 넘었던 블로그였는데 ..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 네이버 블로그 글 크롤링 함수
def text_scraping(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
req = requests.get(url, headers=headers)
req.raise_for_status() # 문제시 프로그램 종료
soup = BeautifulSoup(res.text, "lxml")
if soup.select_one('div.se-main-container'):
text = soup.select_one('div.se-main-container').text
text = text.replace('\n', '')
# print("블로그")
return text
elif soup.select_one('div#postViewArea'):
text = soup.select_one('div#postViewArea').text
text = text.replace('\n', '')
# print('블로그 2.0')
return text
else:
return "오류"
|
cs |
div.se-main-container가 포함되면 스마트에디터-one, div#postViewArea가 포함이 되면 2.0 버전이라고 생각하면 된다. 네이버 포스트의 경우 또 다른 방식으로 글을 크롤링해야 한다. 궁금하면 위의 깃허브로 들어가시면 됩니다.
나무위키 크롤링 문제점
동적, 정적 크롤링이 모두 안 됐다! 왜 그런가 찾아보니 나무위키에서 크롤링 하는 것을 원천 차단한 모양이다. 트래픽 과부하를 막기 위해서 그런 것으로 보인다. 그래서 봇으로 인식을 하면 아예 창이 들어가지지 않았다.
우선 코드를 짜봤는데 진행이 되지 않았고, 내 문제인가 싶어서 위키독스에 나와있던 코드를 따라했는데도 되지 않았다. 결국 구글링을 열심히 해서 봇이 아닌 사람으로 인식하는 코드를 추가로 넣어줘야 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#봇이 아닌 사람으로 인식하는 코드 / 자신의 크롬 위치 입력
subprocess.Popen(r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"')
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
try:
driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=options)
except:
chromedriver_autoinstaller.install(True)
driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=options)
driver.implicitly_wait(3)
start = time.time()
|
cs |
첫번째 줄에 있는 코드는 컴퓨터마다 크롬 위치가 다를 수 있기 때문에 확인해야 한다. 그리고 나서 크롬드라이버를 아예 새로 설치하는 것 같았다. import chromedriver_autoinstaller 를 통해서 패키지를 추가하자.
이렇게 코드를 입력하면 이제 본격적으로 셀레니움을 통해서 검색을 하면 된다고 생각했지만... 또 문제가 있었다. 어떤 정보를 긁어와야 하는지? 동음이의어가 존재할 때 어떻게 처리를 할지? 그리고 기업명이 단순히 기업명만 있으면 좋겠지만, 슬로건이나 광고문구를 가져오다 보니 지역명이나, 캠페인도 포함이 돼서 이를 먼저 처리해야했다. 그리고 no_search 리스트를 만들어서 제외했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
same = driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/article/div[3]/div[1]/ul/li/a').text
#동음이의어가 존재할 경우 원하는 정보를 긁어오지 않음, 예외로 뺴기 (분류에 동음이의어/* 여부)
if '동음이의어' in same:
explane = 'same'
explanes.append(explane)
#아닐 경우 그대로 진행
else :
try:
explane = driver.find_element_by_css_selector('div.wiki-heading-content').text
explanes.append(explane)
#print(explane)
except:
explane = 'NaN'
explanes.append(explane)
|
cs |
간단하게 접근을 했다. 개요에서 회사에 대한 설명을 긁어오기 전에 우선 동음이의어가 검색이 되는지 파악을 하고, 검색이 되는 경우 크롤링을 진행하지 않았다. 그리고 사람인, 네이버 뉴스 검색에서 회사 설명을 찾았다. 예전에 기사를 써본적이 있는데, 처음에 회사나 제품, 서비스에 대한 설명을 간단하게 적어놓는다는 점을 착안했다.
이렇게 크롤링을 하면 되겠다 싶었는데... 결과를 비교하니 참담했다. 그래서 손크롤링을 진행했다고 한다. ㅠㅠㅠ
'도전하자. 프로젝트' 카테고리의 다른 글
6-4 파이널프로젝트 Sentence Transformer를 이용한 짧은 텍스트 / 제목 문장 유사도 (2) (1) | 2021.09.03 |
---|---|
6-3 파이널프로젝트 KoGPT2와 짧은 텍스트/문장 유사도 (1) (0) | 2021.09.03 |
6-1 파이널 프로젝트 : 자연어처리, kogpt2를 이용한 슬로건 생성 (0) | 2021.08.26 |
5-3 파이썬 팀프로젝트 PyQt5로 간단 GUI 프로그램 만들기 (자동완성 기능) (2) | 2021.08.14 |
5-2 파이썬 팀프로젝트 추천시스템 (자연어 NLP / TF-IDF, Word2Vec) (0) | 2021.08.13 |