이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다.
포털사이트 크롤링
- 소스내에서 특정 문자열(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로 저장
- 항목별로 list에 저장
- 항목들을 dict로 구성
- dict를 데이터프레임으로 생성
- 데이터프레임을 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
'프로그래밍 > Crawling' 카테고리의 다른 글
[WebCrawling] 네이버 뉴스 섹션별 토픽 기사 크롤링 2022.ver (0) | 2022.08.03 |
---|---|
[WebCrawling] 네이버 뉴스 섹션 토픽 크롤링 2022.ver (0) | 2022.08.03 |
[WebCrawling] 웹 크롤링 기본 개념 및 문법 (BeautifulSoup사용법) (0) | 2022.08.02 |
[WebCrawling] 크롤링 결과데이터 csv파일로 저장하기 (0) | 2020.10.10 |
[WebCrawling] 네이버 기사 댓글 크롤링하기 2020.ver (0) | 2020.08.19 |