먼저 이 전 내용을 확인해주세요.
2020/03/12 - [분류 전체보기] - 파이썬 크롤링 따라하기 - 네이버 검색결과(feat. BeautifulSoup)
2020/03/15 - [분류 전체보기] - 파이썬 크롤링 따라하기 - 네이버 검색결과2(feat. BeautifulSoup)
지난시간에는 검색결과를 입력받고 출력을 해보았는데,
이번에는 한단계 업그레이드 되었습니다.
여러 페이지의 검색결과를 쭉 출력할 수 있는 방법을 알려드릴께요.
강의를 만들어주신 김플님께 다시 한 번 감사드려요.
여러 페이지 크롤링을 위해선 네이버의 검색결과 페이지의 규칙을 확인해야 되요.
파이썬으로 검색한 블로그 결과에요.
자세히 보시면 맨 마지막에 숫자가 1, 11, 21로 끝나는 것을 알 수 있어요.
검색결과 1페이지
검색결과 2페이지
검색결과 3페이지
규칙은 1로 시작하여, 한 페이지가 넘어갈때마다 10씩 더해주는 구조에요.
만약 5페이지라면 41이라는 숫자가 뒤에 붙겠죠?
기존에는 baseUrl과 plusUrl을 합쳐서 Url이 구성되었는데,
지금은 baseUrl을 지워도 될 것 같아요.
urllib.parse.quote_plus를 plusUrl로 옮겨줄거에요.
이러면 입력된 검색어는 인코딩 이슈 없이 입력받을 수 있어요.
또, 아까 페이지 규칙을 활용하여, pageNum이라는 변수를 정의했어요.
첫 페이지가 1페이지니, 1부터 시작할거에요.
url에는 f라고 변수를 정의해주고,
검색어 값에 {plusUrl} 넣으면, 입력받은 주소가 여기에 들어가고, 마지막에 {pageNum} 입력했으니,
아까 정의된 pageNum이 1로 될꺼에요.
# baseUrl = 'https://search.naver.com/search.naver?where=post&sm=tab_jum&query='
plusUrl = urllib.parse.quote_plus(input('검색어를 입력해주세요 :'))
pageNum = 1
url = f'https://search.naver.com/search.naver?date_from=&date_option=0&date_to=&dup_remove=1&nso\
=&post_blogurl=&post_blogurl_without=&query={plusUrl}&sm=tab_pge&srchby=all&st=sim&where=post&start={pageNum}'
print(url)
반복문을 할때,
for문도 있지만 이번엔 while 사용할 거에요.
pageNum이 lastPage +1 보다 작을때까지 반복하는데
title 및 url을 출력해주고,
pageNum을 10 더해서 다시 2페이지를 가져오고.. 이를 반복해서 출력하라는 이야기에요.
count를 1을 더해주는건 "몇페이지 결과입니다" 부분에 숫자를 넣기 위함이에요.
자 완성된 코드입니다.
#네이버 검색결과 여러 페이지 가져오기
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
# baseUrl = 'https://search.naver.com/search.naver?where=post&sm=tab_jum&query='
plusUrl = urllib.parse.quote_plus(input('검색어를 입력해주세요 :'))
pageNum = 1
count = 1
i = input('몇페이지까지 크롤링 할까요? :')
lastPage = int(i) * 10 - 9
while pageNum < lastPage + 1:
url = f'https://search.naver.com/search.naver?date_from=&date_option=0&date_to=&dup_remove=1' \
f'&nso=&post_blogurl=&post_blogurl_without=&query=' \
f'{plusUrl}&sm=tab_pge&srchby=all&st=sim&where=post&start={pageNum}'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all(class_='sh_blog_title')
print(f'----{count}페이지 결과입니다---')
print()
for i in title:
print(i.attrs['title'])
print(i.attrs['href'])
print()
pageNum += 10
count += 1
최근댓글