프로젝트 정도는 괜찮지만(단위 모듈) 보안 문제가 있음
대규모 서비스에는 적합하지 않은 듯
팀 프로젝트, 개인 공부, 포트폴리오 만들 때는 추천
웹 페이지 = HTML(뼈대) + CSS(디자인) + javascript(동적 기능)
<script> 태그를 활용한다.document.write("안녕하세요");alert("안녕하세요!");prompt("출력 내용", "입력 내용");
confirm("출력문 작성");
세미콜론의 중요성: 서버로 보낼 때 한 줄로 압축해서 보내니까 찍어서 한 줄이 종료되었음을 항상 알려주는 것이 좋다(자바에서는 필수임)

prompt("생년월일을 입력하세요.", "ex)6자리로 입력하세요");confirm("정말 탈퇴하실 건가요?")
var
JAVA vs. Javascript

ECMA(European Computer Manufacturers Association)Script6 표준안에서 새로운 변수 키워드 등장: let 변수, const 상수








console.log(name+"님 환영합니다.");
console.log(name, "님 환영합니다.");
console.log(`${name}님 환영합니다.`);
코딩 테스트에서 코딩 스타일을 판별하는 경우가 많으니 최신 문법을 잘 적용할 것



[1, 10, undefined]
==: 문자와 숫자를 비교하는 경우에는 숫자를 문자로 자동 형변환===: 타입까지 비교하는 연산자(권장사항)


3가지 스타일
1.
let num1 = prompt("첫 번째 숫자를 입력해 주세요", "예: 42")
let num2 = prompt("두 번째 숫자를 입력해 주세요", "예: 42")
let result = Number(num1) + Number(num2)
console.log(`num1과 num2를 더한 값: ${result}`)
→ 단점: 코드 확장성이 좋지 않음. 내가 뭔가를 할 때마다 매번 형변환이 새롭게 됨
let num1 = prompt("첫 번째 숫자를 입력해 주세요", "예: 42")
let num2 = prompt("두 번째 숫자를 입력해 주세요", "예: 42")
console.log(`num1과 num2를 더한 값: ${Number(num1) + Number(num2)}`)
→ 단점: 연산을 바꾸면 형변환을 새로 해 주어야 함, 가독성 문제
let num1 = Number(prompt("첫 번째 숫자를 입력해 주세요", "예: 42"))
let num2 = Number(prompt("두 번째 숫자를 입력해 주세요", "예: 42"))
console.log(num1+num2)

==10 == "10" → true===10 === "10" → false

print("hello") 실행해보기
%pip install requestsJupyter Notebook에서
%pip install -q requests명령의%는 "매직 커맨드(magic command)"입니다. 매직 커맨드는 주피터 노트북이나 IPython 환경에서 사용하는 특별한 명령어로, 보통 한 줄이나 셀 단위로 파이썬 생태계 외의 작업을 수행하게 해줍니다.%pip는 주피터/아이파이썬에서 파이썬 커널을 제대로 인식해 패키지 설치에 혼란이 없도록 도와줍니다.
반면에, VSCode의 일반 터미널(명령 프롬프트, bash 등)에서는 매직 커맨드가 동작하지 않습니다. 일반 콘솔에서는!pip install -q requests또는pip install requests처럼 사용해야 합니다. 여기서!는 "셀에서 터미널 명령어 실행"을 의미하는 아이피썬/주피터식 방식이고, 실제 터미널에서는 아무런 의미가 없습니다. VSCode의 Python Interactive나 일반 터미널에서는 그냥pip install requests를 입력해야 합니다.
%pip ...: 주피터/아이피썬에서만 동작하는 매직 커맨드.!pip ...: 주피터에서 "터미널 명령어 실행" 용도로, 터미널에서는 사용하지 않음.pip ...: 일반 터미널, 커맨드 프롬프트, VSCode 터미널에서 사용하는 표준 명령.- 정리:
%는 주피터 용 특별 명령이므로 일반 콘솔에선 인식되지 않습니다.- VSCode 터미널에서
!pip install ...은 동작하지 않으니,pip install ...만 입력해야 정상 설치가 됩니다.
import requests as req
# 네이버 페이지 정보 가져오기
# url: 웹 페이지의 표준 구조
res = req.get("http://www.naver.com/")
res
<Response [200]>
Response [200]: 페이지의 정보를 잘 입력 받아 응답했다는 뜻Response [400]: client 단에서 문제가 발생했을 경우(request, 요청 과정에서 문제 발생)Response [500]: server 단에서 문제가 발생했을 경우(response, 응답 과정에서 문제 발생)# beautifulsoup 라이브러리 설치
%pip install -q beautifulsoup4
%pip install -q lxml
# lxml: 파싱 도구
# 문자열 형태의 응답 데이터를 html 문서화 → 파싱
from bs4 import BeautifulSoup as bs
# bs(변경할 데이터, 파싱 방법)
soup = bs(res.text, "lxml")
# html 태그 정보
soup
url_src = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EB%8F%99%EB%AA%85%EB%8F%99+%EB%A7%9B%EC%A7%91&ackey=5ybg8oxt"
get_naver = req.get(url_src)
soup_naver = bs(get_naver.text, "lxml")
soup.select("태그")
soup_naver.select('a')soup_naver.select("a.tab")

