[나도코딩] 파이썬 웹스크래핑(Web Scraping)(HTML, XPath, Requests, 정규식)

728x90

웹 스크래핑 영상: https://www.youtube.com/watch?v=yQ20jZwDjTE&list=PLMsa_0kAjjrd8hYYCwbAuDsXZmHpqHvlV&index=5

 

얼마 전 데이터 분석 입문 공부할 때 유튜버 나도코딩님의 강의를 들으며 많은 도움을 받았는데 이번에 웹 크롤링에 관심이 생겨 알아보던 중 마침 좋은 영상이 있길래 공부하게 되었습니다. 파이썬 입문자분들 나도코딩님 강의 추천드립니다!

 

1. 웹 스크래핑과 웹 크롤링의 차이

  • 웹 스크래핑: 웹 페이지에서 내가 원하는 데이터를 추출하는 것.
  • 웹 크롤링: 웹 페이지에서 주어진 링크들을 따라가며 모든 데이터를 추출하는 것

 

2. HTML

 

웹 구성하는 세가지 요소

: HTML, CSS, JAVASCRIPT

 

HTML(Hyper Text Markup Language)

: 웹페이지를 만들 때 사용되는 언어 

 

간단한 HTML 실습 - 로그인 페이지 만들기

<html>
    <head>
        <meta charset = "utf-8">
        <title> 나도코딩 홈페이지</title>
    </head>   
        
    <body>
        <input type="text" value="아이디를 입력하세요">
        <input type="password">
        <input type="button" value="로그인">
        <a href="http://google.com">구글로 이동하기</a>
    </body>   
</html>
  • head: 홈페이지의 제목이나 html 문서를 위한 선행작업
  • body: 홈페이지 본문
  • type과 value는 attribute라고 하며 element의 세부 속성을 의미
  • 한글 깨짐 현상 해결을 위해  "utf-8"
  • w3school에서 HTML 연습할 수 있음

결과

 

3. XPath

 

XPath: HTML 내의 경로 접근을 위한 요소, 속성 등을 지정하는 언어

/학교/학년/반/학생[2]
//*[@학번="1-1-5"]

/html/body/div/span/a...
//*[@id="login"]

<학교 이름="나도 고등학교">
    <학년 value = "1학년">
        <반 value = "1반">
            <학생 value="1번" 학번="1-1-1">이지현</학생>
            <학생 value="2번" 학번="1-1-2">최다솔</학생>
            <학생 value="3번" 학번="1-1-3">강채영</학생>
            <학생 value="4번" 학번="1-1-4">지정민</학생>
            <학생 value="5번" 학번="1-1-5">이지현</학생>
        </반>
        <반 value = "2반"/>
        <반 value = "3반"/>
        <반 value = "4반"/>
    </학년>

    <학년 value = "2학년"/> ... 3반 유재석 <...>
    <학년 value = "3학년"/>

</학교>

 

4. Requests

- HTML 문서의 정보를 가져올 때 사용

 

import requests
# res = requests.get("http://naver.com")
res = requests.get("http://nadocoding.tistory.com")
print("응답코드 : ", res.status_code) # 200 : 정상 403 : 접근 권한 없음 

if res.status_code == requests.codes.ok:
    print("정상입니다.")
else:
    print("문제가 생겼습니다. [에러코드 ", res.status_code, "]")

# if문 대신 사용 가능
res.raise_for_status() # HTML 문서를 가져오지 못한 경우 에러 발생 & 프로그램 종료
print("웹 스크래핑을 진행합니다")
# 기본적인 형식
res = requests.get("http://nadocoding.tistory.com")
res.raise_for_status()

print(len(res.text))
print(res.text)

# 파일로 만들기
with open("mygoogle.html", "w", encoding="utf8") as f:
    f.write(res.text)

 

5. 정규식

 

import re
#ca?e 검색 using 정규식
p = re.compile("ca.e") 
# . : 하나의 문자 의미
# ^ : 문자열의 시작
# $ : 문자열의 끝

def print_match(m):
    if m:
        print("m.group(): ",m.group()) # 일치하는 문자열 반환
        print("m.string: ",m.string) # 입력받은 문자열 반환
        print("m.start(): ",m.start()) # 일치하는 문자열의 시작 index
        print("m.end(): ",m.end()) # 일치하는 문자열의 끝 index
        print("m.span(): ",m.span()) # 일치하는 문자열의 시작 / 끝 index
    else:
        print("매칭되지 않음")

m = p.match("careless")
# match : 주어진 문자열의 처음부터 일치하는지 확인
# group : 매치된 경우 매치된 문자열 출력 & 매치되지 않으면 에러 발생

m = p.search("good care")
# search : 주어진 문자열 중에 일치하는게 있는지 확인

lst = p.findall("good care cafe") #findall : 일치하는 모든 것을 리스트 형태로 반환
  • . : 하나의 문자 의미
  • ^ : 문자열의 시작
  • $ : 문자열의 끝
  • p = re.compile("원하는 형태")
  • m = p.match("비교할 문자열") : 주어진 문자열의 처음부터 일치하는지 확인
  • m = p.search("비교할 문자열") : 주어진 문자열 중에 일치하는게 있는지 확인
  • lst = p.findall("비교할 문자열") : 일치하는 모든 것을 "리스트" 형태로 반환
  • 원하는 형태: 정규식

 

728x90