반응형

안녕하세요~


매일매일 딥러닝 으니입니다!


오늘은 Python 첫번째 편!


BeutifulSoup, scrapy, urllib 등을 이용한 다양한 웹 크롤링 방법 중 BeautifulSoup을 이용하여 웹 크롤러를 만들어 보겠습니다!





크롤러란?


크롤링(crawling) 혹은 스크레이핑(scraping)은 웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위이다. 크롤링하는 소프트웨어는 크롤러(crawler)라고 부른다.   출처: 나무위키



1. NaverAPI를 이용한 웹 크롤


NaverDeveloper: https://developers.naver.com



[ step1. 어플리케이션 등록하기! ]


※ naver id로 등록하실 수 있습니다.




[ step2. id & key 확인하기 ]


※ 위에서 생성한 내 어플리케이션에서 확인하실 수 있습니다.



[ step3. 웹 크롤러 만들기 ]

# naver_search_api import os import sys import urllib.request import json client_id = "YOUR_CLIENT_ID" client_secret = "YOUR_CLIENT_SECRET" encText = urllib.parse.quote(input('검색할 단어 : ')) start = "&start=" + input('검색 시작 위치 : ') display = "&display=" + input('출력건수 : ') category = input('news or cafearticle : ')

# xml 결과

# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText

# json 결과

# url = "https://openapi.naver.com/v1/search/" + category + "?query=" + encText


# option 추가 가능

url = "https://openapi.naver.com/v1/search/"+category+"?query="+encText+start+display request = urllib.request.Request(url) request.add_header("X-Naver-Client-Id",client_id) request.add_header("X-Naver-Client-Secret",client_secret) response = urllib.request.urlopen(request) rescode = response.getcode() response_body = response.read().decode('utf-8') json_data = json.loads(response_body) items = json_data["items"]

# rescode 200은 상태를 정상을 의미한다. if(rescode==200):

# 결과 파일로 저장하기 file = open("naver_"+category+".txt","w",encoding='utf-8') for item in items: file.write('제목: ' + item["title"] + '\n') file.write('요약내용 : ' + item["description"] + '\n') file.write('\n') file.close() else: print("Error Code:" + rescode)




2. 웹 크롤 중 발생하는 한글 인코딩 문제 해결하기


import requests from bs4 import BeautifulSoup


page = requests.get(url) # print(page.encoding)

# page.encoding = 'utf-8'


if(page.status_code==200):

soup_sub = BeautifulSoup(page_sub.content, 'html.parser',from_encoding='ANSI')


처음 인코딩 에러가 났을 때 utf-8 로 인코딩을 다시해봤지만 문제가 해결되지 않았습니다.


그때 이 문제를 해결하는 방법은 ANSI 로 인코딩하는 것입니다.




여기서 잠깐!

[ utf-8과 ANSI 인코딩의 차이? ]


ANSI와 UTF-8은 널리 사용되는 두 개의 문자 인코딩 방식압나다.



ANSI


ANSI 표준에서 모두는 128문자 이하로 했습니다. 


128문자 이하는 ASCII와 거의 같았지만, 지역에 따라 128 자 이상에서 문자를 처리 할 수있는 여러 가지 방법이있습니다.

이러한 서로 다른 시스템을 코드페이지라고 하며 한국의 경우 CP949 입니다.

(참고: 리눅스에서는 cp949로 해야 인코딩이 되었습니다.)


출처: 

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)



UTF-8


UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용합니다.


7비트 ASCII 문자와 혼동되지 않게 하기 위하여 모든 바이트들의 최상위 비트는 1입니다. 

따라서 첫 128 문자는 1바이트로 표시되고, 그 다음 1920 문자는 2바이트로 표시되며, 나머지 문자들 중 BMP 안에 들어 있는 것은 3바이트, 아닌 것은 4바이트로 표시됩니다.


출처: 위키백과 UTF-8




오늘은 여기까지!!

반응형

+ Recent posts