요소.text → contents만 추출soup_naver.select("a.tab")[0].text
'블로그'
soup_naver.select_one("a.tab").text
'블로그'
data = soup_naver.select("a.tab")
# 텍스트 형태로 모든 태그들을 추출 → 반복문
for i in data:
print(i.text)
블로그
카페
이미지
지식iN
인플루언서
동영상
쇼핑
뉴스
숏텐츠
어학사전
지도
도서
지식백과
학술정보
전체
블로그
카페
이미지
지식iN
인플루언서
동영상
쇼핑
뉴스
숏텐츠
어학사전
지도
도서
지식백과
학술정보
weather_url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EB%82%A0%EC%94%A8&ackey=przzv2x9"
weather_req = req.get(weather_url)
soup_weather = bs(weather_req.text, "lxml")
soup_weather.select("div.temperature_text")
[<div class="temperature_text"> <strong><span class="blind">현재 온도</span>33.3<span class="celsius">°</span></strong> </div>,
<div class="temperature_text"> <strong><span class="blind">예측 온도</span>25<span class="celsius">°</span></strong> </div>,
<div class="temperature_text"> <strong><span class="blind">예측 온도</span>33<span class="celsius">°</span></strong> </div>,
<div class="temperature_text"> <strong><span class="blind">예측 온도</span>25<span class="celsius">°</span></strong> </div>,
<div class="temperature_text"> <strong><span class="blind">예측 온도</span>33<span class="celsius">°</span></strong> </div>]
temperature = soup_weather.select_one("div.temperature_text").text
temperature
' 현재 온도33.3° '
strong 태그에 접근해 바로 글자 가져오는 방법 알아보기

<Response [200]> 꼭 확인한 뒤에 변수에 넣기!url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EB%82%A0%EC%94%A8&ackey=przzv2x9"
req.get(url)
<Response [200]>

