# 웹 크롤링(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
'Python' 카테고리의 다른 글
[Pandas] DataFrame 데이터 선택하기 (0) | 2024.02.02 |
---|---|
[Python] 환경변수를 사용하여 데이터 수집하기 (0) | 2024.02.01 |
[Pandas] 데이터 연산 (0) | 2024.01.17 |
[Pandas] 구조적 데이터 생성하기 (0) | 2024.01.17 |
[NumPy] NumPy 조건문 (0) | 2024.01.17 |