반응형
패키지 임포트¶
In [26]:
# 필요한 도구를 불러온다.
# 파이썬에서 사용할 수 있는 엑셀과 유사한 데이터분석 도구
import pandas as pd
# 매우 작은 브라우저로 웹사이트의 내용과 정보를 불러올 수 있습니다.
import requests
# request로 가져온 웹사이트의 html 태그를 파싱하는데 사용합니다.
from bs4 import BeautifulSoup as bs
# 랜덤숫자를 생성한다.
import random
import time
# 대량 데이터 처리시 진행 상황을 표시합니다.
from tqdm import tqdm, trange
# 정규표현식
import re
제안 연월 설정¶
In [27]:
year_month = 201910
페이지 번호대로 제안 목록을 가져오는 함수¶
In [28]:
# 연-월별 전체 제안 목록을 가져옵니다.
def get_suggestion_list(pnum):
base_url = f"https://www.innogov.go.kr/ucms/ogp/sug/list.do?pnum={pnum}&menuNo=300102&orderKey=registDtDesc"
response = requests.get(base_url)
if response.status_code == 200:
html = bs(response.text, 'html.parser')
tags = html.select("#content > div.suggestion_list > ul")[0].find_all('a')
if not tags:
return (suggestion_list)
else:
for tag in tags:
suggestion_list.append(tag['href'])
pnum +=1
# 페이지 번호를 하나씩 증가시켜 재귀 호출 진행
get_suggestion_list(pnum)
else:
return(suggestion_list)
페이지 번호 설정 및 함수를 호출하여 제안 목록 가져오기¶
In [29]:
suggestion_list = []
pnum = 1
get_suggestion_list(pnum)
제대로 href 태그 링크 가져왔는지 확인¶
In [30]:
print(len(suggestion_list))
suggestion_list[:3]
Out[30]:
In [31]:
## 태그 링크를 기반으로 게시물 내용을 가져오는 함수
In [32]:
def get_suggestion_content(url):
article = []
base_url = f"https://www.innogov.go.kr/{url}"
response = requests.get( base_url )
if response.status_code == 200:
html = bs(response.text, 'html.parser')
# 제목을 가져옵니다.
title = html.select(
'#content > div.vveiw_box1 > dl > dt')[0].get_text(strip=True)
# dd 태그에 있는 내용을 가져와서 카테고리, 시작일, 마감일, 제안인 정보를 추출합니다.
desc = html.select(
'#content > div.vveiw_box1 > div.vveiw_name > ul > li > dl > dd')
category = desc[0].get_text(strip=True)
content = html.select(
'#content > div.vveiw_box1 > div.vveiw_cont > div > pre')[0].get_text(strip=True)
start = desc[1].get_text(strip=True)
end = desc[2].get_text(strip=True)
author = desc[3].get_text(strip=True)
# 추천인원을 가져옵니다.
vote = html.select('#counter')[0].get_text(strip=True)
# 해당 게시물의 Id 값을 가져옵니다.
sgId = url.split('=')[2].split('&')[0]
article.append(sgId)
article.append(title)
article.append(category)
article.append(content)
article.append(start)
article.append(end)
article.append(vote)
article.append(author)
#print(article)
# time.sleep(random.randint(1,2))
return article
각 게시물의 세부 내용 가져오기¶
In [33]:
data = []
# tqdm 을 사용해서 어느정도 가져왔는지 확인하기
for i, suggestion in tqdm(enumerate(suggestion_list)):
# suggestion_list에 있는 각 게시물에 접근하여 카테고리, 시작일, 마감일, 제안인, 제목, 내용등을 가져옵니다.
s = get_suggestion_content(suggestion)
data.append(s)
In [34]:
column_names = ["sgId", "title", "category", "content", "start", "end", "vote", "author"]
column_names
Out[34]:
In [35]:
data = pd.DataFrame(data, columns=column_names)
data.head()
Out[35]:
In [36]:
data.tail()
Out[36]:
In [37]:
data.to_csv("./suggestion.csv", index=False)
In [38]:
pd.read_csv("./suggestion.csv").head()
Out[38]:
In [39]:
data.shape
Out[39]:
In [ ]:
반응형
'Programming > Python' 카테고리의 다른 글
UTF8 with BOM 으로 파일 인코딩해서 저장하기 (0) | 2021.04.14 |
---|---|
Dictionary 데이터에서 키 값만 추출하기 (0) | 2021.04.14 |
[Python-Basic] Class Data Type - 4(Self) (0) | 2019.11.05 |
[Python-Basic] Class Data Type - 4(Namespace) (0) | 2019.11.05 |
[Python-Basic] Class Data Type - 3(Inheritance) (0) | 2019.11.05 |