정구리의 우주정복
Python 웹크롤링 (Web Crawling) 01. 네이버 검색결과 크롤러 만들기(1) 본문
웹 크롤링이 갑자기 해보고싶어서 할거다
웹 크롤링이란 ?
-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 을 분석하기 위해선 개발자 도구를 켜야하는데 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 = '' 에 입력값을 붙여준다
그럼 되지않을까 ?