Programming Basics
[웹 크롤링] 네이버 연합뉴스의 타이틀 크롤링
ISLA!
2023. 8. 4. 23:11
네이버 뉴스 페이지에서 헤드라인만 크롤링하기
이번엔 웹에서 원하는 데이터만 뽑아 추출하는 것을 시작해보자!
가장 먼저 네이버 뉴스 페이지의 헤드라인을 크롤링해본다. 크롤링을 원하는 부분은 다음과 같다.
🚴♂️ Requests & Beautifulsoup 라이브러리 사용
- Requests 는 API 호출시에도 사용되며, 기본적으로 웹사이트 크롤링에 많이 쓰임.
- 샘플 코드 : url 로부터 상태코드를 받는 과정
import requests
from bs4 import BeautifulSoup
url = "https://www.naver.com"
#요청 url 변수에 담긴 url의 html 문서 정보 출력
req = requests.get(url)
print(req.status_code)
1. 크롤링하고 싶은 부분의 html 확인
- 마우스 우클릭하고 웹페이지의 html 의 구성을 확인한다.
- 어떤 요소를 크롤링하고 싶은지를 구체적으로 확인하는 과정이다.
- 여기서는 연합뉴스 페이지의 헤드라인만 가져오고 싶기 때문에, 해당 부분을 확인한다
2. 크롤링하고 싶은 부분의 html 확인
- 이제 크롤링 코드를 작성해보자.
- requests 라이브러리와 BeautifulSoup 라이브러리가를 import 한다.
- main 함수 :
- 크롤링 하고 싶은 url 작성
- custom_header
- user-agent : 크롤러가 아님을 숨기기 위해, 네이버 서버에 사용자정보 전달
- 크롤러가 인간의 웹 브라우저처럼 행동하도록 하여 사이트 접근을 용이하게 하는데 사용됨
- requests의 get 메서드를 사용하여 "http get" 요청을 보내는데, 이를 req 변수에 저장 >> 서버로부터 데이터 가져옴
- req.text : requests.get() 함수로 보낸 HTTP GET 요청에 대한 응답 데이터를 가져옴(문자열로)
- "html.parser": BeautifulSoup 객체를 생성할 때 사용되는 파서(parser)의 종류를 지정
- crawler 함수 :
- soup 객체에 저장된 내용 중, div 태그의 class가 list_body인 부분만 가져와 div 객체에 저장
- result 라는 빈 리스트 생성
- div 내용 중, a 태그에 담긴 내용만 가져와, result 리스트에 저장
import requests
from bs4 import BeautifulSoup
def crawler(soup):
#print(soup) >> 작동 확인 완료
div = soup.find("div", class_ = "list_body")
result = []
for a in div.find_all("a"): #find_all의 반환값 형태는 리스트
result.append(a.get_text())
return result
def main():
url = "https://news.naver.com/main/list.naver?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y"
#연합뉴스 제목타이틀 가져오기
custom_header = {
'referer' : 'https://www.naver.com/',
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = "https://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y"
req = requests.get(url, headers = custom_header)
#print(req.status_code)
soup = BeautifulSoup(req.text, "html.parser")
result = crawler(soup)
print(result)
if __name__ == "__main__":
main()
📃 결과 확인
728x90