본문 바로가기
파이썬(Python)

BeautifulSoup, requests 활용 웹크롤링(Web Crawling)

by 부캐 활용 IT 2023. 3. 13.
반응형

BeautifulSoup이란?

  • HTML 파서이다
  • HTML로부터 데이터를 추출하기 위해 사용한다
  • 웹 스크래핑에 유용하다

현재 Beautiful Soup3는 더 이상 개발되지 않고(2021년 1월 1일 중단), Beautiful Soup4를 사용하면 된다.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

Beautiful Soup Documentation — Beautiful Soup 4.9.0 documentation

Beautiful Soup Documentation Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers h

www.crummy.com

 

설치

pip install beautifulsoup4

 

 

requests 란?

  • HTTP 라이브러리이다.
  • 웹 스크래핑
  • API 개발
  • 일반 웹 개발 작업에 널리 사용

https://requests.readthedocs.io/en/latest/

 

Requests: HTTP for Humans™ — Requests 2.28.2 documentation

Requests: HTTP for Humans™ Release v2.28.2. (Installation) Requests is an elegant and simple HTTP library for Python, built for human beings. Behold, the power of Requests: >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) >>> r.

requests.readthedocs.io

설치

pip install requests

 

예) 네이버 뉴스 검색

from bs4 import BeautifulSoup
import requests

#웹크롤링주소는 https://search.naver.com/search.naver?where=news&query=검색어 형태이다.
#검색어를 입력 받아 처리하는 혙태로 url 주소를 입력한다.
search_text = input("검색어:")
url = "https://search.naver.com/search.naver?where=news&query=" + search_text  
result = requests.get(url)

#print(result)      #해당 사이트의 상태를 보여준다. 200이면 정상이다.
#print(result.text) #html 소스가 출력된다.

soup = BeautifulSoup(result.text, "html.parser") #html 소스를 파싱한다.

items = soup.select(".news_tit")   #find 방식도 있음

#print(items)  #클래스가 news_tit인것을 모두 보여준다

for item in items:
  print(item.text, item.get('href')) #반복문을 사용하여 텍스트와  href 속성 값인 UTL주소를 보여준다

 

 

예) 기상청 날씨 파이썬으로 가져오기

from urllib.request import urlopen, Request #라이브러리 불러오기
#도시별 날씨 검색 함수
def get_weather(city):
    #기상청 홈페이지 도시별 날씨
    url = 'https://www.weather.go.kr/w/obs-climate/land/city-obs.do'
    page=urlopen(url=url)
    text=page.read().decode('utf-8')
    text = text[text.find(f'>{city}</a'):]#>부산</a> html 코드 있는부분 찾아옴
    # 기온 가져오기(기상청 홈페이지 7번째 칸)
    for i in range(7): #기상청 홈페이지의 7번째칸 가져오고
        text=text[text.find('<td>')+1:]
    start=3
    end=text.find('</td>') 
    current_temp=text[start:end]
    print(f'{city}의 현재 기온은 {current_temp}˚C 입니다.')
    # 습도 가져오기(기상청 홈페이지 10번째 칸)
    for i in range(3): #7번째 이후 3번째 뒤 10번째 칸 가져오게됨
        text=text[text.find('<td>')+1:]
    start=3 #html 코드 td> 뒷부분에 실제 내용부터 가져오겠다
    end=text.find('</td>') 
    current_humid=text[start:end]
    print(f'{city}의 현재 기온은 {current_humid}% 입니다.')
get_weather('서울')  #input으로 처리가능함
반응형

댓글