Programming Basics
[크롤링] 게시글 제목 크롤링해서 DataFrame으로 만들기
ISLA!
2023. 10. 4. 13:26
'공모전 분석사례' 게시글 제목을 크롤링
- 서울특별시 빅데이터 캠퍼스의 공모전 우수 사례를 분석하기 위함
✔ 목표 : 98개의 게시물 제목 크롤링해서 데이터프레임으로 만들기
✔ 게시물 제목 예시 : 서울시 차 없는 거리 효과 분석과 우선 입지 선정 [2022 빅데이터캠퍼스 공모전 - 우수상]
목표
- 제목 + [연도 공모전명 수상내용] 으로 구성되어 있어,
- 제목 컬럼 / 연도 컬럼 / 수상내역 컬럼의 3개 컬럼으로 데이터프레임을 만들어보자.
라이브러리 불러오기
from bs4 import BeautifulSoup
import requests
from lxml import html
import pandas as pd
크롤링 코드
- 크롤링하려는 Url을 확인한다 : 잘 보면 url 마지막부분이 페이지 수 번호라는 것을 알 수 있다.
- 총 1~ 10 페이지가 있으므로 For 문으로 한 페이지씩 돌며 게시글 제목을 크롤링하기로 한다.
- requests.get(url)로 HTTP GET 요청을 url로 보내고, 서버로부터 응답을 받는다.
- 받은 HTML 응답 텍스트를 사용하여 html.fromstring 메서드를 사용하여 파싱하고, 파싱된 트리를 tree 변수에 저장한다.
- Xpath 를 사용하여 tree에서 게시물 제목에 해당하는 부분을 선택하고 이를 page_post_titles 변수에 저장한다.
- pd.concat을 사용하여 기존 데이터프레임 df 와 새로 생성된 데이터 프레임(게시글 제목)을 합치고, 인덱스를 재설정한다.
# 빈 데이터프레임 생성(제목 저장)
df = pd.DataFrame(columns = ['Title'])
# 1에서 10까지의 페이지에 대한 반복문
for page_number in range(1, 11):
url = f"https://bigdata.seoul.go.kr/noti/selectPageListTabNoti.do?r_id=P260&bbs_seq=&ac_type=A1&sch_type=&sch_text=¤tPage={page_number}"
response = requests.get(url)
tree = html.fromstring(response.text)
# XPath를 사용하여 모든 게시물 제목 선택
page_post_titles = tree.xpath('//*[@id="aform"]/div[1]/div/table/tbody/tr/td[2]/a/@title')
# df 에 저장
df = pd.concat([df, pd.DataFrame({'Title':page_post_titles})], ignore_index = True)
df
정규표현식을 사용하여 내용을 구분하여 저장
- 크롤링한 게시글 제목을 원하는 부분으로 구분하여 저장한다.
- 이때, 연도와 수상내역은 정규표현식으로 추출한다.
df['Main_Title'] = df['Title'].str.split('[').str[0].str.strip()
# '[' 다음에 연속된 숫자를 추출
df['Year'] = df['Title'].str.extract(r'\[([\d]+)')
# '-'와 ']' 사이의 모든 문자열을 추출
df['Award'] = df['Title'].str.extract(r' - ([^\]]+)')
df.head()
불필요한 컬럼 삭제 후, Csv 저장
df.drop('Title', axis = 1, inplace = True)
df.to_csv('BigdataContest.csv', index = False, encoding = 'utf-8')
df
728x90