정구리의 우주정복

Python 웹크롤링 (Web Crawling) 04. 네이버 검색 결과 여러 페이지 가져오기 본문

PYTHON/STUDY

Python 웹크롤링 (Web Crawling) 04. 네이버 검색 결과 여러 페이지 가져오기

Jungry_ 2020. 3. 31. 23:59
반응형

공부용이라 과정이 틀릴수도 있고 위에서 쓴 구문을 아래에선 안 쓸 수도있음 코드 잘 확인하기 

 

 

저번에 했던 네이버 검색 블로그 결과 출력의 업그레이드 버전이다 

저번엔 블로그 결과의 한페이지를 가져왔다면 이번엔 많은 페이지를 가져와보자

 

아직 초보라 html 태그를 뭘 가져와야 잘 가져왔다 소문이 날 지 헷갈린다 

 


구상(내 생각)

1. url 분석

2. html 분석 (필요한거 가져오기)

3. 출력해보기

 

페이지가 넘어갈때 마다 url  이 바뀌니까 반복문으로 url 을 바꿔주고

내용 출력 -> url 바꾸고 -> 내용 출력 이런식으로 반복을 해보자


1. url 분석

네이버에 사과 검색 후 블로그 검색 결과 중 1페이지

내가 원하는건 1페이지만 출력이 되는게 아니라 그 다음페이지도 쭉쭉 나오는거기 때문에 각각의 url 부터 확인해 보겠다

 

1-3페이지 까지의 url 

1번 페이지에서 2번으로 넘어갈땐 뒤에 뭐가 쭈우욱 붙고 

2에서 3으로 넘어갈땐 맨 뒤에 숫자만 바뀌는걸 볼 수 있다 (10이 증가했다)

start = 11 인거로 추측하는건 혹시 2번째 페이지는 11번째 게시글 부터 시작한다는 의미가 아닐까 ??

3번째 페이지는 21번째 부터 시작이라 start=21 이 붙고 

그래서 첫번째 페이지는 1번부터 시작이니까 start=1 을 넣어서 url 을 넣어봤다

 

그랬더니 진짜 1페이지가 나오는거임 !!

1페이지가 나온걸 확인할 수 있다 !!

그럼 나는 맨 끝의 숫자를 10씩 증가시킴으로서 다음페이지로 넘어갈 수 있는거다 !

 


2. html 분석 

블로그에 사과라고 검색했을 때

내가 불러올건 블로그 이름과 블로그의 주소이기 때문에 class="sh_blog_title" 을 이용해 볼거임 !!

클래스 안의 href 와 title 을 이용해서 출력을 해주면 될듯


3. 출력해주기

 

import urllib.request
from urllib import parse
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()
search = input("검색어를 입력하세요 : ")
baseUrl1 = "https://search.naver.com/search.naver?date_from=&date_option=0&date_to=&dup_remove=1&nso=&post_blogurl=&post_blogurl_without=&query="
baseUrl2 = "&sm=tab_pge&srchby=all&st=sim&where=post&start="
postNum = 1 #10씩 증감할 게시글 번호

#여기부터 for 문 들어갈 친구들 

for i in range(2): #몇 페이지 까지 불러올지 
    newUrl = baseUrl1+parse.quote_plus(search)+baseUrl2+str(postNum)

    html = urllib.request.urlopen(newUrl,context=context).read()
    soup = BeautifulSoup(html,'html.parser')
    title = soup.find_all(class_='sh_blog_title') 
    postNum = postNum+10 #postNum 을 증가시켜준다
    for i in title:  #출력 부분
        print(i.attrs['title']) #attrs = 속성
        print(i.attrs['href'])
        print('\n')
        

for 문을 이용해 url 을 바꿔주게끔 만들어 보았다 !!

baseUrl1,2 에 검색어 앞뒤로 들어갈 내용을 넣어줬고 

postNum = 1 을 설정해서 처음엔 1번 게시글(1페이지) 가 나오게 설정

 

for 문 의 range() 안의 숫자를통해 내가 출력을 원하는 페이지 수를 넣을 수 있고 

newUrl 은 검색될 url 을 넣어주는데 맨 마지막의 postNum 의 변화를 통해 페이지 수를 바꿔준다 1->11 (2페이지) ->21 (3페이지) ...

html 안에 url 넣어주고 soup 으로 파싱해준다

title 변수 안에 sh_blog_title 클래스 를 가진 모든 친구들을 넣어주고 

postNum 을 + 10 해주는걸 잊지말자 

 

또 다른 for 문을 보면 이제 sh_blog_title 을 가진 title 을 이용한다( 실질적인 출력 부분이다)

title (게시글 제목) 과 href(경로) 를 출력해주면 완성 !

 

만약 몇 페이지까지 크롤링을 하고싶은지도 그때 그때 정하고 싶으면 input 을 이용해 range() 안의 값을 바꿔주면 됨

 

반응형
Comments