본문 바로가기
Python

[Python] 네이버 뉴스 크롤링 (requests, bs4)

by teamnova 2021. 8. 5.
728x90

안녕하세요!

오늘은 스틱코드를 이용하여 '네이버 뉴스' 제목과 링크를 크롤링 해보겠습니다.

 

시작 전 준비 환경

1. Python

2. Requests

3. BeautifulSoup

 

1. 환경 설치(OS : Ubuntu)

먼저 파이썬 설치 진행하겠습니다.

터미널을 열고 아래 명령어를 실행해 주세요.

'sudo apt-get install python3'

이미 설치되어 있는 경우 위와 같이 표기 됩니다.

 

'python3 -V' 를 입력하시면 설치된 버전을 확인 하실 수 있습니다.

 

다음으로 'Requests', 'BeautifulSoup' 라이브러리를 설치하도록 하겠습니다.

 

터미널에 아래 명령어들을 입력해주세요.

'pip3 install requests'

'pip3 install beautifulsoup4'

 

설치가 완료 되셨다면

'pip3 list' 를 입력하여 설치가 되었는지 확인 하실 수 있습니다.

 

 

2. URL 요청

먼저 크롤링 하고자 하는 사이트(네이버 뉴스 검색)의 URL 요청 구조가 어떻게 되는지 확인해 보겠습니다.

 

검색 창에 '스틱코드'를 검색 했을때

'https://search.naver.com/search.naver?where=news&sm=tab_jum&query=스틱코드' 라고 나옵니다.

 

GET 방식의 URL을 분리를 하였을 때 아래와 같이 분리가 되고

* https://search.naver.com/search.naver 

* where=news&sm=tab_jum&query=스틱코드

 

파라메터 값을 분리하여

* where=news

* sm=tab_jum

* query=스틱코드

 

다음과 같은 파라메터 값이 필요하다는 것을 파악 할 수 있습니다.

 

여기서 저희는 '검색어'만 변경하여 가져올 예정이기에 'query' 부분을 바꿀수 있도록 코드를 작성할 예정입니다.

 

 

먼저 설치한 라이브러리 'requests''BeatifulSoup'을 import 하고

요청 URL을 만드는 과정과 요청 및 데이터 출력을 해보도록 하겠습니다.

위에서 검색 시 필요한 파라메터 값은 'query' 인것을 찾았습니다.

프로그램 시작 시 input 으로 키워드를 받고 URL에 적용 되도록 합니다.

 

검색어 입력 후 requests 모듈에 URL 을 적용 후 출력 하도록 합니다.

 

requests.get()은 해당 URL에 GET 방식으로 요청하겠다는 의미입니다.

POST 방식으로 원하신다면 requests.post()에 URL과 key, value 형태로 POST 값을 해더에 담아 보내주시면 됩니다.

이 부분은 다음에 좀 더 자세히 다뤄보도록 하겠습니다.

 

위 코드를 실행하면 '검색 키워드를 입력하세요' 부분에서 사용자의 입력을 기다리게 되며

 

'스틱코드' 를 입력하고 엔터를 누르게 되면

요청한 URL의 문서가 찍혀 나오는 것을 보실 수 있습니다.

 

 

3. 파싱

위 방법대로 사용한다면 어디에 어떤 내용이 있는지 찾는데 너무 복잡할 것입니다.

그래서 파싱 과정을 진행할 것인데요

 

BeautifulSoup을 이용하여 뉴스의 제목과 링크만 가져올 수 있도록 할 예정입니다.

 

크롬 웹 브라우저에서 'F12'를 누르면 '개발자 도구'가 켜지는데요

개발자 도구 왼쪽 위에 보시면 페이지의 요소 선택을 해주는 버튼이 있습니다

버튼을 누른 후 웹페이지 화면에 마우스 커서를 가져가면

오른쪽 개발자 모드에 문서 내 해당 요소 내용을 표기해줍니다.

 

'a 태그'링크와 뉴스 제목 모두 담겨 있으므로

뉴스 목록을 보여주는 'a 태그' 만 가져오도록 하겠습니다.

 

 

위에서 requests로 얻어온 문서의 내용을 BeatifulSoup에서 파싱이 가능하도록 적용해 주신다음

BeatifulSoup 메소드인 find_all()을 통해 찾고자 하는 a 태그만 가져오도록 합니다.

> find_all('태그',{'요소' : '요소 값'})

 

 

코드를 실행하면

위에서 문서 전체를 보는 것 보다는 원하는 태그의 내용만 추려오는것을 볼 수 있습니다.

 

 

문서 전체 보다는 내용을 추리긴 했지만 그래도 복잡한 감이 없지 않습니다.

해당 태그에서 특정 속성 값만 가져오는 작업을 이어서 해보도록 하겠습니다.

 

위에서 a 태그 자체를 출력했던 것을 a.get('요소') 으로 바꾸어 원하는 데이터만 출력 해보도록 하겠습니다.

사진에서 볼수 있다시피

최종 목표인 뉴스의 제목과 링크를 가져올 수 있었습니다.

 

 

실제 검색에서도 크롤링한 목록과 같은 결과인것을 보실 수 있습니다.

 

 

 

참고 포스팅

* python scraping requests

https://stickode.com/detail.html?no=907 

 

스틱코드

 

stickode.com

 

* print 함수들

https://stickode.com/detail.html?no=849 

 

스틱코드

 

stickode.com