카테고리 없음

파이썬으로 원하는 사이트 내용 웹 크롤링 및 번역, 파일까지 만들기

SiriusJ 2024. 10. 3. 20:59
반응형
반응형

최근 해외 사이트들의 동향을 조사하고 본문 내용을 정리하는데 번역을 한번 돌리고 파일화 하는 작업들이 많다보니 이를 파이썬으로 만들면 어떨까해서 아래처럼 만들어 보았습니다.

작업 순서는 아래와 같습니다.

- 1) 원하는 사이트 정적 웹 크롤링(BeautifulSoup)

- 2) Googletranslate 를 활용한 번역

- 3) 번역한 내용을 메모장 파일로 저장

(코드)

import requests, googletrans, time
from bs4 import BeautifulSoup

maxsize = 4500
sleep_time = 2

translator = googletrans.Translator()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

url = input("번역할 웹 페이지의 URL을 입력하세요: ")
data = requests.get(url, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

# 글 제목 추출
title = soup.select('.metadata-content-area')
for index, element in enumerate(title, 1):
    f = open('C:/Users/USER/PycharmProjects/global_iot_security/test.txt', 'w', encoding='UTF-8')
    trans_title = translator.translate(element.text.strip(), src = 'en', dest='ko')
    f.write("{} 번째 게시글의 제목: {}".format(index, trans_title.text))
    f.close()

# 세부내용 추출
full_contents = soup.select('.doc-content-area')
for i in full_contents:
    txt_contents = i.get_text()
    f = open("C:/Users/USER/PycharmProjects/global_iot_security/test.txt", "a", encoding='UTF-8')

    #txt_contents가 maxsize 보다 클 때(5000자 이상이면 오류 발생, 4500자씩 분해하여 번역)
    if len(txt_contents) > maxsize:
        results_list = []
        concatenated_result = ""

        original_contents = [txt_contents[i:i + maxsize] for i in range(0, len(txt_contents), maxsize)]

        for i in original_contents:
            r = translator.translate(i.strip(), dest='ko', src='en')
            time.sleep(sleep_time)
            results_list.append(r.text)
            f.write(r.text.strip())

        for i in results_list:
            concatenated_result += i

    # 전체 내용이 4500자 이하라면, 그대로 본문 전체를 번역하여 파일로 씀
    else:
        res = translator.translate(txt_contents.strip(), dest='ko', src='en')
        time.sleep(sleep_time)
        f.write(res.text.strip())
    f.close()


 

* 단 주의할 점은, 코드에서 번역시에 5천자가 넘게되면 번역 오류가 발생하게 됩니다.

따라서 저는 우선 전체 크롤링 할 내용이 4500자를 기준으로 넘는지 안넘는지를 비교하여 경우에 따른 케이스로 만들어보았습니다.

beautifulsoup를 활용해서 정적 크롤링을 했는데, 1시간정도에 급하게 만드느라 세밀한 코딩결과는 아닙니다.

이유는?

4500자를 넘길때, 해당 구간에서는 번역이 꼬일 수 있기 때문입니다.

일차적으로 만들어보았고, 추가적으로 보완하려고 합니다.

반응형