Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- 기사
- TensorFlow
- Python
- 딥러닝
- 코딩도장
- 데이터분석
- 사이킷런
- numpy
- 딕셔너리
- 재귀함수
- 제로베이스 데이터사이언스
- 추천시스템
- NLP
- 제어문
- 머신러닝
- 함수
- Set
- 클래스
- 후기
- 파이썬코딩도장
- 속성
- 스크랩
- 아이펠
- 카카오
- 데이터사이언스 스쿨
- AI
- 데이터사이언티스트
- AIFFEL
- 자연어처리
Archives
- Today
- Total
뮤트 개발일지
AIFFEL 아이펠 41일차 본문
뉴스기사 크롤링 및 분류
크롤링crawling: 웹 페이지로부터 데이터를 추출하는 행위
크롤러crawler: 크롤링하는 소프트웨어
BeautifulSoup과 newspaper3k를 통해 크롤러 만들기
# 크롤러를 만들기 전 필요한 도구들을 임포트합니다.
import requests
import pandas as pd
from bs4 import BeautifulSoup
# 페이지 수, 카테고리, 날짜를 입력값으로 받습니다.
def make_urllist(page_num, code, date):
urllist= []
for i in range(1, page_num + 1):
url = 'https://news.naver.com/main/list.nhn?mode=LSD&mid=sec&sid1='+str(code)+'&date='+str(date)+'&page='+str(i)
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36'}
news = requests.get(url, headers=headers)
# BeautifulSoup의 인스턴스 생성합니다. 파서는 html.parser를 사용합니다.
soup = BeautifulSoup(news.content, 'html.parser')
# CASE 1
news_list = soup.select('.newsflash_body .type06_headline li dl')
# CASE 2
news_list.extend(soup.select('.newsflash_body .type06 li dl'))
# 각 뉴스로부터 a 태그인 <a href ='주소'> 에서 '주소'만을 가져옵니다.
for line in news_list:
urllist.append(line.a.get('href'))
return urllist
url_list = make_urllist(2, 101, 20200506)
print('뉴스 기사의 개수: ',len(url_list))
>>> 뉴스 기사의 개수: 40
idx2word = {'101' : '경제', '102' : '사회', '103' : '생활/문화', '105' : 'IT/과학'}
from newspaper import Article
#- 데이터프레임을 생성하는 함수입니다.
def make_data(urllist, code):
text_list = []
for url in urllist:
article = Article(url, language='ko')
article.download()
article.parse()
text_list.append(article.text)
#- 데이터프레임의 'news' 키 아래 파싱한 텍스트를 밸류로 붙여줍니다.
df = pd.DataFrame({'news': text_list})
#- 데이터프레임의 'code' 키 아래 한글 카테고리명을 붙여줍니다.
df['code'] = idx2word[str(code)]
return df
data = make_data(url_list, 101)
#- 상위 10개만 출력해봅니다.
data[:10]
데이터 수집 및 전처리
code_list = [102, 103, 105]
from multiprocessing import Pool
import random
import time, os
def make_total_data(page_num, code_list, date):
start = int(time.time())
num_cores = 4
df = None
for code in code_list:
pool = Pool(num_cores)
url_list = make_urllist(page_num, code, date)
df_temp = make_data(url_list, code)
print(str(code)+'번 코드에 대한 데이터를 만들었습니다.')
pool.close()
pool.join()
time.sleep(random.randint(0,1))
if df is not None:
df = pd.concat([df, df_temp])
else:
df = df_temp
print("***run time(sec) :", int(time.time()) - start)
return df
df = make_total_data(1, code_list, 20200506)
크롤링
# 아래 주석처리된 코드의 주석을 해제하고 실행을 하면 대량 크롤링이 진행됩니다.
# 위에서 수행했던 크롤링의 10배 분량이 수행될 것입니다. 한꺼번에 너무 많은 크롤링 요청이 서버에 전달되지 않도록 주의해 주세요.
# 기사 일자를 바꿔보면서 데이터를 모으면 더욱 다양한 데이터를 얻을 수 있게 됩니다.
df = make_total_data(10, code_list, 20200506)
파일로 저장
import os
# 데이터프레임 파일을 csv 파일로 저장합니다.
# 저장경로는 이번 프로젝트를 위해 만든 폴더로 지정해 주세요.
csv_path = os.getenv("HOME") + "/aiffel/news_crawler/news_data.csv"
df.to_csv(csv_path, index=False)
if os.path.exists(csv_path):
print('{} File Saved!'.format(csv_path))
'AIFFEL' 카테고리의 다른 글
AIFFEL 아이펠 43-45일차 (0) | 2022.03.14 |
---|---|
AIFFEL 아이펠 42일차 (0) | 2022.03.14 |
AIFFEL 아이펠 40일차 (0) | 2022.02.24 |
AIFFEL 아이펠 39일차 (0) | 2022.02.23 |
AIFFEl 아이펠 38일차 (0) | 2022.02.22 |