CONTENTS
SUMMARY
*데이터 분석가가 다양한 데이터 소스를 활용할 수 있는 능력을 키우는 데 중요한 기술이기에 배워두면 좋다!
-requests 라이브러리를 사용하여 URL에 요청을 보내고 응답확인하기
import requests
url = "<URL>" # 예제 URL
response = requests.get(url)
print(response.status_code) # 상태코드 출력
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
select_one
: CSS 선택자를 사용하여 특정 조건을 만족하는 첫 번째 HTML 요소를 찾는 데 유용soup.select_one('CSS 선택자')
CSS 선택자
: HTML 요소를 선택하기 위해 CSS 스타일의 선택자를 사용 (예: div.classname
, span#idname
, a[href="link"]
등).
🌤 실습: 네이버에서 “서울날씨” 정보 가져오기
request
을 사용하여 네이버 날씨 페이지에 접속하여 HTML 응답을 가져온다.BeautifulSoup
및 select_one
을 사용하여 체감온도, 습도, 서풍 정보를 추출한다.url = "https://search.naver.com/search.naver?query=서울날씨"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
feel_temp = soup.select_one('#main_pack > section.sc_new.cs_weather_new._cs_weather > div > div:nth-child(1) > div.content_wrap > div.open > div:nth-child(1) > div > div.weather_info > div > div._today > div.temperature_info > dl > div:nth-child(1) > dd').get_text()
humidity = soup.select_one('#main_pack > section.sc_new.cs_weather_new._cs_weather > div > div:nth-child(1) > div.content_wrap > div.open > div:nth-child(1) > div > div.weather_info > div > div._today > div.temperature_info > dl > div:nth-child(2) > dd').get_text()
wind = soup.select_one('#main_pack > section.sc_new.cs_weather_new._cs_weather > div > div:nth-child(1) > div.content_wrap > div.open > div:nth-child(1) > div > div.weather_info > div > div._today > div.temperature_info > dl > div:nth-child(3) > dd').get_text()
print("체감온도:", feel_temp)
print("습도:", humidity)
print("서풍:", wind)
import pandas as pd
# 데이터 준비
data = [{'temperature': feel_temp, 'humidity': humidity, 'wind': wind}]
# DataFrame 생성 및 CSV 파일로 저장
df = pd.DataFrame(data)
df.to_csv('weather_webscraping.csv', index=False)
print("날씨 정보가 CSV 파일로 저장되었습니다.")
단점
📝 예시: 학생(Student)이라는 객체를 만들어보자!
1) 학생을 처음 정의(__init__
)할때 name (이름)과 age (나이)를 설정
2) 학생은 인사(introduce
)를 할 수 있다.
3) 학생을 print
할때는 학생 정보가 출력.
# 클래스 정의
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"안녕하세요, 저는 {self.name}이고, 나이는 {self.age}살입니다.")
def __str__(self):
return f"!학생에 대한 정보입니다!\n이름: {self.name}\n나이: {self.age}"
# 객체1, 홍길동 생성
student1 = Student("홍길동", 20)
student1.introduce()
print(student1)
# 객체2, 이영희 생성
student2 = Student("이영희", 22)
student2.introduce()
print(student2)
KEPY POINS
웹크롤링은 데이터 수집을 자동화 할 수 있는 편리함이 있지만, 단점도 많고 여러 복합적인 문제가 존재한다.
그렇기 때문에 API를 가져오는 방법을 우선적으로 하고, API를 가져올 수 없는 경우 우회적으로 웹크롤링을 실행한다.
*웹크롤리의 사용을 권유하기는 애매!
INSIGHT
import requests
url = "https://news.naver.com/breakingnews/section/101/258"
response = requests.get(url)
print(response.status_code) # 상태코드 출력
200
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
url = "https://news.naver.com/breakingnews/section/101/258"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
first_title = soup.select_one('.sa_text_strong').get_text(strip=True)
print(first_title) # 첫 번째 기사 제목만 출력
[스팟]코스피 65.49포인트(2.64%) 내린 2417.08 마감
# 모든 기사 제목 가져오기
titles = soup.select('.sa_text_strong')
for title in titles:
print(title.get_text(strip=True))
[스팟]코스피 65.49포인트(2.64%) 내린 2417.08 마감
“코스피 부진은 삼성전자 급락 착시... 삼전 외 종목은 하락 룸 아직 많다”
[속보] 코스피 2.64% 급락 2,417.08 마감…시총 2천조 아래로
[코스피] 65.49p(2.64%) 내린 2417.08 마감
다날, 에이블리와 4910에 휴대폰결제 단독 제공
“공모펀드, 주식·ETF처럼 상장 거래”…금융위, 혁심금융 서비스 신규 지정
[코스닥] 20.87p(2.94%) 내린 689.65(장종료)
[속보] 코스피, 2.64%↓마감…시총 120조 증발
코스피, 코스닥 지수 큰 폭으로 하락
"배춧값 낮추는 데 써주세요"… 대상, 농협 배추 할인 후원
코스닥 지수, 2개월 만에 700선 붕괴
주총 표대결 직행하는 고려아연…표심 잡을 핵심 주장은
비트코인, 단숨에 5만→9만달러…포모
vs 우상향
한온시스템 3분기 영업이익 937억원…작년 동기 대비 391.1%↑(종합)
KB자산운용, 민자발전 기여 공로 경제부총리 표창 수상
윤병운 NH證 대표 "K증시 변동성에 통찰력 필요"
경동제약, 3Q 매출액 496억원…전년동기比 27%↑ "매출·수익성 개선"
비트코인 '2억원' 시대 열리나
국내 전기차 시장 '충전 완료'…올 누적 판매, 성장세 첫 전환
키움증권, 세전 연 4.4% 하나은행 채권 특판
이석우 두나무 대표 "국경없는 가상자산…韓 산업 글로벌 경쟁력 키워야"
케이피에스, '전문의약품 강자' 한국글로벌제약 인수…"내년 매출액 2000억 목표"
케이피에스, 전문의약품 한국글로벌제약 인수 "내년 매출액 2000억 목표"
스맥, 3분기 영업이익 209억원…전년 동기 대비 25%↑
코스피 2% 넘게 하락…삼성전자 5만원 선 위협
데이터 기반 실적주 투자, 임채욱 "양자암호, AI 산업 주목"
케이피에스, '전문의약품 강자' 한국글로벌제약 인수 "내년 매출액 2000억 목표"
에이비엘바이오, 주가상승에 '깜짝' 놀란 이유
NH증권, 내년 증시 및 투자전략 포럼 개최… "코스피 2250~2850"
장중 2%대 하락한 코스피
흘러내리는 코스피
흘러내리는 코스피
달러 1400원
개회사 하는 이석우 두나무 대표
고려아연, 유상증자 계획 철회에도 13% 하락…"호재 소멸?"[핫종목]
"패닉 셀링"…코스피 시가총액 2000조원 밑으로 [장중시황]
➕기사의 클래스명 가져오기!
1. f12누른뒤 개발자 도구 열기
2. 맨 왼쪽에 화살표 모양 누르기
3. 원하는 기사 제목 누르기
4.<class = "sa_text_strong"> 부분 확인하기
5. sa_text_strong 앞에 .만 붙여주기! .sa_text_strong가 클래스명!
➕get_text(strip=True)와 get_text()의 차이
get_text(strip=True)
get_text()
get_text()는 strip 옵션 없이 텍스트를 그대로 가져온다.
이 경우, HTML 요소의 텍스트 앞뒤에 공백이 남아 있을 수 있다.
" 제목 텍스트 "와 같은 요소에서 get_text()를 사용하면 " 제목 텍스트 "처럼 앞뒤 공백이 포함된 채로 출력.
csv파일로 저장하기
import pandas as pd
# DataFrame 생성 및 CSV 파일로 저장
df = pd.DataFrame(titles)
df.to_csv('naver_headline.csv', index=False)
print("기사제목이 CSV 파일로 저장되었습니다.")
기사제목이 CSV 파일로 저장되었습니다.
잘 저장된 것을 확인할 수 있다!