python crawling (naver)
● python을 이용한 Naver 크롤링
- 네이버 에서는 크롤링을 위한 api를 제공하지만 범용적인 사용을 위해서 BeautifulSoup를 사용하여 크롤링 진행
- 이번 크롤링 에서는 네이버 블로그, 카페 에 개시된 정보를 크롤링하도록 구현
- 블로그, 카페 내용중 제목, 썸네일, 포스팅 날짜, 내용, 블로그 링크 정보를 가져온다.
● 파일 경로
Crawling
- browser
- browser_Info.py
- naver_crawling.py
> browser_Info.py : 브라우저 정보(카페, 블로그 에 개시된 제목, 썸네일, 포스팅날짜, 내용, 블로그 링크 정보)
> naver_crawling.py : 크롤링을 실행
● naver_crawling.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from crawling import browserInfo
blog_set = list() # 검색 결과
'''
네이버, 다음 크롤링 (썸네일, 제목, 포스팅날짜, 내용, 블로그링크)
@param category : 검색 탭 (블로그, 카페)
@param keyword : 검색 키워드
@param start : 페이지
'''
def get_crawling_data(browser, category, keyword, start):
crawling_info = browserInfo.naver_info(keyword, start)
url = crawling_info["url"]
request = requests.get(url)
content = request.text
bs_obj = BeautifulSoup(content, "html.parser") # 검색 후 브라우저 전체 html
rows = bs_obj.find_all(crawling_info["content_type"]["tag"], {"class": crawling_info["content_type"]["class"]}) # 게시물 개별 정보
for row in rows:
data = {}
thumbnail = row.find(crawling_info["thumbnail"]["tag"], {"class": crawling_info["thumbnail"]["class"]}) # 썸네일
title = row.find(crawling_info["title"]["tag"], {"class": crawling_info["title"]["class"]}).text # 제목
description = row.find(crawling_info["description"]["tag"], {"class": crawling_info["description"]["class"]}).text # 내용
post_date = row.find(crawling_info["post_date"]["tag"], {"class": crawling_info["post_date"]["class"]}).text # 포스팅 날짜
blog_link = row.find(crawling_info["link"]["tag"], {"class": crawling_info["link"]["class"]}).text # 블로그 링크
if thumbnail is None:
data["thumbnail"] = ""
else:
data["thumbnail"] = thumbnail['src']
data["title"] = title
data["description"] = description
data["post_date"] = post_date
data["blog_link"] = blog_link
blog_set.append(data)
page_start = [1, 11, 21, 31, 41]
[get_crawling_data("post", keyword, start) for start in page_start] # 블로그 크롤링
[get_crawling_data("article", keyword, start) for start in page_start] # 카페 크롤링
for data in blog_set:
print(data)
● browser_Info.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
네이버 브라우저 정보
@param search_tag : 검색 탭 구분 (블로그, 카페)
@param keyword : 검색 키워드
@param start : 검색 페이지
'''
def naver_info(search_tag, keyword, start):
url = "https://search.naver.com/search.naver?where=" + search_tag + "&sm=tab_jum&query=" + keyword + "&start=" + str(start)
thumbnail = ""; title = ""; post_date = ""; description = ""; link = "";content_type = ""
if search_tag == "post": # 블로그 크롤링 정보
content_type = {"tag": "li", "class": "sh_blog_top"} # 게시물 개별 정보
thumbnail = {"tag": "img", "class": "sh_blog_thumbnail"} # 썸네일
title = {"tag": "a", "class": "sh_blog_title _sp_each_url _sp_each_title"} # 제목
post_date = {"tag": "dd", "class": "txt_inline"} # 포스팅 날짜
description = {"tag": "dd", "class": "sh_blog_passage"} # 내용
link = {"tag": "a", "class": "url"} # 블로그 /카페 주소
else : # 카페크롤링 정보
content_type = {"tag": "li", "class": "sh_cafe_top"}
thumbnail = {"tag": "img", "class": "sh_cafe_thumbnail"}
title = {"tag": "a", "class": "sh_cafe_title"}
post_date = {"tag": "dd", "class": "txt_inline"}
description = {"tag": "dd", "class": "sh_cafe_passage"}
link = {"tag": "a", "class": "url"}
info_set = {"content_type": content_type, "url": url, "thumbnail": thumbnail, "title": title, "post_date": post_date, "description": description, "link": link}
return info_set
- naver_crawling.py 를 실행하게 되면 get_crawling_data()를 호춢하게 된다.
** 블로그, 카페에서 검색을 10개만 검색이 되서(아직 방법을 못찾...) 50개씩 받아오기 위해 5번 반복을 통해서 받아오는 방식으로 구현
- 호출시 url을 살펴보면 where, query, start를 확인할 수 있는데 where은 검색할 장소 (블로그, 카페)를 뜻하고 , query는 검색 키워드, start 페이지 수를 나타낸다.
"https://search.naver.com/search.naver?where=" + search_tag + "&sm=tab_jum&query=" + keyword + "&start=" + str(start)
- 찾고자 하는 태그는 find(), find_all()함수를 통해서 접근할 수 있다. 다른점은 find()는 여러건중 가장 먼저 접근되는 태그를 반환하게 되고, find_all() 은 모든 태그를 접근할 수 있다.
사용법은 동일한대 find("태그이름", {"구분자" : "구분자명"}) 의 형태로 사용이 가능하다.
또한, 태그의 속성을 가저올 경우는 find뒤에 ["속성명"] 으로 사용가능