재원's 블로그

crawling3 (크롤링3) 본문

Python

crawling3 (크롤링3)

KimJ.W 2023. 1. 24. 13:37

최초 작성일 : 2021-01-08
categories: Python


오늘은 국토교통부 - KRic(철도통계)

여기에 들어가서 '도시철도여객수송'의 데이터를 크롤링 해서 가져 오고

'DataFream' 형태로도 만드는 실습을 했다.

아래는 코드와 실행 화면들이다.

1. 스크래핑 요청

import requests
url = "http://www.kric.go.kr/jsp/industry/rss/citystapassList.jsp?q_org_cd=A010010021&q_fdate=2021"

html_text = requests.get(url).text
print(html_text)

홈페이지에 있는 내용을 그대로 가져왔다.

<실행 화면>

crawling-train1
crawling-train2

2. Parsing

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_text, "html.parser")
soup

<실행 화면>

crawling-train3
crawling-train4
crawling-train5

3. Transformation

table_df = soup.find("table", class_="listtbl_c100")
print(table_df)

<실행 화면>

crawling-train6

trs = table_df.find("tbody").find_all("tr")
trs[2]

<실행 화면>

crawling-train7

tdcols = trs[1].find("td", {"class" : "tdcol"}) # '{}' 는  딕셔너리로 묶는다는 의미
print(tdcols)

<실행 화면>

crawling-train9

tds = trs[4].find_all("td")
#print(tds)

tds[0].get_text(), tds[2].get_text(),tds[3].get_text()

<실행 화면>

crawling-train10

tds[0].get_text(), tds[2].get_text(),tds[3].get_text()

<실행 화면>

crawling-train11

trs[1:]

<실행 화면>

crawling-train12
crawling-train13

stationPass = []
for tr in trs[1:]:
  dic = {}
  tbs = tr.find_all("td")
#  print("역:",tds[0].get_text())
#  print("승차인원:",tds[2].get_text())
#  print("승차인원:",tds[3].get_text())
  dic["승차역"] = tds[0].get_text()
  dic["승차인원"] = tds[2].get_text()
  dic["하차인원"] = tds[3].get_text()
  stationPass.append(dic)

print(stationPass)

<실행 화면>

crawling-train14

import pandas as pd
pd.DataFrame(stationPass) 

<실행 화면>

crawling-train15

아래의 코드는 실행시키면 'csv'파일 이나 'xlsx(엑셀)' 파일이
생성되어 저장되고 홈페이지에서 가져온 데이터가 데이터 프레임 형태로
변환되는 코드이다.

import pandas as pd
import requests
from bs4 import BeautifulSoup

def main():
    print("main function is executing....\n")

    # 빈 데이터 프레임 생성
    data_all = pd.DataFrame()
    for i in range(1, 20):
        url = "https://www.kric.go.kr/jsp/industry/rss/citystapassList.jsp?q_org_cd=A010010021&q_fdate=2021&pageNo=1"
        html_text = fetch(url) # <----- 크게 신경 안써도 됨.
        soup = parser(html_text) # <----- 크게 신경 안써도 됨.
        df = transforming(soup) # <---- 수정
        data_all = pd.concat([data_all, df])
         
    print(data_all.head())
    print(data_all.tail())
    print(data_all.shape)

    save_csv(data_all)
def fetch(url):
    print("fetch function is executing....\n")
    html_text = requests.get(url).text
    print("html_text")

    return html_text

def parser(text):
    print("parser function is executing....\n")
    return BeautifulSoup(text, "html.parser")

def transforming(soup):
    tab = soup.find("table", {"class": "listtbl_c100"})
    trs = tab.find("tbody").find_all("tr")
    stationpassengers = []
    if "합계" in trs[0].find("td", {"class":"tdcol"}):
        for tr in trs[1:]:
            dic = {}
            tds = tr.find_all("td")
            dic["station"] = tds[0].text
            dic["ride"] = tds[2].text
            dic["alright"] = tds[3].text
            stationpassengers.append(dic)
    # print(pd.DataFrame(stationpassengers))
        data = pd.DataFrame(stationpassengers)
    else:
        for tr in trs:
            dic = {}
            tds = tr.find_all("td")
            dic["station"] = tds[0].text
            dic["ride"] = tds[2].text
            dic["alright"] = tds[3].text
            stationpassengers.append(dic)
        # print(pd.DataFrame(stationpassengers))
        data = pd.DataFrame(stationpassengers)
    return data

def save(save_path, data):
    data.reset_index(drop=False)
    print(data.head())
    # pip install openpyxl
    data.to_excel(save_path + '/content/drive/MyDrive/crawling data/kric.csv', index = False, header=False, encoding='utf-8-sig')

def save_db(data):
  ## <-- DB 연동 예제 추가 할 코드

  pass

if __name__ == "__main__":
    main()
    # 크롤링
    # csv 파일 내보내기
    # DB 연동

<실행 화면>

crawling-train16

'Python' 카테고리의 다른 글

crawling basic (크롤링 기본)  (0) 2023.01.24
crawlig2 (크롤링2)  (0) 2023.01.23
python def, decorator  (0) 2023.01.23
Missing value2 (결측치2)  (0) 2023.01.23
Missing value (결측치)  (0) 2023.01.23