#정적 웹 페이지 크롤링
-웹API가 제공되지 않는 웹 페이지에서 크롤링을 하려면 해당 웹 페이지의 HTML분석하고, 필요한 데이터를 직접 추출해야함. 이 떄 HTML구조를 분석하는 작업을 파싱이라고하며, 이때 파이썬에서 사용하는 라이브러리가 BeautifulSoup라이브러리.
BeautifulSoup라이브러리
-HTML문서에서 원하는 부분만 가져오고 싶을 때 사용하는 라이브러리
-어렵게 말하자면 HTML문서를 정리된 파스트리로 변환하여 주는 라이브러리
(#라이브러리 이름이 이 모양인 이유 : 예전에 지저분하고 보기힘들고 문법적으로 틀린 HTML 웹 문서를 tag soup라고 부름.
이런 soup를 보기 좋게 바꾸어준다고 하여 라이브러리 이름이 뷰티풀수프로 지어짐...)
0. 사용전 : from bs4 import BeautifulSoup로 임포트해온다.
1.수프(soup)객체를 만들어 그 안에 BeautifulSoup로 처리한 것을 담는다
soup(수프객체) = BeautifulSoup( 문서, 파서(해석기라고도 함))
-문서는 html파일, text로 디코딩된 것이나 content인 것 들 중 아무거나.
-파서는 일반적으로 html.parser사용
-BeautifulSoup로 처리한 것을 담는 객체를 수프객체라고 하겠음.(정확한 용어 표현인지는 모름)
#수프객체 다루기
1.수프객체.prettify()
-html문서의 구조를 보기 좋게 만들어서 보여줌.
2.지정한 태그하나만 파싱하기
-수프객체.태그명
-태그객체 = 수프객체.태그명 (tag1 = soup.h1)
-지정한 태그의 첫 번째 것만 파싱함
2-1. 지정한 태그와 속성으로 파싱
-수프객체.태그['속성명'] (ta1 = soup.h1['href'])
from bs4 import BeautifulSoup
import requests
url = "http://runtimeerror44.tistory.com/"
response = requests.get(url)
html = response.content
soup = BeautifulSoup(html, 'html.parser')
soup.h1
>><h1 id="title">런타임의 블로그</h1>
tag_h1_1 = soup.h1
>><h1 id="title">런타임의 블로그</h1>
tag_h1_1 = soup.h1['class']
print(tag_h1_1)
>>['logo', 'special']
3.attrs
-태그객체.attrs
-속성의 이름과 속성값을 딕셔너리로 구성하여 보여줌
3-1.해당 태그 객체의 속성값 알아내기
-태그객체['속성명']
-태그객체.attrs['속성명']
tag_h1_1 = soup.h1
tag_h1_1.attrs
>>{'class': ['logo', 'special']}
tag_h1_1['class']
>>['logo', 'special']
tag_h1_1.attrs['class']
>>['logo', 'special']
4. html문서 혹은 태그 객체의 텍스트만 가져오기
-soup.get_text() 수프 문서객체에서 텍스트만 가져옴
-태그.text
-태그.get_text()
-위 두 방법의 차이는 딱히 없는 듯함.
for link in links:
title = link.get_text() #태그안에 텍스트요소를 가져온다
print(title)
title2 = link.text
print(title2)
#위 두 코드 결과 모두
>>크롤링ST6-CSS선택자
파이썬 time/ datetime모듈
파이썬 urllib라이브러리
크롤링ST5- 크롤링을 위한 HTML
크롤링ST4-파싱/파서
파이썬 json라이브러리
파이썬 requests라이브러리
크롤링ST3-requests 와 urllib.request
크롤링ST2- 공공데이터 API기반 크롤링
크롤링1ST-네이버API를 이용한 크롤링
5.select메소드 - CSS선택자로 데이터 추출하기
soup.select_one('선택자') - 선택하고자 하는 태그 첫 번째 것 하나만 파싱
soup.select('선택자') -선택하고자하는 태그 여러개(모두)를 파싱 결과 반환은 리스트로 함.
ex)
from bs4 import BeautifulSoup
import requests
#<mark> </mark> 굵은 글씨로 만들어주는 태그
#href의 속성값은 뉴스원본 사이트로 가는 주소
#원하는 태그 선택
#a태그는 웹문서 내에 무수히 많기 때문에 뉴스제목만 나타내는 a태크만의 별명을 선택. class id 중에 class선택자로.
url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%95%A0%ED%94%8C"
response = requests.get(url)
html = response.content #응답객체에서 텍스트를 추출 -> html소스코드
#html = response.text도 가능
soup = BeautifulSoup(html, 'html.parser')
links = soup.select(".news_tit") #결과는 리스트
for link in links:
title = link.text #태그안에 텍스트요소만 가져온다.지저분한 태그와 속성들을 지운 값만.
# title = link.attrs['title']도 제목만 가져옴, 해당태그의 title 속성에서 가져온것.
origin = link.attrs['href'] # href의 속성값을 가져온다.
print(title,origin)
6.find메소드 - 태그,속성,속성값을 이용하여 원하는 데이터 추출
-select메소드와 큰 차이가 없으며 select메소드를 사용하길 권장하는 추세이다.
-수프객체.find('태그명' or 속성명 = '속성값', or 둘다 명시) 하나만 반환
-수프객체.find_all(,,) 모두 찾아 리스트 형태로 반환
title = "<h1 class='titles' id='headtitle'> Hello World </h1>"
soup = BeautifulSoup(title, 'html.parser')
# 태그 이름만 특정
print(soup.find('h1') )
# 태그 속성만 특정
print(soup.find(class_='titles') )
print(soup.find(attrs = {'class':'titles'}))
# 태그 이름과 속성 모두 특정
print(soup.find('h1', class_='titles'))'PYTHON > 파이썬_라이브러리&모듈' 카테고리의 다른 글
| 파이썬 Selenium 라이브러리2 (0) | 2022.05.13 |
|---|---|
| 파이썬 Selenium라이브러리1(+MacOS에서 설치팁, +바로꺼짐오류팁) (0) | 2022.05.12 |
| 파이썬 time/ datetime모듈 (0) | 2022.05.11 |
| 파이썬 urllib라이브러리 (0) | 2022.05.11 |
| 파이썬 json라이브러리 (0) | 2022.05.09 |