본문 바로가기

DB엔지니어가 공부하는 python

[python] 크롤러 만들어 db에 정보 insert 하기

일단, 아래 소스에서 영화 제목과 평점을 뽑아 오는 과정은

타 블로그에서 소스를 가져왔습니다..

(해당 소스가 여기저기 블로그에 많이 있어서 어디가 원본인지 파악이 힘듦)

 

파이썬을 이용해서 크롤러를 만들기 위해 구글 선생님한테 가서 무척이나 많은 검색을 부탁드렸고,

아래와 같이, 비교적 간단한 크롤링을 구현하는 소스를 구하게 되었다.

 

그냥 소스를 돌리기만 하면 그건 내 것이 아니니..

소스 분석을 해보았다.

 

그리고 내가 가지고 있는 TEST DB에 그 데이터를 insert 하는데 까지 일단 성공!

블로그에 흔적을 남겨둔다.

from bs4 import BeautifulSoup
from urllib.request import urlopen

#선언부로, 어떤 모듈을 쓸것인지.. 선언하는 부분.

#위와 같이 선언한다고 다 쓸수 있는건 아니다. 해당 모듈을 설치하고, 선언을 해야지..

#pip3 install BeautifulSoup

#pip3 install urlopen

#모듈을 설치 해보자.

url = "http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=cur&date=20180802"

#url 이란 변수에 http...로 시작하는 url 주소를 저장


page = urlopen(url)
soup = BeautifulSoup(page, "html.parser")

#page란 변수에 urlopen함수로 반환받은 url값의 객체를 저장

#잘 모르겠을땐.. 위 함수 돌린다음에, 주피터 노트북에서 print(page) 해보면 이해하기 쉬움

#soup 역시, 해당 변수에 BeautifulSoup 함수에서 반환하는 파싱한 값을 저장


movie_name = [soup.find_all('div', 'tit5')[n].a.string for n in range(0, len(title_n))]
# 전체 영화의 제목을 뽑아옴


movie_point = [soup.find_all('td', 'point')[n].string for n in range(0, len(title_n))]

# 전체 순위의 평점을 뽑아옴



#위 두줄에서 보면 div, tit5, td, point 등이 있는데, 이런값을 어떻게 알아내냐면,

#크롤링할 웹페이지를 크롬에서 열어 F12키를 누르면 html문서 소스가 나온다.

#여기에서 우리가 크롤링하려는 데이터 대상이 어떤 변수에 저장이 되어 화면에 나타나는지

#잘 살펴보면 알 수 있다. 저기 저 웹페이지에 가서 한번 확인 해보자.


import pymysql

#이것역시, pymysql이란 모듈을 쓰겠다고 import 하는 부분이다.

#안깔려있다면, pip3 install pymysql 로 설치..

#pymysql은 mysql 이나 mariadb에 python으로 접속을 할 수 있게 하는 모듈이다.

conn = pymysql.connect(host='192.168.1.25',
user = 'DB유저', password='비밀번호', db = '스키마명',charset = 'utf8')

#접속할 대상 DB의 접속정보

curs = conn.cursor(pymysql.cursors.DictCursor)

#DB에 연결한다 정도..

for x,y in zip(movie_name,movie_point):
#위에서 뽑아낸 영화이름과 평점만큼 insert문을 돌려야 하기에.. 

#두 변수를 zip이라는 변수로 합쳐서 돌립니다. 각각의 데이터를 x,y에 대입합니다.


     sql = "insert into python_test_01 values (%s,%s)"
     val = (x,y)

     curs.execute(sql,val)

#sql변수에 insert....문을 만들어 넣어주고, 영화제목과 평점 부분은 %s라고 받아 넣습니다.

#그리고 val에 x,y변수를 넣어주고, 이것은 위에서 선언한 영화제목, 그리고 평점 데이터 입니다.

#마지막 세번째 명령문에서 sql을 실행하고, %s에 순서대로 변수에 저장된 데이터를 넣어라... 가 됩니다.

conn.commit()

#commit을 치는 부분입니다.

conn.close()

#세션을 닫습니다.

 

*여기에서 처음 시작하는 파린이들에게 해드리고 싶은 말은...

insert문을 for문으로 돌릴 때 for문 아래 세줄의 명령문이 들여 쓰기 되어 있는데,

파이썬은 loop문에 괄호 같은 게 없기 때문에 들여 쓰기로 구분이 됩니다.

다른 언어들과는 달리 들여 쓰기에 의미가 있으니, 잘 파악하시길 바랍니다.

 

감사합니다.