DevSSOM

파이썬 크롤링 - BeautifulSoup 기본 개념 본문

Python/크롤링

파이썬 크롤링 - BeautifulSoup 기본 개념

데브쏨 2021. 6. 21. 13:42
반응형

크롤링이란?

: 웹 페이지에서 필요한 데이터를 추출해내는 작업. 크롤링을 하는 프로그램은 크롤러라고 함.

 

BeautifulSoup 라이브러리

: HTML, XML, JSON 등 파일의 구문을 분석하는 모듈. 웹 페이지를 표현하는 HTML을 분석하기 위해 사용함.

1. BeautifulSoup 시작하기

HTML 파일로 BeautifulSoup 객체를 만들 수 있음. 변수 이름은 관습적으로 soup이라고 지음. "html.parser"의 의미는, BeautifulSoup 객체에게 "HTML을 분석해라"라고 알려주는 것. "html.parser"는 파이썬 내장 클래스. 별도로 써주지 않으면 BeautifulSoup 객체는 자동으로 "html.parser"가 작동됨.

soup = BeautifulSoup(open("index.html"), "html.parser")

# index.html이라는 html파일로 BeautifulSoup 객체를 만들어줌

cf. open() 함수는 파일에 대한 객체를 만드는 함수

open("data.txt")

 

2. 태그 추출하기

  • find, find_all() : HTML 태그를 추출하는 메소드. find는 HTML 태그 한 개를 추출할 수 있고, find_all은 HTML 태그를 여러 개 담고 있는 리스트를 얻을 수 있음. 
soup.find("p")        # 처음 등장하는 p 태그 찾기
soup.find_all("p")    # 모든 P 태그 찾기
print(soup.find("p"))
print(soup.find_all("p"))


""" 출력 결과
<p></p>
[<p></p>, <p></p>, ..., <p></p>] """

 

Q. div 태그 중, 클래스가 crong인 것만 추출하려면 어떻게 해야될까?

<!DOCTYPE html>
...
<body>
    <div class = "pororo">
        <p>Don't crawl this.</p>
    </div>
    <div class = "crong">
        <p>Hello, Python Crawling!</p>
    </div>
</body>
soup.find("div")
soup.find("div", class_="crong")
    • class_ 매개변수 : class_ 매개변수에 값을 저장함으로써 특정 클래스를 가진 태그를 추출할 수 있음. class라는 단어가 파이썬에서 예약어로 사용되기 때문에, class 뒤에 꼭 언더바 _ 를 붙여줘야 함.

 

soup.find("div", class_="crong").find("p")
  • find로 얻은 결과도 BeautifulSoup의 객체가 될 수 있음. 그래서 find를 한 결과에 또 find를 적용할 수 있는 것. 아래 코드는 div 태그의 crong 클래스 안에 있는 p 태그를 추출함.

 

  • get_text() : BeautifulSoup 객체에 get_text 메소드를 적용하면 태그에서 딱 텍스트만 출력됨. 
soup.find("div", class_="crong").find("p").get_text()
print(soup.find("p"))
print(soup.find("p").get_text())

""" 출력 결과
<p>Hello, Python Crawling!</p>
Hello, Python Crawling! """

 

  • id 매개변수 : 특정 id의 값을 추출하고자 할 때는 id 매개변수의 값을 지정할 수 있음.
soup.find("div")
soup.find("div", id= "crong")

 

 

3. requests 라이브러리

: 파이썬에서 HTTP 요청을 보낼 수 있는 모듈.

  * HTTP 요청이란?
    - GET 요청 : 정보를 조회하기 위한 요청 (ex. 네이버 홈페이지에 접속한다. 구글에 키워드를 검색한다)
    - POST 요청 : 정보를 생성, 변경하기 위한 요청 (ex. 웹 사이트에 로그인한다. 메일을 삭제한다)

실제로 웹 크롤링을 하기 위해서는 외부에 존재하는 웹사이트의 HTML 파일을 얻어야 함. 그걸 얻기 위해서 requests 라이브러리를 사용하는 거야.  

 

  • get() : 지정한 URL로 GET 요청을 보내면, 서버가 요청을 받아 처리하게 되면 result 변수로 응답을 받음. url을 get메소드의 매개변수로 넣어.
url = "https://www.google.com"
result = requests.get(url)

 

  • status_code : 응답의 status_code로는 요청의 결과를 알 수 있음. 만약 요청이 성공했다면 text로 해당 웹 사이트의 HTML을 얻을 수 있음.
print(result.status_code)    # 200은 성공 응답코드, 404는오류 응답코드
print(result.text)           # .text로 하면 html문서를 출력

 

  • 두 라이브러리의 조합 : requests와 BeautifulSoup을 조합해서 웹 페이지의 HTML을 분석할 수 있음.
soup = BeautifulSoup(result.text, "html.parser")

 

 

requests로 웹 페이지 HTML 문서 불러오기

requests 라이브러리를 이용하여 네이버의 HTML 문서를 불러와 출력하려면?

import requests
from bs4 import BeautifulSoup

url = "https://www.naver.com"

# url 변수에 담긴 url의 html 문서를 불러와 출력
req = requests.get(url)
print(req.text)

 

 

 

728x90
반응형
댓글