res = req.get(url)
soup = bs(res.text, "lxml")
soup.select("strong")
soup.select("div.temperature_text>strong")[0].text
'현재 온도34.7°'
# 순수 온도 정보만 추출
t = soup.select("div.temperature_text>strong")[0]
# 추출하여 제거하고 싶은 태그 정보를 가져온다
e = soup.select("span.blind")[3]
e.extract()
<span class="blind">현재 온도</span>
# 온도와 symbol만 남은 것을 확인
t.text
'34.7°'
import requests as req # 웹 페이지 정보를 요청/응답받는 라이브러리
from bs4 import BeautifulSoup as bs # 응답 받은 데이터를 html화(parsing)
# 웹 페이지 정보 받아오기
url_news = "https://zdnet.co.kr/news/?lstcode=0000&page=1"
req.get(url_news)
<Response [200]>
req_news = req.get(url_news)
# 데이터 변환하기
soup_news = bs(req_news.text, "lxml")
# 뉴스 제목 추출하기
data = soup_news.select("div.assetText h3")
# 텍스트 형태로 모든 태그들을 추출 → 반복문
for i in data:
print(i.text)
"AI 에이전트 지원"…오라클, 구글 '제미나이 2.5' OCI에 탑재
KCA, ESG 실행과제 검토...8월 중 추진계획 수립
웹케시, 2분기 영업익 8.3%↓…하반기 수익성 회복 총력
쿠콘, 2Q 영업이익 6.3%↑…데이터·페이 균형 성장에 신사업 '가속'
'AI 퍼스트' 외쳤다 낭패 본 美 기업, 싸늘한 여론에 CEO "인력 대체 의미 아냐"
이은우 KAIST 감사 "과학문화 활동비 1% 의무화 해야"
KT노사, 임금 3% 인상안 잠정합의
파마리서치바이오, 보툴리눔 톡신 '리엔톡' 태국 품목허가 획득
저커버그의 'AGI 집착'…메타, 내부 불만 커지는 조직 재편
온코닉테라퓨틱스 '자큐보', 中 임상 3상 성공 및 품목 허가 신청
정부, AI 연구에 GPU 1천장 푼다…삼성SDS·KT클라우드·엘리스 선정
[ZD 위클리 코인] UBCI 4.61% 하락…알트코인 7.85%↓
포티넷, '포티레콘' 대규모 업그레이드…위협 노출 관리·대응 강화
차백신연구소, 대표이사에 한성일 부사장 내정
무보·하나은행·현대차, 자동차 부품 기업 금융지원…美 관세 대응
中 투자 감소·수출 규제 여파…반도체 장비社도 골머리
길리어드, CAR-T 세포치료제 '예스카타' 국내 허가
케이뱅크, 가상자산 법인계좌 100좌 돌파…작년 대비 2배 이상 늘어
현대판 노아의 방주?…쥐 75마리, 우주에 간다 [우주로 간다]
[부음] 이민재 이투데이 기자 본인상
크롤링에서 가장 중요한 건 "필요한 정보만" 가져오는 것!
※ 주의:soup_news.select("h3")으로 하면 뉴스 제목이 아닌 h3도 같이 추출됨
- 이시각 헤드라인
- ZDNet Power Center
soup_news.select("div.assetText>a")[0]
<a href="/view/?no=20250818150244">
<h3>LG전자, MS사업본부 50세 이상 직원 희망퇴직 실시</h3>
<p>LG전자가 50대 이상 직원 및 최근 3년간 성과가 낮은 직원을 대상으로 희망퇴직 신청을 받고 있다. 18일 업계에 따르면 LG전자는 TV 사업을 담당하는 MS사업본부 구성원 ...</p>
</a>
# 속성 추출 방법
soup_news.select("div.assetText>a")[0]["href"]
'/view/?no=20250818150244'
요소["속성명"]\"https://zdnet.co.kr"+soup_news.select("div.assetText>a")[0]["href"]
'https://zdnet.co.kr/view/?no=20250818150244'
# 반복문을 통해 전체 뉴스 링크 수집
a_list = soup_news.select("div.assetText>a")
url_list = []
for i in range(len(a_list)):
url_list.append("https://zdnet.co.kr"+a_list[i]["href"])
url_list
['https://zdnet.co.kr/view/?no=20250818150244',
'https://zdnet.co.kr/view/?no=20250818153419',
'https://zdnet.co.kr/view/?no=20250818153227',
'https://zdnet.co.kr/view/?no=20250818145716',
'https://zdnet.co.kr/view/?no=20250818150649',
'https://zdnet.co.kr/view/?no=20250818152949',
'https://zdnet.co.kr/view/?no=20250818152403',
'https://zdnet.co.kr/view/?no=20250818151448',
'https://zdnet.co.kr/view/?no=20250818151834',
'https://zdnet.co.kr/view/?no=20250818151804',
'https://zdnet.co.kr/view/?no=20250818145640',
'https://zdnet.co.kr/view/?no=20250818144836',
'https://zdnet.co.kr/view/?no=20250818150843',
'https://zdnet.co.kr/view/?no=20250818150837',
'https://zdnet.co.kr/view/?no=20250818150018',
'https://zdnet.co.kr/view/?no=20250818145133',
'https://zdnet.co.kr/view/?no=20250818144808',
'https://zdnet.co.kr/view/?no=20250818144431',
'https://zdnet.co.kr/view/?no=20250818143843',
'https://zdnet.co.kr/view/?no=20250818143407',
'https://zdnet.co.kr/view/?no=20250818143843',
'https://zdnet.co.kr/view/?no=20250818101120',
'https://zdnet.co.kr/view/?no=20250818105408',
'https://zdnet.co.kr/view/?no=20250817225838']