네이버 크롤링 준비물
- 네이버 아이디
- 주피터 노트북
네이버 개발자 센터 가입
https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
크롤링을 하기 위해서는 Naver Developers에 가입이 필요.
가입 이후 Application -> 애플리케이션 등록으로 이동.
애플리케이션 이름 : 원하는 이름 아무거나 정함
사용 API : 크롤링을 위해 '검색' 선택
비로그인 오픈 API 서비스 환경 : WEB 설정, http://localhost 입력
위 내용을 입력하고, 등록하기를 누르면 등록 완료. 이때 누르고 아무 반응 없으면, 내 애플리케이션을 직접 들어가 보면 애플리케이션이 생성된 것을 확인 가능. (여러 번 누르면 여러 개 생성)
완료된 목록은 '내 애플리케이션' 에서 확인.
Client ID 및 Client Secret 획득하기
내 애플리케이션을 확인해 보면, 방금 만든 애플리케이션이 등록되어 있음.
여기서 Client ID와 Client Secret을 복사하면 크롤링 준비 완료.
주피터 노트북 실행
파이썬이 작동하는 모든 프로그램이 가능하지만, 데이터 사이언스에서 많이 사용하는 주피터 노트북에서 실행.
import urllib.request
import re
import json
사용할 함수
- urllib.request -> html 문서 내용을 불러오는 역할.
- re -> 필요 없는 내용을 정리(parsing)할 때 사용.
- json -> 다운로드한 내용을 json 파일로 저장할 때 사용.
검색할 단어 지정하기
search = '부자'
category = 'book'
display = 20
start = 1
sort = 'sim'
위 예시를 보면, 찾을 단어(search)는 '부자'로 지정했고, 찾는 장소(category)는 'book'(책)이며, 한 번에 표시할 검색 결과 개수(display)는 20개, 시작점(start)은 1이며, sort의 경우 2가지 옵션이 있는데, 'sim'은 정확도순으로 내림차순 정렬이며, 'data'를 입력할 경우 출간일순으로 내림차순 정렬.
크롤링을 위한 URL 만들기
이번 단계는 위에서 입력한 단어를 조합해 검색 URL 생성.
baseURL = 'https://openapi.naver.com/v1/search/'
node = f'{category}.json'
param = f'?query={urllib.parse.quote(search)}'
param += f'&display={display}'
param += f'&start={start}'
param += f'&sort={sort}'
URL = baseURL + node + param
- baseURL -> 네이버 API에서 요청하는 URL
- node -> xml 또는 json 타입을 선택, 위 예시는 json 선택
- param -> query는 반드시 UTF-8 형태로 인코딩! 그래서 한글을 urllib.parse.quote()를 활용하여 형태에 맞게 변환시킴.
- param += 필요한 요소를 추가.
위 데이터를 모두 합치면 크롤링을 위한 URL을 만들게 됨.
API 승인 & 원하는 내용 내려받기
request = urllib.request.Request(URL)
request.add_header("X-Naver-Client-Id",'클라이언트 아이디 입력')
request.add_header("X-Naver-Client-Secret",'클라이언트 비밀번호 입력')
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
response_body = response.read()
res_data = response_body.decode('utf-8')
else:
print("Error Code:" + rescode)
위에서 정리한 자료를 바탕으로 본격적으로 크롤링 시작.
- request -> urllib의 request를 활용하여 통합 URL을 읽습니다.
- request.add_header("X-Naver-Client-Id", '아이디 입력') -> 위에서 획득한 Client ID 입력.
- request.add_header("X-Naver-Client-Secret",'비밀번호 입력') -> 위에서 획득한 Client Secret 입력.
- response -> 아이디 비밀번호로 URL 접속
- rescode -> 코드를 받음. 만약 200일 경우 접속 성공!
- res_data -> 다운로드한 자료 저장
데이터 분석 및 필요한 자료만 파싱
다운 받은 자료를 print 해보면,
- lastBuildDate -> 자료를 획득한 시간
- total -> 검색 수
- start -> 1번 페이지
- display -> 20개 표시
- items -> 원하는 자료 저장 되어있음
- print(type(res_data)) -> str 타입(문자열)
하지만 위 자료를 그대로 사용하기에는 불필요한 문자가 많다. (ex: 역 슬레시, \n)
그렇기 때문에 원하는 자료만을 파싱 하는 작업이 필요하다.
파싱(parsing) 하기
데이터를 보면서 지워야 할 단어를 찾는다. 눈에 들어오는 것은 역 슬래시와 \n이 눈에 띈다.
res_data = re.sub('\\\\n|\\\\', '', res_data)
⚡️ 주의사항 ⚡️ 역슬래시를 제거하기 위해서는 '\\\\'로 네 번 써야 한다.
- re.sub('1 번','2 번', 3번) -> 1번 : 단어 선택, 2번 : 변경할 단어 입력, 3번 : 데이터 입력
제거 후 다시 print 해보면, 원하는 자료만 남아있는 것을 확인할 수 있다.
string 타입을 dict로 변경
string에서 원하는 내용을 추출하는 것보다, 딕셔너리 타입으로 변경 후 출력하는 것이 편리하기 때문에 변환을 한다.
# json 파일로 저장
file_name = f'{search}_naver_{category}.json'
try:
with open(file_name,'w', encoding = 'utf-8') as outfile:
outfile.write(res_data)
print('json 파일이 저장되었습니다.')
except BaseException as ex:
print("파일 저장 에러",ex)
# json 파일 불러오기
try:
with open(file_name, 'r', encoding='utf-8') as readfile:
dic_data = json.load(readfile)
li_data = dic_data['items']
except Exception as ex:
print('파일 읽기 에러: ', ex)
json 파일로 변환 후 불러오는 것만으로도 str 타입에서 dict 타입으로 변환이 가능하다.
json.load()를 통하여 불러온 파일을 dic_data에 저장하며, 그중 key값이 items인 항목(list)을 li_data에 저장한다.
원하는 항목만 출력
마지막 단계로 li_data(리스트)의 항목을 반복문을 통하여 출력하면 된다.
for i in li_data:
print('제목:',i['title'])
print('링크:',i['link'])
print('요약:',i['description'])
print('------------------------------------------------------------')
- i['title'] -> 제목 출력
- i['link'] -> 사이트 접속
- i['description'] -> 요약 정보 출력
'프로그래밍 > 크롤링' 카테고리의 다른 글
[크롤링(Crawling) – 03] 수집한 기사 엑셀파일로 정리하기 (Pandas, Dataframe) (0) | 2020.08.11 |
---|---|
[크롤링(Crawling) – 02] 최신 인터넷 신문 / 기사, 제목만 추출 (BeautifulSoup / parser) (0) | 2020.08.11 |
[크롤링(Crawling) - 01] 데이터 요청 하기 (requests) (0) | 2020.08.10 |
댓글