urllib.request 모듈은 복잡한 세계에서 URL(대부분 HTTP)을 여는 데 도움이 되는 함수와 클래스를 정의합니다. — 기본(basic)과 다이제스트 인증, 리디렉션, 쿠키 등.
"""네이버 뉴스 기사 웹 크롤러 모듈"""
#import
from bs4 import BeautifulSoup
import urllib.request
크롤링을 하기 위해 두 가지 라이브러리를 import.
HTTP REQUEST를 보내고 HTTP RESPONSE를 받기 위한 urllib과 urllib을 통해 받은 RESPONSE(HTML)를 파싱하기 위한 Beautiful Soup.
**urllib, Beautiful Soup이 import되지 않는다면 해당 라이브러리를 먼저 설치.
#출력 파일 명
OUTPUT_FILE_NAME = 'output.txt'
#가져 올 URL
URL = 'http://news.naver.com/main/read.nhn?mode=\
LSD&mid=shm&sid1=103&oid=055'\'&aid=0000445667'
URL 주소를 백슬래시(\)를 사용해 두 줄로 나누었는데, 이는 한 행이 80자가 넘어가는 것을 방지하기 위해서이다.
신문기사 URL 주소는 크롤링하길 원하는 뉴스 기사의 URL 주소를 복사해 오면된다.
동영상이 포함된 기사였지만 해당 기사의 본문 내용(텍스트)만 가져오도록 한다.
# 크롤링 함수
def get_text(URL):
source_code_from_URL = urllib.request.urlopen(URL)
soup = BeautifulSoup(source_code_from_URL, 'lxml', from_encoding='utf-8')
text = ''
for item in soup.find_all('div', id='articleBodyContents'):
text = text + str(item.find_all(text=True))
return text
위 코드에서 urlopen 메소드를 통해 URL 주소에 대한 요청을 보내 source_code_from_URL 변수에 결과를 저장한다.
저장 후 HTML 코드를 파싱하기 위해 source_from_URL을 이용하여 BeautifulSoup 객체를 생성하여 soup에 할당한다.
BeautifulSoup 객체 생성자의 2번째 인자로 ‘lxml'을 사용하여 기존 ’html' 방식 대신 ‘lxml' 방식으로 파싱하였으며, 한글 내용이 포함된 기사이기 때문에 from_encoding 키워드 인자로 ’utf-8'을 넣어 ‘UTF-8' 방식으로 인코딩하
였다.
단, ‘lxml' 방식으로 BeautifulSoup 객체를 생성할 때 오류가 발생하면 ’lxml' 라이브러리를 설치한다.
이후, soup 객체에서 원하는 부분(HTML 요소)만 가지고 와야 하므로 가지고 올 기사의 본문 내용이 포함된 태그(HTML 요소)가 무엇인지를 찾아야 한다.
예를 들어, 다음과 같이 크롬 개발자 도구를 이용하여 신문기사 페이지의 본문 내용이 포함된 태그를 찾으면 된다.
#메인 함수
def main():
open_output_file = open(OUTPUT_FILE_NAME, 'w')
result_text = get_text(URL)
open_output_file.write(result_text)
open_output_file.close()
if __name__ == "__main__':
main()
메인 함수에서는 위에서 할당한 OUTPUT_FILE_NAME 상수를 통해 txt 파일을 생성하고
get-text 함수를 사용하여 기사 내용을 result_text에 할당한다.
다음으로 오픈한 output_file에 기사를 쓰고 닫았다.
CMD 창에서 클롤러 모듈을 실행하여 ‘output.txt' 파일이 생성 되는지 확인한다.
C:\~python3>python3 crawler.py
C:\~python3>dir
생성된 텍스트 파일(output.txt)을 열어서 신문기사 내용이 정상적으로 가져왔는지 확인한다.
다만, ‘\n', '\t' 등의 문자와 워드 클라우드 시각화에 필요 없는 특수문자는 제거해야 하므로 텍스트 정제 모듈을 따로 만들어 추출된 기사에서 필요 없는 문자를 제거한다.
[텍스트 정제 모듈]
import re #정규표현식 활용 위해 re 라이브러리 import
# 입, 출력 파일명
INPUT_FILE_NAME = 'output.txt'
OUTPUT_FILE_NAME = 'output_cleand.txt'
# 클리닝 함수
def clean_text(text):
cleaned_text = re.sub('[a-zA-Z]', '', text) #대소문자 영어 제거
cleaned_text = re.sub('[\{\}\[\]\/?.,;:|\)*
~`!^\-_+<>@\#$%&\\\=\(\'\"]', '', cleaned_text)
#특수문자 제거
return cleaned_text
# 메인 함수
def main():
read_file = open(INPUT_FILE_NAME, 'r')
write_file = open(OUTPUT_FILE_NAME, 'w')
text = read_file.read()
text = clean_text(text)
write_file.write(text)
read_file.close()
write_file.close()
if __name__ == '__main__':
main()
CMD 창에서 위 코드(정제 모듈)를 실행한다.
C:\~python3>python3 cleaner.py
C:\~python3>dir
실행 후 ‘output_cleand.txt' 파일이 생성되었는지 확인한다.
‘output_cleand.txt' 파일을 열어 영어와 불필요한 문자들이 제거되었는지 확인한다.
'Crawling' 카테고리의 다른 글
urllib, BeautifulSoup 으로 잡코리아 크롤링 (0) | 2022.01.04 |
---|---|
2. 네이버 블로그 내용 크롤링하기 (0) | 2022.01.03 |
유튜브 영상 조회수 크롤러_youtube_crawl (0) | 2021.12.31 |
인스타 해시태그 사진 크롤링_insta_crawl (0) | 2021.12.31 |
인스타 크롤링_insta_crawl (0) | 2021.12.31 |