프로그래밍/Crawling

[WebCrawling] 네이버 뉴스 메뉴 크롤링 2022.ver

seojeon9 2022. 8. 3. 00:51

이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다.


포털사이트 크롤링

  • 소스내에서 특정 문자열(data)을 자칭하는 선택자 얻기(크롬 개발자도구 사용)
  • 전체 코드에서 수집하려고 하는 데이터(태그)의 위치를 찾고 태그를 파싱한 후 필요데이터 추출

네이버 전체메뉴 크롤링

네이버 전체 메뉴

아래의 코드를 통해 네이버 상단 메뉴의 url을 가져올 수 있다.

from urllib.request import urlopen # 서버 요청/응답 패키지
import bs4 # 파싱 패키지

# 네이버 사이트의 기본 메뉴 문구 추출
url = 'https://www.naver.com'

# url로 요청 후 응답
html = urlopen(url)

# 파서객체 생성 - bs4 객체로 변환
bs_obj = bs4.BeautifulSoup(html, 'html.parser')

# 네이버 기본 메뉴는 ul > li.nav_item 형식으로 되어 있음
lis = bs_obj.findAll('li',{'class':'nav_item'})
len(lis) # class 속성값이 nav_item인 li 태그 추출 : 16개의 li 태그가 추출

for li in lis :
    a_tag = li.find('a')
    print(a_tag.text,":",a_tag['href'])

 

수집한 데이터를 csv로 저장

  1. 항목별로 list에 저장
  2. 항목들을 dict로 구성
  3. dict를 데이터프레임으로 생성
  4. 데이터프레임을 csv로 저장
import pandas as pd

# 네이버 메뉴 정보 저장
# 빈 리스트 생성
menu = []
url = []

for li in lis :
    a_tag = li.find('a')
    menu.append(a_tag.text)
    url.append(a_tag['href'])
    
df = pd.DataFrame({'메뉴':menu,"URL":url})
df

df.to_csv('./crawl_data/naver_menu.csv')

 

네이버 뉴스만이 목적이라면 위의과정은 생략하고

네이버 뉴스 url을 가진채로 아래의 과정부터 시작하면 된다!

네이버 뉴스 메뉴

: [정치/경제/사회/생활문화/IT과학/세계]에 해당하는 메뉴 url을 크롤링해오는 작업을 할 것이다.

 

현재 네이버 뉴스는 네이버 정책에 따라 모든 언론사들의 뉴스가 랜덤하게 배치된다

- 단, 로그인 후 구독을 추가하면 구독한 언론사들의 뉴스가 나온다

- 헤드라인 뉴스는 표면적으로는 제공되지 않는다

# 네이버 뉴스 크롤링
# url은 기본 url 부터 사용
url = 'https://news.naver.com'
html = urlopen(url)

# bs4 객체 생성
bs_obj = bs4.BeautifulSoup(html, 'html.parser')

print(bs_obj.prettify()) # prettify() 보기좋게 html 형식대로 정렬해주는 함수

news_title = bs_obj.findAll('div',{'class':'cjs_t'})
for title in news_title :
    print(title.text)
    
news_dec = bs_obj.findAll('p',{'class':'cjs_d'})
for dec in news_dec :
    print(dec.text)

 

네이버 뉴스섹션메뉴와 섹션별url 추출

from urllib.request import urlopen
import bs4
import pandas as pd

url = 'https://news.naver.com'

html = urlopen(url)

bs_obj = bs4.BeautifulSoup(html,'html.parser')
# 추출방법

# 네이버 뉴스 섹션메뉴 태그 확인(개발자도구)
# body > section > header > div.Nlnb._float_lnb > div > div > div.Nlnb_left._lnb_scroll > div > div > ul
# selector가 너무 길어서 유용하지 않아 보임
# 직접 확인한 태그와 클래스 속성 사용

# 1. 
# ul 태그의 class : Nlnb_menu_list
ul = bs_obj.find("ul",{"class":"Nlnb_menu_list"})
ul

lis = ul.findAll('li')
for li in lis :
    a_tag = li.find('a')
    
# 2.
# li태그를 이용해서 추출
lis = bs_obj.findAll("li",{"class":"Nlist_item"})
lis
for li in lis :
    a_tag = li.find('a')
# 수집 데이터 df로 구성 후 저장
section = []
link = []

for li in lis :
    a_tag = li.find('a')
    section.append(a_tag.text)
    link.append(a_tag['href'])
    
col_dict = {'section':section, "link":link}
news_section_df = pd.DataFrame(col_dict)
news_section_df

news_section_df.to_csv('./crawl_data/naver_news_section.csv')

이렇게 네이버 뉴스의 각 섹션 메뉴의 url을 추출해왔다.

다음글에서는 각 url으로 들어와 topic과 뉴스 글을 추출해오는 방법을 알아보겠다.

728x90