Python 모듈 중에서는 유명한 웹 파싱 모듈이 많이 있다.

이 포스팅에서는 그 중에 하나인 BeautifulSoup를 이용한 간단한 크롤링을 해보고자 한다.

이유는 나중에 잊어버릴 것 같다;;

먼저 자신의 파이썬 환경에 BeautifulSoup4를 설치해 준다.

pip install beautifulsoup4 등 여러가지 방법으로 자신의 환경에 설치를 한 뒤에

from bs4 import BeautifulSoup
from urllib.request import urlopen

설치한 모듈을 임포트 한다. 아래 웹요청 내장 모듈도 임포트 한다.

이번에 간단하게 크롤링할 내용은 네이버 실시간 검색어이다.

base_url = "http://www.naver.com/"
db = pymysql.connect("localhost","root","123456","realtimekeyword", charset='utf8')
cursor = db.cursor()

크롤링만 하면 심심해서 나는 mysql db에 크롤링한 내용을 저장해 보았다.

url에 네이버 홈 url을 저장한 뒤 pymysql 모듈로 로컬에 접속을 cursor에 저장하였다.

이 후에 본격적으로 파싱 코드를 작성하였다.

data = urlopen(base_url).read()
soup = BeautifulSoup(data, "html.parser")
total_data = str(soup.find_all(attrs={'class': 'ah_l'}))
datalist = total_data.split('<li class=')

네이버url을 요청한 뒤 beautifulsoup를 통해 파싱한 정보를 soup에 저장한 뒤

soup에 저장된 데이터에서 class타입이 ‘ah_l’인 모든 정보를 찾아서 total_data에 저장하였다.

그리고 그 하위의 ‘<li class=’로 된 정보를 스플릿하여 datalist라는 리스트에 저장하였다.

이 과정에서 리스트에는 각 실검 단어들이 리스트 하나하나에 들어가게 된다.

현재 기준의 네이버의 페이지 코드이다. 이것을 참고하면서 파싱하면 된다.

전체 코드는 이러하다.

#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from urllib.request import urlopen
from datetime import datetime, timedelta
import time
import pymysql
from traceback import format_exc

base_url = "http://www.naver.com/"
db = pymysql.connect("localhost","root","123456","realtimekeyword", charset='utf8')
cursor = db.cursor()

def collecting(base_url):

    while True:

        data = urlopen(base_url).read()
        soup = BeautifulSoup(data, "html.parser")
        total_data = str(soup.find_all(attrs={'class': 'ah_l'}))
        datalist = total_data.split('<li class=')

        data = []
        nowtime = datetime.utcnow() + timedelta(hours=9)

        for each in datalist[1:]:
            try:
                RRank = int(each.split('class="ah_r">')[1].split('</span>')[0])
                tit = str(each.split('class="ah_k">')[1].split('</span>')[0])
                rk = int(each.split('class="ah_r">')[1].split('</span>')[0])
                data.append((RRank, tit, rk, str(nowtime)))

            except IndexError:
                print(format_exc())

        query = """insert into keywords(rtrank, title, rank, recordtime) values (%s, %s, %s, %s)"""
        cursor.executemany(query, tuple(data))
        db.commit()

        time.sleep(300)


collecting(base_url)

좀 허접하지만 연습 정도는 충분히 된다.

디비에는 이러한 식으로 저장이 된다.