[TIL] 내용수집 함수만들기 (pandas)
by Holly Yoon1. Ipynb 파일확장자란?
- iPython notebook의 약자
- Jupyter로 이름이 변경됨 (더 많은 언어를 포용하겠다는 의지로)
- iPython으로 쓰여진 대표적인 책 > Python Data Science Handbook
- .py 파일 편집은 파이썬 내장 IDE, 메모장, VScode, PyCharm, 서브라임 텍스트, VI편집기등 사용해도 됨
- 파일 경로 확인하기
%pwd
import os
os.getcwd()
- 자동완성 (tab키)
%config Completer.use_jedi = False
2. 자주 쓰는 단축키
- 실행모드 (ESC) : a(위에 셀 생성) b(아래에 셀 생성) dd(삭제) m(마크다운셀로 변경) m(마크다운 셀) y(코드 셀)
- 편집모드 (Enter) : shift+enter(셀 실행 후 다음셀 이동) ctrl+enter(해당 셀만 실행, 이동 안함)
3. 서울120 데이터 수집
- try/except로 예외처리
- 중간에 저장하는 방법
- tqdm으로 전체 데이터 수집
- read_html을 통해서 여러개의 dataframe을 병합하는 방법
3-1) pd.read_html / bs4
base_url = '<https://opengov.seoul.go.kr/civilappeal/list>'
table = pd.read_html(base_url, encoding='utf-8')[0]
response = requests.get(base_url)
html = bs(response.text)
3-2) 링크 no불러오고 기존 테이블에 합쳐주기
a_list = html.select('td.data-title>a')
link_no = [a['href'].split('/')[-1] for a in a_list]
temp=pd.read_html(response.text)[0]
temp['내용번호']=link_no
3-3) get_one_page(page_no) 함수 만들기 : try는 에러 발생이 나올만한 부분에 넣어주어야함
def get_one_page(page_no):
"""
120 주요질문의 특정 페이지 목록을 수집
1) page_no 마다 url이 변경되게 f-string 을 사용해 만든다.
2) requests 를 사용해서 요청을 보내고 응답을 받는다.
3) pd.read_html 을 사용해서 table tag로 게시물을 읽어온다.
4) 3번 결과에서 0번 인덱스를 가져와 데이터프레임으로 목록의 내용을 만든다.
5) html tag를 parsing할 수 있게 bs 형태로 만든다.
6) 목록 안에 있는 a tag를 찾는다.
7) a tag 안에서 string 을 분리해서 내용번호만 리스트 형태로 만든다.
8) 4)의 결과에 "내용번호"라는 컬럼을 만들고 a tag의 리스트를 추가한다.
9) 없는 페이지번호가 들어왔을 때의 오류에 대처한다.
10) 반환값을 지정한다.
"""
url=f'<https://opengov.seoul.go.kr/civilappeal/list?items_per_page=50&page={page_no}>'
try :
response=requests.get(url)
table=pd.read_html(url, encoding='utf-8')[0]
html=bs(response.text)
a_list=html.select('td.data-title>a')
link_no=[a['href'].split('/')[-1] for a in a_list]
table['내용번호']=link_no
except ValueError:
print('page_no is wrong')
return table
3-4) 반복문을 활용한 여러 페이지 수집하기
- 방법1)빈페이지는 아닌데, 데이터가 없는 경우 None이 안나온다
# time.sleep을 통해 일정 간격 쉬었다가 가져옵니다.
# 게시물이 없으면 멈춥니다.
page_no=1
table_list=[]
while True :
df_one = get_one_page(page_no)
if df_one is None or len(df_one)==0:
break
table_list.append(df_one)
print(page_no, end=',')
page_no += 1
time.sleep(0.01)
- 방법2)df_one을 df로 만들어준다
page_no=1
table_list=[]
df_one=[]
while True :
df_one = get_one_page(page_no)
if len(df_one)==0:
break
table_list.append(df_one)
print(page_no, end=',')
page_no += 1
time.sleep(0.01)
3-5) 파일 합치고 저장하기
# 여러 페이지의 내용을 하나로 병합합니다.
df=pd.concat(table_list, ignore_index=True)
# 저장할 파일명
file_name = "seoul-120-list.csv"
# CSV 파일로 저장하기
df.to_csv(file_name, index=False)
# 저장한 파일 확인
pd.read_csv(file_name)
4. 일부 내용수집/전체 내용 가져오기
- bs를 사용해 내용을 읽어오기
- 문서 정보의 표를 df로 가져와서 표를 다루기 (set_index()/transpose()/concat())
4-1) 표로 가져오기 : transpose() <행열 위치 전환>/reset_index(drop=True) <index재정의&삭제>
pd.concat([df1,df2],axis=1,ignore_index=False) <합치면서 기존 index값을 유지하기>
# 해당 문의가 어떤 분류에 해당되는지 알기 위해 분류를 수집합니다.
def get_desc(response):
""" 분류 수집하기
1) 테이블의 0, 1 번째 데이터 가져와서 0번째 컬럼을 인덱스로 만들고 전치행렬 만들기
2) 테이블의 2, 3 번째 데이터 가져와서 2번째 컬럼을 인덱스로 만들고 전치행렬 만들기
3) 1), 2) 번에서 만든 값을 concat으로 병합하기
4) 병합한 값 반환하기
"""
df_desc=pd.read_html(response.text)[-1]
tb01 = df_desc[[0,1]].set_index(0).transpose()
tb02 = df_desc[[2,3]].set_index(2).T
tb02.index = [1]
table = pd.concat([tb01,tb02],axis=1)
return table
# 함수가 잘 만들어졌는지 확인하기
get_desc(response)
# 해당 문의가 어떤 분류에 해당되는지 알기 위해 분류를 수집합니다.
def get_desc(response):
""" 분류 수집하기
1) 테이블의 0, 1 번째 데이터 가져와서 0번째 컬럼을 인덱스로 만들고 전치행렬 만들기
2) 테이블의 2, 3 번째 데이터 가져와서 2번째 컬럼을 인덱스로 만들고 전치행렬 만들기
3) 1), 2) 번에서 만든 값을 concat으로 병합하기
4) 병합한 값 반환하기
"""
df_desc=pd.read_html(response.text)[-1]
tb01 = df_desc[[0,1]].set_index(0).T.reset_index(drop=True)
tb02 = df_desc[[2,3]].set_index(2).T.reset_index(drop=True)
table = pd.concat([tb01,tb02],axis=1,ignore_index=False)
return table
# 함수가 잘 만들어졌는지 확인하기
get_desc(response)
'TIL' 카테고리의 다른 글
비즈니스 분석 (1) #ARPU #ARPPU (0) | 2023.03.01 |
---|---|
대용량 파일 관리 - parquet, downcast (0) | 2023.02.27 |
[TIL] 네이버 종목토론실 스크래핑 (0) | 2023.01.12 |
[TIL] 스크랩핑 with Pandas (0) | 2023.01.12 |
[TIL] Pandas 시작하기 (0) | 2023.01.10 |
블로그의 정보
Study Log by Holly
Holly Yoon