본문 바로가기
Programming Basics

[크롤링] 게시글 제목 크롤링해서 DataFrame으로 만들기

by ISLA! 2023. 10. 4.

 

'공모전 분석사례' 게시글 제목을 크롤링

  • 서울특별시 빅데이터 캠퍼스의 공모전 우수 사례를 분석하기 위함

✔ 목표 : 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=&currentPage={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