Python

[Python] Requests와 BeautifulSoup를 활용한 크롤링

주댕이 2024. 1. 31. 17:35

# 웹 크롤링(Web Crawling)

  • 웹 사이트에서 정보를 체계적으로 검색하고 추출하는 프로세스
  • 다양한 웹 페이지에서 데이터를 수집하기 위한 자동화된 탐색 과정

 

# Requests

  • Python에서 HTTP 요청을 보내는 데 사용되는 인기 있는 서드파티 라이브러리
  • HTTP/1.1 요청을 손쉽게 만들 수 있도록 복잡성을 숨기며, 개발자가 쉽게 웹 서비스와 상호 작용하고 웹 사이트에서 데이터를 가져올 수 있게 한다.
  • 특징
    • User-Friendly API: HTTP 요청을 보내기 위한 깔끔하고 간단한 API를 제공하여 개발자가 쉽게 작업할 수 있도록 한다.
    • HTTP Methods: GET, POST, PUT, DELETE 등 다양한 HTTP 메소드를 지원하여 다양한 방식으로 웹 서버와 상호 작용할 수 있다.
    • URL Parameters and Headers: URL 매개변수 및 헤더를 쉽게 요청에 포함시킬 수 있다.
    • Session Management: 세션을 지원하여 여러 요청 간에 쿠키 및 인증 정보와 같은 일부 매개변수를 유지할 수 있다.
    • Response Handling: HTTP 응답을 처리하기 위한 편리한 메소드를 제공하며, JSON 파싱, 콘텐츠 디코딩 및 응답 헤더에 액세스하는 것과 관련된 기능이 있다.

 

# BeautifulSoup

  • HTML 및 XML 파일에서 데이터를 추출하기 위한 Python 라이브러리
  • 파싱된 트리 구조에서 정보를 검색하고 조작하는 데 사용한다.
  • 웹 페이지로부터 정보를 스크래핑하고 HTML 또는 XML 구조를 더 편리하게 Python에서 다룰 수 있게 한다.
  • 특징
    • HTML and XML Parsing: HTML 및 XML 문서를 파싱하여 그 구조를 탐색하고 조작할 수 있다.
    • Tag Searching: 여러 방법을 사용하여 HTML 또는 XML 문서에서 태그를 검색할 수 있다. 
    • Tag Navigation: 한 번 태그를 찾으면 BeautifulSoup을 사용하여 부모, 자식 및 형제 태그를 탐색할 수 있다.
    • Data Extraction: HTML 또는 XML에서 데이터를 추출하기 위한 메서드가 제공되며, 텍스트 내용, 속성 값 등을 가져올 수 있다.
    • Modifying the Parse Tree: HTML 또는 XML 파싱 트리를 수정할 수 있으며, 태그 및 속성을 추가, 수정 또는 삭제할 수 있다.

 

# Requests와 BeautifulSoup을 활용하여 웹 크롤링 하기: 벅스 차트의 노래 제목 크롤링하기

import requests
from bs4 import BeautifulSoup
import pandas as pd 

def crawling(soup) :
    # HTML에서 tbody 태그 찾기
    tbody = soup.find("tbody")
    result = []
    # tbody 내부의 모든 p 태그 중 클래스가 'title'인 것을 찾아 추출
    for p in tbody.find_all('p', class_ = 'title'):
        result.append(p.get_text().strip())
    return result

def main() :
	# HTTP 요청 헤더 설정
    custom_header = {
        'referer' : 'https://music.bugs.co.kr/',
        'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    url = "https://music.bugs.co.kr/chart"  # 크롤링 하려는 웹사이트
    req = requests.get(url, headers = custom_header)
    
    soup = BeautifulSoup(req.text, "html.parser")  # HTML을 파싱하여 BeautifulSoup 객체 생성

    titles = crawling(soup)
    # 추출한 노래 제목을 DataFrame으로 변환하여 출력
    print(pd.DataFrame({"노래제목" : titles}))


if __name__ == "__main__" :
    main()

 

 

# Requests와 BeautifulSoup을 활용하여 웹 크롤링 하기: 네이버 증권에서 삼성전자의 일별 시세 데이터 크롤링하기

import requests
import pandas as pd
from bs4 import BeautifulSoup
import warnings
import time
import random
warnings.filterwarnings('ignore') 

def crawling(url, headers, soup):
    # 마지막 페이지 번호 추출
    last_page = int(soup.select_one('td.pgRR').a['href'].split('=')[-1])
    
    df = None
    count = 0
    for page in range(1, last_page + 1):
        # 페이지별 HTML 가져오기
        req = requests.get(f'{url}&page={page}', headers=headers)
        
        # HTML에서 테이블을 DataFrame으로 변환하여 합치기
        df = pd.concat([df, pd.read_html(req.text, encoding="euc-kr")[0]], ignore_index=True)
        
        # 요청 횟수 제한 (10번까지)
        if count > 10:
            break
        count += 1
        
        # 랜덤 대기 시간 설정
        time.sleep(random.uniform(2, 4)) 

    # 누락된 데이터 제거하고 인덱스 재설정
    df.dropna(inplace=True)
    df.reset_index(drop=True, inplace=True)
    
    return df

def main():
    company_code = '005930'  # 삼성전자 종목 코드
    url = "https://finance.naver.com/item/sise_day.nhn?code=" + company_code
    
    headers = { 
        'referer': 'https://finance.naver.com/item/sise.naver?code=005930',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    
    # 첫 페이지의 HTML을 가져와서 BeautifulSoup 객체 생성
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, "html.parser")
    
    # 크롤링 함수 호출
    result = crawling(url, headers, soup)
    
    # 크롤링 결과 출력
    print(result)

if __name__ == "__main__":
    main()
728x90