Ssoon

[ 혼공데분 - Chapter02 ] 데이터 수집하기 - 웹 스크래핑 사용하기 본문

혼자 공부하는 데이터분석

[ 혼공데분 - Chapter02 ] 데이터 수집하기 - 웹 스크래핑 사용하기

구구달스 2024. 1. 14. 19:14

웹 스크래핑 / 웹 크롤링

  • 프로그램으로 웹사이트의 페이지를 옮겨 가면서 데이터를 추출하는 작업

검색 결과 페이지 가져오기

  • "20대가 가장 좋아하는 도서목록" 을 gdown 패키지로 코랩으로 다운로드
import gdown
gdown.download('http://bit.ly/3q9SZix', '20s_best_book.json', quiet=False)

  • 판다스 데이터프레임으로 불러 온 후 head( ) 메서드로 처음 5개 행 출력
import pandas as pd
books_df = pd.read_json('20s_best_book.json')
books_df.head()

  • 'no' 열 부터 'isbn13' 열 까지만 선택해서 새로운 데이터프레임 생성
  • 데이터프레임에서 특정 열만 선택 : 원하는 열 이름을 리스트로 만들어 데이터프레임의 인덱스처럼 사용
books = books_df[['no','ranking','bookname','authors','publisher','publication_year','isbn13']]
books.head()

💠 데이터프레임 행과 열 선택하기 : loc 메서드

  • loc는 메서드 이지만 대괄호를 사용하여 행의 목록과 열의 목록을 받습니다.
  • loc 메서드의
    • 1번째 매개변수로 행 인덱스 0과 1을 리스트로 전달
    • 2번째 매개변수로 열 이름 'bookname', 'authors' 을 리스트로 전달
  • 1번째, 2번째 행의 도서명과 저자만 추출하여 데이터프레임 생성
books_df.loc[[0,1], ['bookname','authors']]

  • 리스트 대신 슬라이스 연산자 가능
books_df.loc[0:1, 'bookname':'authors']

  • loc 메서드의 슬라이싱 ▶ 마지막 항목도 포함
  • 시작과 끝을 지정하지 않고 슬라이스 연산자를 사용 ▶전체를 의미
  • 전체 행과 'no'열에서 'isbn13'열까지 선택
books = books_df.loc[:,'no':'isbn13']
books.head()

💠 검색 결과 페이지 HTML 가져오기 : request.get( ) 함수

  • request 패키지 임포트하고 request.get( ) 함수로 1번째 도서 검색 결과 페이지를 HTML 로 가져오기
  • 1번째 도서의 ISBN 과 yes24 검색 결과 페이지 URL 을 위한 변수 정의 ▶ request.get( ) 함수를 호출 ▶ 파이썬 문자열의 format( )메서드 사용 ▶ isbn 변수에 저장된 값을 url 변수에 전달 ▶ url 변수에 이쓴ㄴ 중괄호 부분이 isbn값으로 변경
import requests
isbn = 9791190090018
url = 'http://www.yes24.com/Product/Search?domain=BOOK&quesry={}'
r = requests.get(url.format(isbn))
  • requests.get( )함수가 반환한 응답 객체를 사용해 도서 검색 결과 페이지 HTML 출력

HTML 에서 데이터 추출하기 : 뷰티플수프

  • 뷰티플 수프
    • HTML 안에 있는 내용을 찾을 때 사용

💠 크롬 개발자 도구로 HTML 태그 찾기

  • F12 / 개발자 도구 열기
  • Select 아이콘 클릭 ▶ 이름 위에 마우스를 올리면 ▶ HTML 위치가 나타남

  • 뷰티플수프 패키지에서 BeautifulSoup 클래스를 임포트
from bs4 import BeautifulSoup
  • 이 클래스의 객체 생성
    • 1번째 매개변수 ▶ 파싱할 HTML 문서
    • 2번째 매개변수 ▶ 파싱에 사용할 파서
soup = BeautifulSoup(r.text, 'html.parser')

💠 태그 위치 찾기 : find( ) 메서드

  • 1번째 매개변수 ▶ 찾을 태그 이름
  • attrs 매개변수 ▶ 찾으려는 태그의 속성을 딕셔너리로 지정
  • <a> 태그 추출
    • prd_link 는 뷰티플 수프의 Tag 클래스 객체
prd_link = soup.find('a', attrs={'class','gd_name'})
  • print( ) 함수로 출력 태그 안에 포함된 HTML 출력
print(prd_link)
Comments