type() - 변수의 자료형 알 수 있음
int(integer) 정수
float 실수
str(string) 문자열
list 리스트
append 리스트 안에 원소 추가
ex)
list1=[1, 2, 3, 4, 5]
list_1.append(155)
print(list1)
extend 리스트 안에 또 다른 리스트 이어붙임
list1=[1, 2, 3, 4, 5]
list2 = ['a', 'b', 'c']
list1.extend(list2)
print(list1)
for 각각의데이터 in 전체데이터: - 반복문
for문 끝에 :을 붙여준다
이하 적용될 코드에 들여쓰기를 해준다.
ex)
for i in range(0, 5):
print(i)
비교연산자
<
==
!=
<=
여기서는 참이냐 거짓이냐를 보여줌. 문자열도 가능
if 조건문:
수행할 문장1
수행할 문장2
else:
수행할 문장A
수행할 문장B
ex)
if c == 8:
print('8입니다')
else:
print('8아니네 틀림')
if와 else사이에 elif를 넣어 조건문을 여러개 넣을 수도 있음
def 함수이름(함수인자1, 함수인자2, ...):
수행할 코드
return 최종결과
ex)
def volume(width, height, length):
return widthheightlength
volume(5, 8, 2) --> 가로세로높이값 입력해서 계산결과 리턴
volumeA = volume(5, 8, 2)
print(volumeA)
class --> 틀을 짜는 것 (붕어빵기계)
instance --> 객체(붕어빵)
객체 생성 후 '객체명.함수명'으로 사용
ex)
class Monster():
hp = 100
mp = 10
def damage(self, attack):
self.hp = self.hp - attack
monster1 = Monster()
monster1.damage(120)
monster2 = Monster()
monster2.damage(90)
try, except
ex)
try:
print(a/b)
except:
print('0으로는 나눌 수 없어요!')
pandas
--> 파이썬 데이터분석을 위한 필수 패키지, 테이블 구조인 데이터프레임 지원
import pandas as pd
데이터프레임이름 = pd.DataFrame({'칼럼명1' : [원소1, 원소2... 원소n],
'칼럼명2' : [원소1, 원소2... 원소n],
'칼럼명N' : [원소1, 원소2... 원소n]}}
ex)
items = {'code' : [101, 102, 103, 104, 105, 106, 107, 108],
'과목': ['수학', '영어', '국어', '체육', '미술', '사회', '도덕', '과학'],
'수강생':[15, 15, 10, 50, 20, 50, 70, 10],
'선생님': ['김민수','김현정','강수정', '이나리', '도민성', '강수진', '김진성', '오상배']}
df = pd.DataFrame(items)
print(df)
**df.head() --> 상위 5개의 행만 출력
**df.tail() --> 하위 5개의 행만 출력
**de.sample(숫자) --> 랜덤으로 x개의 행만 출력
concat -->두 개의 데이터프레임 합침
ex) total_df = pd.concat([df, df2])
print(total_df)
데이터프레임을 csv로 저장
ex)
total_df.to_csv('data.csv', index=False)
csv를 데이터프레임으로 읽기
ex)
new_df = pd.read_table('data.csv', sep=',')
new_df
**BeautiflSoup
--> html문서를 탐색해서 원하는 부분만 쉽게 뽑아내는 라이브러리
requests.get(URL) --> html문서에 담긴 내용 가져오는 것
ex)
import requests
webpage = requests.get("https://www.daangn.com/hot_articles")
print(webpage.text)
id --> 한 페이지에 하나. 하나의 태그만 사용할 수 있음
ex) 로고, 상단메뉴, 하단정보 등
*class --> 한 페이지에 반복적으로 사용되는 스타일 정의
*div --> 가로공간 전체 차지
*span --> 문장의 길이공간만큼만 차지
*p --> paragraph
*h --> head (h1, h2, h3 등)
-requests를 불러온다
-beautifulsoup4에서 beautifulsoup을 불러온다
-request.get()으로 웹페이지를 요청한다
-여기서 받아낸 문서를 .content로 지정한 다음 beautifulsoup을 통해 -인스턴스 soup으로 저장. html문법을 기반으로 파싱(분석)
soup 출력
idx2word
인덱스 to word --> 코드로부터 어떤 카테고리인지 확인하기 쉽게 하는 사전같은 역할
ex)
idx2word = {'101' : '경제', '102' : '사회', '103' : '생활/문화', '105' : 'IT/과학'}
**
다음은 BeautifulSoup를 이용해서 원하는 페이지 수와, 카테고리 번호, 날짜를 입력하면 해당 URL에 접속하여 뉴스 url 리스트를 리턴하는 함수 만들기
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)
news = requests.get(url)
soup = BeautifulSoup(news.content, 'html.parser')
news_list = soup.select('.newsflash_body .type06_headline li dl')
news_list.extend(soup.select('.newsflash_body .type06 li dl'))
for line in news_list:
urllist.append(line.a.get('href'))
return urllist
#크롤링할 페이지 수, 카테고리, 날짜
#1 ~ page_num까지 정해진 페이지만큼 반복.
#함수의 입력으로 된 변수들로 주소를 조합
#BeautifulSoup 모듈을 사용하여 HTML 페이지를 분석
#case1
#case2
#뉴스 리스트에 있는 각 뉴스로부터 a 태그인 <a href = '주소'>
에서 '주소'만 가져오기.
이제 뉴스URL리스트를 받아보자.
url_list = make_urllist(2, 101, 20200506)
print('뉴스 기사의 개수 :',len(url_list))
출력 : 뉴스 기사의 개수 : 40
url_list[:5]
출력:
['https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=057&aid=0001451723',
'https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=057&aid=0001451721',
'https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=057&aid=0001451718',
'https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=003&aid=0009849190',
'https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=057&aid=0001451717']
아래는 newspaper3k를 통해서 만들어진 함수. url 리스트와 해당 url이 어떤 카테고리인지 코드를 알려주면 이를 통해 데이터프레임을 생성한다.
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)
df = pd.DataFrame({'news': text_list})
df['code'] = idx2word[str(code)]
return df
data = make_data(url_list, 101)
data[:10] # 상위 10개 출력
데이터 저장하기
code_list = [102, 103, 105]
def make_total_data(page_num, code_list, date):
df = None
for code in code_list:
url_list = make_urllist(page_num, code, date)
df_temp = make_data(url_list, code)
print(str(code)+'번 코드에 대한 데이터를 만들었습니다.')
if df is not None:
df = pd.concat([df, df_temp])
else:
df = df_temp
df = make_total_data(2, code_list, 20200506)
출력:
102번 코드에 대한 데이터를 만들었습니다.
103번 코드에 대한 데이터를 만들었습니다.
105번 코드에 대한 데이터를 만들었습니다.
print('뉴스 기사의 개수 :',len(df))
출력: 뉴스 기사의 개수 : 120
계획
URL주소 분석
HTML구조 파악
newspaper3k설치
requests 임포트
패키지 newspaper에서 모듈 article 임포트
pandas패키지 임포트 (=pd)
bs4(beautifulsoup4)에서 모듈 BeautifulSoup임포트
변수로 URL완성
URL에 있는 HTML소스코드 가져오기
패키지 requests에 있는 get모듈 사용
변수이름 = requests.get(URL)
변수이름.content
#'import 패키지이름' 형식으로 임포트했다면 '패키지이름.모듈이름' 으로
크롤링 차단방지 코드 넣기
Beautifulsoup이용해서 원하는 페이지수, 카테고리 번호, 날짜입력해서 URL리스트 리턴받는 함수 만들기 (make_urlist)
newspaper3k로 기사 저장하기
idx2word로 카테고리 값 보기쉽게 변경
newspaper3k로 데이터프레임 생성함수 만들기(make_data)
코드리스트, 날짜, 페이지 수를 입력으로 받는 함수 만들기
(make_total_data - 앞서 만든 make_urlist, make_data함수 호출)
csv파일로 별도 저장