정구리의 우주정복

Python 웹크롤링 (Web Crawling) 01. 네이버 검색결과 크롤러 만들기(1) 본문

PYTHON/STUDY

Python 웹크롤링 (Web Crawling) 01. 네이버 검색결과 크롤러 만들기(1)

Jungry_ 2020. 3. 28. 00:43
반응형

 

웹 크롤링이 갑자기 해보고싶어서 할거다

 

웹 크롤링이란 ? 

-WEB 상에 존재하는 콘텐츠들은 수집하는 작업

 

오늘은 네이버에 검색하면 블로그 검색 결과를 출력하는 크롤러를 만들어 볼것이다

참고는  '프로그래머 김플 스튜디오' 님 영상

 

처음이니까 구체적으로 쓸거임 !

 

1. url 호출 및 html 결과 출력하기 

#네이버 검색결과 크롤러 만들기

import urllib.request
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?where=post&sm=tab_jum&query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html,'html.parser')

print(soup)

우선 import 된 친구들에 대해서 알아보자 

 

(1) urllib 

urllib is a package that collects several modules for working with URLs

(URL로 동작하는 몇개의 모듈을 수집하는 패키지 , 클릭시 urllib 에 대한 설명으로 이동)

urllib.request :  for opening and reading URLs (URL을 읽어오는 모듈이다)

 

(2)BeautifulSoup

Beautiful Soup is a Python library for pulling data out of HTML and XML files.

(BeautifulSoup은 HTML 과 XML 파일로부터 데이터를 수집하는 라이브러리)

html 의 내용을 전달받아 html.parser 를 이용해 파싱한다

 

url 에는 파싱할 url 값을 넣고

html 은 urllib를 이용해 url을 가져와 html 값을 저장한다 (이때 html 은 우리가 읽어도 이해할수없는 형식으로 가져와짐)

soup 을 이용해 파싱을 하면 비로소 우리가 이해할 수 있는 형태로 읽어와 지는거다

 

중간 값을 확인해보기 위해 print 로 찍어보면

 

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

 

이런 에러가 난다

이게 뭔가 했더니 불러들인 url 이 https 형태여서 생기는 오류라고 한다

해결을 위해 

import ssl

context = ssl._create_unverified_context()

이 문장을 넣어준다

전체 소스는 

import urllib.request
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()
url = 'https://search.naver.com/search.naver?where=post&sm=tab_jum&query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'
html = urllib.request.urlopen(url,context=context).read()
soup = BeautifulSoup(html,'html.parser')

print(soup)

 이렇게 된다 html 부분에 context=context 를 추가해준다

 

이렇게 하면 네이버 검색창에 파이썬을 검색했을때 블로그 결과창의 html 이 나온다 

대충 이렇게 엄청 긴게 나옴 이러면 잘 된거다 

잘 불러들여진걸 확인했으니 다음으로 넘어가자

html 분석하기

html 을 분석하기 위해선 개발자 도구를 켜야하는데 mac 에서 chrome 은 option+command+i 를 누르면 된다 (윈도우는 f11 일걸요)

다음에 왼쪽 위의 빨간 동그라미 친걸 누르고 웹에서 내가 찾고싶은 html 부분을 클릭하면 

내가 원하는 곳에 마우스를 올려보자

그럼 내가 원하는 태그와 그 안의 속성들을 확인할 수 있다

분석결과 모두 게시글의 제목은 모두 a 태그안에 sh_blog_title 이 클래스로 지정이 되어있다

 

 

import urllib.request
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()
url = 'https://search.naver.com/search.naver?where=post&sm=tab_jum&query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'
html = urllib.request.urlopen(url,context=context).read()
soup = BeautifulSoup(html,'html.parser')

title = soup.find_all(class_='sh_blog_title')
print(title)

class 는 원래 파이썬에서 사용하는 예약어이기 때문에 class 뒤에 _를 써준다

전체 html 안에서 클래스에 sh_blog_title 이라는 걸 가진 애들은 title 에 넣어준다는 의미 

find 는 하나만 찾는거고 find_all 은 다 찾는거다 

출력을 해보면

결과물중 한 줄

여기서 우리가 필요한건 href 와 title 부분이다 

전체 소스와 결과 

이제 for 문을 이용해 제목과 url 을 뽑아보자

네이버는 한 화면에 10개의 블로그를 보여주기 때문에 결과물이 10 개가 나오게 된다

print(i.attrs['title']) 

 

여기서 attrs 는 속성값을 말한다 class가 sh_blog_title 인것 중에서 속성값이 title , href 인것들을 뽑아내기

 

그럼 이렇게 결과물이 나온다 

 

 

다음번 게시물에서는 고정된 url 이 아니라 콘솔에서 입력 -> 네이버 검색 결과 출력 을 해보려고 하는데

예상 : 입력을 받는다 -> url 맨뒤에 qurey = '' 에 입력값을 붙여준다 

그럼 되지않을까 ? 

반응형
Comments