728x90
이 포스팅은 공모전 주제 선정, 공모전 수상작 사례의 케이스 스터디 우선순위를 결정하기 위해 게시판을 스크래핑한 내용이 담겨있다.
서울특별시 빅데이터 캠퍼스
서울특별시 빅데이터 캠퍼스
서울시 빅데이터 캠퍼스 공모전을 통해 빅데이터 분석결과를 도출하고 빅데이터 캠퍼스 웹사이트에 게시하여 시민 누구나 지식과 정보를 공유할 수 있습니다.
bigdata.seoul.go.kr
사이트에 접속하면 하단에 공모전 분석 사례 게시판이 보인다.
13 페이지에 걸쳐서 총 98개의 게시물이 있는 것을 확인할 수 있다.
크롤링 계획
- 지하철 9호선 신설역 수요인원 예측모델 개발 및 정책 제안 [2022 빅데이터캠퍼스 공모전 - 서울창조경제혁신센터장상 수상]
각각의 게시물에 위와 같이, 제목[년도 공모전이름 - 수상작] 형태로 구분되어 나누어져 있다.
따라서 게시물 제목에 해당하는 내용을 전부 크롤링한 뒤, 정규 표현식을 사용해서 연도 컬럼, 공모전이름 컬럼, 수상 컬럼을 추가할 것이다.
크롤링 코드 구현
Step01. 테스트 코드
from bs4 import BeautifulSoup
import requests
URL = 'https://bigdata.seoul.go.kr/noti/selectPageListTabNoti.do?r_id=P260&bbs_seq=&ac_type=A1&sch_type=&sch_text=¤tPage=1'
response = requests.get(URL)
source = response.text
soup = BeautifulSoup(source, 'html.parser')
Beautifulsoup 와 requests 라이브러리를 활용해서 크롤링할 것이다.
우선 첫번째 페이지를 테스트하여 크롤링하여, 에러 없이 코드가 잘 동작하는지 확인한다.
Steop02. 전체 크롤링 코드 (제목 크롤링 후 csv 파일에 저장)
xpath를 이용하여, html 에 제목을 찾고, csv 파일을 열어 내용을 입력하는 방식으로 코드를 작성해 주었다.
import requests
from lxml import html
import csv
whole_source = ""
for page_number in range(1, 11): # 페이지 번호(1~10까지)
URL = 'https://bigdata.seoul.go.kr/noti/selectPageListTabNoti.do?r_id=P260&bbs_seq=&ac_type=A1&sch_type=&sch_text=¤tPage=' + str(page_number)
response = requests.get(URL)
whole_source = whole_source + response.text
tree = html.fromstring(whole_source)
# XPath를 사용하여 데이터 추출
find_title = tree.xpath('//*[@id="aform"]/div[1]/div/table/tbody/tr/td/a/text()')
# 결과를 CSV 파일에 저장 (파일 이름: bigcam_title.csv)
with open('bigcam_title.csv', 'w', newline='', encoding='utf-8') as csv_file:
csv_writer = csv.writer(csv_file)
# 헤더 작성
csv_writer.writerow(['Title'])
# 데이터 작성
for title in find_title:
csv_writer.writerow([title])
print("결과가 bigcam_title.csv 파일에 저장되었습니다.")
Step03. 연도, 수상, 구분 컬럼 추가 및 가공
df['연도'] = df['Title'].str.extract('(\d{4})')
df['수상'] = df['Title'].apply(lambda x: x.rsplit('-', 1)[1] if '-' in x else None)
df['수상'] = df['수상'].str.extract('([가-힣]+)')
df['수상'] = df['수상'].str.replace('[^가-힣a-zA-Z0-9\[\]\s-]', '', regex=True)
df.loc[68:, '수상'] = None
# 공모전 구분
df.loc[0:60, '구분'] = '빅데이터캠퍼스 공모전'
df.loc[60:,'구분'] = '빅캠 상시 공모전'
df['Title'] = df['Title'].str.replace(r'\[.*\]', '', regex=True)
# 'Title' 컬럼에서 한글, 띄어쓰기, 숫자만 추출
df['Title'] = df['Title'].str.strip()
728x90
'Project' 카테고리의 다른 글
[카카오 지도 API] 반경 내 시설 정보 수집 with python (0) | 2023.11.09 |
---|