본문 바로가기
Study/Python

[Python] 크롤링 Request 사용법 (멜론, 뉴스 제목 데이터 수집)

by YoungD 2023. 8. 28.
# req -> 파이썬에서 브라우저의 역할을 대신해줌
import requests as req
In [3]:
# 1. req를 통해서 네이버 페이지 정보를 요청
# 2. response -> 응답코드를 넘겨받는다.
# 200, 300 -> '통신에 성공했습니다.'
# 400 -> 클라이언트 요청의 문제가 있다.
# 500 -> 서버의 문제가 있다

res = req.get("http://www.naver.com")
In [4]:
a = res.text

 

멜론사이트를 요청

In [5]:
# 응답코드 406은 요청의 문제가 있다
# 멜론 서버에서 들어온 요청이 브라우저가 아닌 컴퓨터임을 인지
# 사람인척 속이면 된다 (개발자 모드 -> 네트워크 -> 헤더)
req.get("https://www.melon.com/")
Out[5]:
<Response [406]>
In [6]:
head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}
In [7]:
req.get("https://www.melon.com/", headers = head)
Out[7]:
<Response [200]>

 

뉴스타이틀 수집

In [8]:
# 1. 네이버 사이트(검색한 뉴스화면)를 요청
res = req.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%98%A4%EC%97%BC%EC%88%98+%EB%B0%A9%EB%A5%98")
# res.text
Out[8]:
 

BeautifulSoup

  • req를 통해서 받아온 텍스트 데이터를 컴퓨터가 이해할 수 있는 html형태로 변환
In [9]:
# 주의할점. stone이 아닌 일반 soup을 임포트
from bs4 import BeautifulSoup as bs
In [10]:
# 2. 응답을 받은 데이터에서 뉴스 타이틀만 수집
soup = bs(res.text, "lxml")
In [11]:
# select("선택자") -> html데이터에서 특정 요소만 수집
title = soup.select("a.news_tit")
In [12]:
# 수집된 요소 중에 컨텐츠(텍스트) 데이터만 추출
title[0].text
Out[12]:
'재미동포단체, 백악관 앞에서 오염수 방류 반대 집회'
In [13]:
for i in title :
    print(i.text)
재미동포단체, 백악관 앞에서 오염수 방류 반대 집회
해수부, 日 오염수 방류 이후 첫 방사능 조사…WHO 기준치 이하 ‘안전’
‘오염수 방류’ 점검할 한국 정부 전문가 3명 출국
일본, 오염수 방류 다음날...“삼중수소 농도 모두 기준치 이하”
오염수 방류후 “지옥 생각나”...자우림 김윤아 글 후폭풍
野 “방류 저지” 대규모 집회… 與 “이재명 지키려 선동” [日 오염수 방류...
일본 국민 49%, 후쿠시마 오염수 방류 개시 긍정 평가
해수부, 日오염수 방류 이후 첫 방사능 조사…"안전한 수준"
원전 오염수 방류 후 첫 해양방사능 조사…WHO 먹는물 기준치 이하 '안전'
해수부, 오염수 방류 이후 첫 조사…"세슘·삼중수소 농도 안전"

네이버금융정보를 수집

In [14]:
# 1. req를 통해서 url 정보를 요청
res = req.get("https://finance.naver.com/")
In [15]:
# 2. 응답데이터가 올바르다면 bs을 통해서 html형태로 변형
soup = bs(res.text, "lxml")
In [16]:
# 3. 변형된 데이터에서 필요한 태그만 수집
# 팁! 부모자식을 의미하는 자식선택자를 잘 활용
# 수집하고자 하는 요소가 아이디, 클래스 구분자가 없다면 반드시 부모를 검사
# 부모태그 구분자가 존재할 때까지 검사를 진행
# 구분자가 없는 경우에는 정확하지 않을 확률이 높음
soup.select("#_topItems1 > tr > th > a")
Out[16]:
for i in range(5) :
	print(title[i].text)
In [17]:
# 선택자를 한번에 가지고 오는 방법
# 개발자도구에서 요소에 우클릭 -> copy -> copyselector
# 주의점! 반드시 내가 선택한 하나만 가지고 온다
# 복수개가 필요한 경우에는 선택자를 수정(ex nth-child())
In [18]:
soup.select()