본문 바로가기
프로그래밍 언어/Python 3

[Python/웹크롤링] 크롤링 정리 - 1

by Physics 2023. 11. 19.
728x90

(Update: 2023/11/19) 현재 기본적인 내용들만 웹상에서 정리를 하고 있는 중..

크롤링이란? 
1) 웹 크롤러란?
"A Web crawler, sometimes called a spider or spider bot and often shortened to crawler, is an Internet bot that systematically browses the World Wide Web, typically for Web indexing (web spidering)" 
2) 크롤링이란? 
  - 인터넷 상에서 우리가 원하는 데이터 (메타데이터 등)을 추출하는 것     
  - WWW를 탐색해나가는 행위 

웹 파싱 (Parsing): 웹 상의 자연어, 컴퓨터 언어 등의 일련의 문자열을 분석하는 프로세스 
(1) "Parsing, syntax analysis, or syntactic analysis is the process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar" 
(2) 일련의 문자열로 구성된 문서를 의미있는 토큰(token)으로 분해하고 토큰으로 구성된 파스 트리(Parse tree)를 만드는 것 

웹 스크래핑 (Scraping): 다양한 웹사이트로부터 데이터를 추출하는 기술
"Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites." 

기본적인 크롤링 메커니즘 
   (1) 파이썬으로 웹서버에 정보 요청 
   (2) 서버 응답을 받은 후, 데이터 핸들링 
   (3) 웹사이트와 상호작용  

파이썬에서 크롤링을 하는 법: 기본적으로 파이썬에서 웹 데이터를 파싱하는 것은 크게 두 단계로 나누어진다. 
   (1) requests 모듈을 사용하여 HTML 코드를 다운로드 
   (2) BeautifulSoup 모듈을 사용하여 원하는 데이터를 추출 

웹 크롤링에서 자주 사용되는 파이썬 라이브러리들


requests: HTTP 요청을 보낼 수 있도록 기능을 제공하는 라이브러리 

0. urllib 

• 파이썬 내에서 기본적으로 설치되어있는 라이브러리로 웹서버에 응답 및 호출을 하는 함수들을 포함함 
urllib.request 내의 urlopen()

0.1 자주 사용하는 함수들 

함수 설명
urlopen() • 원하는 주소의 웹페이지의 HTML 내용을 가져오기 

 

 

1. Beatiful Soup 

  • bs모듈에 정의된 클래스로 HTML 문서를 파싱(Parsing)할 때 사용되는 라이브러리 
  • 해당 클래스는 HTML 코드가 바인딩된 변수와 HTML을 파싱할 것임을 알리는 문자열인 "html5lib"을 입력받음
  • Official Document:  https://www.crummy.com/software/BeautifulSoup/bs4/doc/
  • pip를 이용하여 설치: $ pip install beatifulsoup4  

 

a. 정적인 사이트 크롤링 

b. Beatiful Soup의 단점 
  - Beatiful soup로 url을 접근하려고 할 때, 해당 접근을 막아놓은 웹사이트들이 있음

1) 자주 사용되는 함수들 

함수 설명
find • find(name, attrs, recursive, string, **kwargs)
• 해당 조건에 맞는 하나의 태그를 가져옴. 중복이면, 가장 첫번째 태그를 가져옴 
find_all() • find_all(name, attrs, recursive, string, limit, **kwargs)
해당 조건에 맞는 모든 태그들을 리스트의 형태로 가져옴   
select_one() • CSS 선택자를 넣어서 원하는 정보를 찾음 
• 
select() • 

 

2) find_all()의 사용 예시 
(1)
soup.find_all(<tag>): 특정 HTML에서 <tag> 에 해당되는 데이터들을 추출 
(2) soup.find_all(id = <string>): HTML 내에서, id가 <string>에 해당 되는 데이터들을 추출 
(3) soup.find_all(id = True): HTML 내에서 id가 존재하는 데이터들을 추출 
(4) soup.find_all(tag, id = string): HTML 내에서, 특정 태그 내에 id가 string인 데이터들을 추출 
(5) soup.find_all(tag, {attr:value}): HTML 내에서, 특정 태그 내에서 attr 속성의 값이 value인 데이터들을 추출 
    - 아래의 예시 2 참조 

3) select()의 예시 
(1) soup.select('.class_name tag_name'): HTML 내의 class_name에 해당하는 클래스 중, tag_name에 해당하는 데이터들을 추

 

(1) find 메소드: find(tag, {})

 

2. Requests 

• Official Document: https://docs.python-requests.org/en/latest/
• 아나콘다를 설치한 경우, 기본적으로 설치가 되어있음 
• 파이썬 기본라이브러리인 urllib 패키지보다 자주 사용됨 
• 웹서버로부터 초기 HTML만 받을 뿐, 추가적인 CSS/JavaScript를 처리하지 못한다. 
• 거의 모든 플랫폼에서 구동 가능 
a. Markup 언어로 작성된 웹페이지가 존재하는 서버에 클라이언트가 여러가지 요청을 하는 기능들을 수행하는 라이브러리 

 

사용 예시

아래의 내용들은 위의 내용을 기반한 예시들이다. 

1. 타이틀 가져오기

태그로 구성된 트리에서 <title> 태그만 출력함

 

from bs4 import BeautifulSoup     # Web parsing을 위한 BeautifulSoup 라이브러리 
import requests                   # HTML 내용을 얻기 위한 requests 라이브러리 
url = "https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.131.202501"  # 예시 URL 
page  = requests.get(url)                       # requests.get()을 통해 웹페이지의 HTML 내용을 받음 
soup = BeautifulSoup(page.text, "html.parser")  # BeautifulSoup()를 이용하여, HTML 내용물을 태크 단위로 분리함
print(soup.head.title)                          # 해당 웹페이지 내의 head 태그 내의 title 태그 추출

결과 

<title>Phys. Rev. Lett. 131, 202501 (2023)  -  Deformation versus Sphericity in the Ground States of the Lightest Gold Isotopes</title>

 

예시 2: 특정 메타 데이터 추출 

from bs4 import BeautifulSoup     # Web parsing을 위한 BeautifulSoup 라이브러리 
import requests                   # HTML 내용을 얻기 위한 requests 라이브러리 
url = "https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.131.201401"  # 예시 URL 
page  = requests.get(url)                       # requests.get()을 통해 웹페이지의 HTML 내용을 받음 
soup = BeautifulSoup(page.text, "html.parser")  # BeautifulSoup()를 이용하여, HTML 내용물을 태크 단위로 분리함
author_list = soup.head.find_all("meta", {"name":"citation_author"})  # head 내의 meta 태그 중, 속성이 name이고 속성값이 citation_author인 내용을 추출

 

결과 1 

>>> author_list
[<meta content="Gabriele Franciolini" name="citation_author"/>,
 <meta content="Antonio Junior Iovino" name="citation_author"/>,
 <meta content="Ville Vaskonen" name="citation_author"/>,
 <meta content="Hardi Veermäe" name="citation_author"/>]

 

결과 2: 위의 메타 데이터에서 content 속성 값을 출력 

>>> for author in author_list:
    	print(author.get("content"))
Gabriele Franciolini
Antonio Junior Iovino
Ville Vaskonen
Hardi Veermäe

 

 

 

 

728x90

댓글