텀블벅 후원에 성공하려면 프로젝트 이름을 어떻게 지어야 할까? (1)

2019. 9. 30. 13:10nlp

반응형

자연어처리 연구는 대부분 언어 데이터의 의미를 파악하고자 한다. 긴 글을 자동으로 요약하거나, 엄청난 크기의 댓글 데이터의 경향성을 파악하거나 등등. 

 

근데 난 같은 내용을 어떻게 다르게 표현했느냐가 더 궁금하다. 같은 내용이라도 더 성공적인 문구는 어떻게 표현했길래 성공적일까? 카피라이터와 일반인 글의 차이점은 무엇일까?를 알고 싶다. 

 

그래서 텀블벅 프로젝트 이름의 문장구조를 분석하기로 했다. 언젠가는 광고 카피도 분석해보고 싶지만, 텀블벅을 선택한 이유는!

 

 

1) 펀딩 성공/실패라는 명확한 결과가 있다

2) 광고에서 언어가 차지하는 비중이 비교적 크다 

 

이제 텀블벅 사이트에 가서 크롤링을 해야 한다. 본격적으로 코드를 짜기 전에 구글링을 해봤다. "tumblbug crawling"

그래야 이미 누군가 짜놓은 은혜로운 코드를 참고할 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ㅎㅎ..영어로 치나 한국어로 치나 크롤링은 다 누락되었다. 어쩔 수 없이 내가 손수 짜야한다...

 

텀블벅 홈페이지(https://tumblbug.com)에 가서 <모든 프로젝트>를 클릭하고 <진행중인 프로젝트만 보기> 체크를 해제해주면 펀딩 성공한 프로젝트를 볼 수 있다. (최다 후원순/최다 금액순으로 정렬해야 펀딩중인 프로젝트보다 펀딩 성공한 프로젝트가 먼저 보인다)

 

 

펀딩중인 프로젝트는 관심없고 펀딩 성공한 프로젝트의 이름만 보고 싶다.

 

검사를 해보니 프로젝트 이름마다 장난아니게 복잡한 class명이 정해져 있다. 이 class를 찾아 get_text하면 된다.

<div class="_3pHwEkSiYqWk69Gc95VG0O">

근데 모든 프로젝트 이름이 아니라 펀딩 성공한 프로젝트 이름만 갖고 싶다. 확인해보니 아직 펀딩 진행중인 프로젝트는 아예 저 class명이 없다. 

<span class="_1lHRvWRwBEXZUVVgs58i7b">펀딩 성공</span>

정리하면

class="_1lHRvWRwBEXZUVVgs58i7b"가 있는 프로젝트 안에서 class="_3pHwEkSiYqWk69Gc95VG0O"를 찾아 get_text하면 된다!

 

 

근데 난 못했다ㅋ

사실 이 프로젝트는 몇 달 전에 했는데 그때랑 텀블벅 코드가 달라진 것 같다. 혼란하다~

그래서 그땐 크롤링 갈피를 못잡고 

스트레스 받다가 결국 노가다했다ㅋ

이제 100개 정도 노가다는 손쉽게 한다. 

어쨌든 성공한 프로젝트 100개 이름은 노가다로 수집했다. 

 

이 수업은 코딩 수업이 아니였어서.. 교수님이 내가 뭘하든.. 얼마나 적은 프로젝트를 수집했든 아무 관심이 없었다.. 

 


 

이제 실패한 프로젝트 수집할 차례다.

문제는 텀블벅이 실패한 프로젝트를 홈페이지에서 보여주지 않는다.

그래서 꼼수를 썼다. 

 

구글에 "텀블벅 펀딩 무산. 목표 금액을 달성하지 못했습니다. 결제가 진행되지 않습니다."라고 검색하면 펀딩에 실패한 프로젝트들이 쫙 뜬다.

 

 

근데 이런 페이지가 3페이지까지만 뜨는데 당황하지 말고 끝 페이지에서 <생략된 결과를 포함하여 다시 검색>하면 

엄청나게 많은 실패 프로젝트를 볼 수 있다.

 

 

(2019.09.30 기준으로) 무려 30페이지까지 나온다

 

 

이제 구글링 결과를 크롤링하기만 하면 된다.

검색 페이지 1번에서 3번까지 url 주소가 차례대로 start=0, 10, 20으로 변한다. 10씩 증가하는 것을 알 수 있다. 이 패턴으로 for문을 돌려 크롤링을 돌려보자~!~!

 

 

 

 

그리고 중요한 프로젝트 이름은 각각 <h3> 태그 안에 들어있다. <h3> 태그 안의 text만 뽑아내면 실패한 프로젝트의 이름을 수집할 수 있다.

 

 

완성된 코드는

import requests
from bs4 import BeautifulSoup

# 접근 금지를 피하기 위한 헤더 명령 
headers = {'User-Agent': 'Mozilla/5.0'}
failed=[]

# "펀딩 무산. 목표 금액을 달성하지 못했습니다. 결제가 진행되지 않습니다."하는 검색의 12페이지까지 수집 
for page in [0,10,20,30,40,50,60,70,80,90,100,110]: 
    URL = 'https://www.google.com/search?q=%ED%8E%80%EB%94%A9+%EB%AC%B4%EC%82%B0.+%EB%AA%A9%ED%91%9C+%EA%B8%88%EC%95%A1%EC%9D%84+%EB%8B%AC%EC%84%B1%ED%95%98%EC%A7%80+%EB%AA%BB%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4.+%EA%B2%B0%EC%A0%9C%EA%B0%80+%EC%A7%84%ED%96%89%EB%90%98%EC%A7%80+%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.&newwindow=1&ei=jHTfXJHVHYKB-QaNvoLYDQ&start='+str(page)+'&sa=N&filter=0&ved=0ahUKEwiRy5LBiqTiAhWCQN4KHQ2fANsQ8tMDCGI&biw=1280&bih=578'
    res = requests.get(URL, headers=headers)
    soup = BeautifulSoup(res.text)
    
    for i in range(10): # 한 페이지에 프로젝트 10개씩 있음 
        failed.append(soup.find_all("h3")[i].text) # 리스트에 저장

 

그런데 맨 뒤에 공통적으로 "::텀블벅"이라는 말이 써있다. 이건 없애줘야 하니까

fail=[]

for f in failed:
    f = f[:-7] # 맨 뒤의 "::텀블벅" 제거 
    fail.append(f)

이제 다 수집했으니 txt 파일로 내보낸다!

with open("fail.txt", "w") as output:
    output.write(str(fail)) # 파일로 저장
반응형