결론부터 말하면 구글이나 네이버 헤드라인 뉴스를 크롤링해 블로그 포스팅을 자동화하고 이를 통해 구글 애드센스 수익을 올리는 것은 가능하다. 아주 미약하게나마 수익이 난다는 것이지 실질적인 수익이라 말하기 어렵다.
최신 뉴스는 검색 수요가 많아 트래픽을 유도할 가능성이 높다. 또한 특정 키워드에 대한 순위를 잘 잡으면 방문자가 늘어날 것이다. 재수 좋으면 광고까지 클릭하게 된다. 정기적인 발행까지 된다면 활성화된 사이트로 간주해 SEO 점수가 개선될 것이다.
하지만 치명적인 문제가 발생할 수 있다.
첫 번째는 바로 저작권 문제다.
구글의 경우 뉴스 컨텐츠는 보통 원 출처 사이트의 저작권을 따른다. 따라서 크롤링한 데이터를 그대로 복사해 블로그 포스팅하면 저작권 침해가 될 수도 있다. 심한 경우 구글은 저작권 위반 사이트에 대해 애드센스 계정을 정지할지도 모른다.
두 번째로 SEO 페널티다. 구글은 중복 컨텐츠를 탐지해 페널티를 부여한다. 만약 뉴스 컨텐츠를 그대로 올리면 원 출처보다 SEO 순위에서 밀릴 가능성이 크다. 단순 복제 사이트로 분류되면 검색 엔진에서 제거되는 최악의 사태도 올 수 있다.
세 번째는 사용자에게 가치를 제공하기 어렵다.
단순히 크롤링된 뉴스만 게시하는 사이트를 누가 지속적으로 방문하려 하겠는가. 독창적이거나 흥미롭지 않으면 더 이상 방문하지 않을 것이다.
해결책은 문제점을 개선하는 것이다.
첫째 독창적이고 부가 가치 있는 컨텐츠를 게시한다. 크롤링한 헤드라인을 참고하되, 내용을 요약하거나 개인적인 의견, 분석을 추가한다. "오늘의 주요 뉴스와 영향 분석" 같은 형태로 가공한다.
둘째 요약 컨텐츠를 제공한다. 헤드라인을 보여주고 기사링크를 요약해 함께 보여준다. 기사요약은 Google News API나 ChatGPT API를 이용하면 구현가능하다. 전자는 무료지만 결과가 만족스럽지 않고 잘 되지 않았다. 반면 후자는 꽤 높은 수준의 요약본을 제공한다. 유료모델이라 확실한 성능을 보여주는 듯하다. 계속 발전하고 있어서 만족도는 더 높아질 것이다.
그럼 실제 만들어 보자. 요약을 무료로 해주는 라이브러리를 이용한다. 기사링크를 입력값으로 라이브러리를 호출한다.
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from transformers import pipeline
# Hugging Face 요약 파이프라인 로드
# summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summarizer = pipeline("summarization", model="facebook/mbart-large-cc25")
def fetch_news():
try:
# 웹사이트 접속
url = "https://www.blockmedia.co.kr/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
news_links = []
# 뉴스 기사 찾기
articles = soup.find_all('article', class_='l-post')
for article in articles[:10]: # 상위 10개 뉴스
try:
# 날짜 추출
date_element = article.find('time', class_='post-date')
date = date_element.text.strip() if date_element else "날짜 없음"
# 제목과 링크 추출
title_element = article.find('h2', class_='post-title')
title_link = title_element.find('a') if title_element else None
if title_link:
title = title_link.text.strip()
link = title_link['href']
# 이미지 URL 추출
img_element = article.find('span', class_='img')
image_url = img_element.get('data-bgsrc', '') if img_element else ""
news_links.append({"title": title, "link": link})
except Exception as e:
print(f"기사 파싱 중 에러 발생: {str(e)}")
continue
return news_links
except requests.exceptions.RequestException as e:
print(f"웹사이트 접속 중 에러 발생: {str(e)}")
return None
except Exception as e:
print(f"에러 발생: {str(e)}")
return None
def fetch_article_content(url):
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
# 기사 본문 추출
paragraphs = soup.find_all("p")
content = " ".join([para.text for para in paragraphs])
return content if content else None
except Exception as e:
print(f"Error fetching article content: {e}")
return None
def summarize_content(content):
try:
# 공백 제거 및 내용 정리
content = content.strip()
# 내용 길이 확인
if len(content) < 50:
return "요약할 내용이 너무 짧습니다."
summary = summarizer(content,
max_length=130,
min_length=30,
do_sample=False)
return summary[0]['summary_text'] if summary else "요약 불가"
except Exception as e:
print(f"요약 중 오류: {e}")
return "요약 불가"
if __name__ == "__main__":
news = fetch_news()
for idx, article in enumerate(news, start=1):
print(f"\n[{idx}] {article['title']}")
print(f"Link: {article['link']}")
content = fetch_article_content(article['link'])
if content:
summary = summarize_content(content)
print(f"Summary: {summary}")
else:
print("Content could not be retrieved.")
프로그램 실행 결과는 실망스러웠다. 기사 링크를 입력으로 던져주고 요약본을 리턴하는 방식인데, 제대로 기사 요약은 하지 못했다. 대부분 요약불가로 에러를 뱉어냈다. 무료 버전의 한계인가?
[8] 코인베이스 CEO, “코인 상장 방식 재검토 필요…매주 100만개 신규 코인 생성”
Link: https://www.blockmedia.co.kr/archives/849248
Summary: 에서는 블록미디어 이정화 기자] 코인 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자] 기자]
기자] 기자] 기자] 기자] 기자] 텔레 텔레, 텔레 텔레 텔레그램으로(현지 시간) 암스트롱은 규제 당국의 규제 당국의 규제 당국조차 감당하기 어려운 상황고 지적했다. 암스트롱은 규제 당국의 접근 방식에도 문제를 제기했다. 그는 “모든 토큰에 대해 각각 승인
[9] 매도 폭탄 멈춘 외국인, 본격 귀환할까[설 이후 증시전망②]
Link: https://www.blockmedia.co.kr/archives/849222
요약 중 오류: index out of range in self
Summary: 요약 불가
ChatGpt에 기사링크를 던지고 요약해보라 했다. 그 결과는 깔끔했다.
결론은 인공지능 LLM 모델을 이용할 수 밖에 없지 않겠는가...
'코드리뷰 > chatGPT(Python)코드' 카테고리의 다른 글
네이버 API 이용해 헤드라인 뉴스 기사 가져오기 (0) | 2025.01.27 |
---|---|
BeautifulSoup 이용해 웹 데이터 추출하기 - select, select_one, find, find_all (0) | 2025.01.12 |
비트코인 헤드라인 뉴스 사이트 자동으로 만들기 (0) | 2025.01.11 |
댓글