python + Django

python crawling (naver)

mooooon 2019. 11. 1. 10:47

● 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뒤에 ["속성명"] 으로 사용가능