# [크롤링] 웹 크롤링 하기 01

2024. 12. 17. 12:52개발/웹 스크래핑


📌 본 포스팅은  파이썬을 사용한 웹크롤링 에 대한 내용을 다룹니다.
📌 맥환경, vscode 환경

1. 설치 및 기본 테스트

  • vscode -> 쉘에서 !를 붙이고 pip 설치 해준다.
  • !pip install requsts # 웹 사이트 정보 가져오기
  • !pip install beautifulsoup4 # html 정보로 부터 원하는 데이터 분류 및 parsing 라이브러리
  • request, response 는 사이트에 요청과 응답이다. status_code 200 이 나오면 잘 연결된것 임.
      ## request test 
      import requests 
      response = requests.get('http://www.naver.com')
      print(f"{response.status_code}") # 응답코드 출력
      print(response.text)

2. 네이버 지식인 크롤링 테스트

2.1 인터넷 창 작업

  • naver 지식인 검색 '파이썬'-> fn + f12(inspect mode) -> 특정 링크를 클릭해서 html 을 선택-> copy selector-> css

[copy 된 CSS selector ]
#s_content > div.section > ul > li:nth-child(1) > dl > dt

2.2 파이썬 코딩

    ### PYTHON CODE ###

    ## 2.2.1 네이버 in 크롬창의 url 복사 
    url = 'https://kin.naver.com/search/list.naver?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'

    response = requests.get(url)

    if response.status_code == 200:
        ## 2.2.2  html code 를 받음. 
        html = response.text

        ## 2.2.3  파싱을 위해 soup 객체 사용, html parser 사용
        soup = BeautifulSoup(html,'html.parser')

        ## 2.2.4  CSS selector 를 통해 원하는 엘리멘트 추출 
        title_1 = soup.select_one('#s_content > div.section > ul > li:nth-child(1) > dl > dt')
        print(title_1)
        ## text 추출 
        print(title_1.text)
        ## 2.2.5 검색 결과 부분 <li> 태그로 반복되는 부분을 체크 
        ul = soup.select_one('ul.basic1')

        ## 2.2.6  지식인에서 검색된 목록중 제목만 추출
        title_2 = ul.select("li>dl>dt>a")
        print(f"추출 4 {title_2}")
        for i in title_2:
            print(i.get_text())
    else: print(response.status_code)

출력 결과

 

📌 크롤링은 html 위치 찾고 print 해가면서 원하는 자료에 접근하는 능력이 필요하다. 인터넷 창에서 한번에 inspect 를 찾는것보다 inspect 창에서 일일히 토글을 풀어가면서 창에서 하이어라키를 확인해가며 요소를 찾는 것이 사이트 전체 구조를 익히는데 도움이 된다.

3. 야구 타자 테이블 크롤링 하기

2.1 크롬 inspector 작업

### PYTHON CODE ###

# URL address
#https://www.koreabaseball.com/Record/Player/HitterBasic/BasicOld.aspx?sort=HRA_RT

# INSPECTOR 
#cphContents_cphContents_cphContents_udpContent > div.record_result > table
#contents > h4

2.2 Beuatifulsoup 을 사용하여 html parsing

## LIBRARY 
import requests
from bs4 import BeautifulSoup

url ='https://www.koreabaseball.com/Record/Player/HitterBasic/BasicOld.aspx?sort=HRA_RT'
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')

2.3 타이틀 엘레먼트 추출 (기록실)

title = soup.select_one("#contents > h4")
print(title.get_text())

## inspector 주소 추출 
#cphContents_cphContents_cphContents_udpContent > div.record_result > table
record_table = soup.select_one("#cphContents_cphContents_cphContents_udpContent > div.record_result > table")
# print(record_table.get_text())

2.4 타자 기록 요소 추출

## table 안에 table body 추출 
#cphContents_cphContents_cphContents_udpContent > div.record_result > table > tbody
record_tr = soup.select_one("#cphContents_cphContents_cphContents_udpContent > div.record_result > table > tbody")
# print(record_tr)

repeat_tr = record_tr.select('tr')

2.5 타자 기록 요소 판다스 테이블만들기

import pandas as pd

tr = []
for rec in repeat_tr:
    a ={f"d{i}":rec.select_one(f"td:nth-child({i})").get_text() for i in range(1,20)}
    tr.append(a)

column_name = ['순위','선수명','팀명','타율', '경기','타석', '타수', '안타', '2루타', '3루타', '홈런', '타점', '도루', '도루실패', '볼넷', '사구', '삼진', '병살타', '실책']
len(column_name)
tr_df = pd.DataFrame(tr)

tr_df_col_rename = {f"{di}": column_name[name] for name,di in enumerate(tr_df.columns)}
tr_df.rename(columns=tr_df_col_rename,inplace=True)
tr_df