본문 바로가기
개발

python beautifulSoup를 이용해 crawling 한 정보 db저장하기

by ujin2021 2020. 8. 4.

오늘은 python library beautifulSoup를 이용하여 필요한 정보를 crawling 후, db에 저장하는 방법에 대해 적어보겠습니다.

python : 3.8

mysql : 8.0

 

1. 필요한 라이브러리 install

pip install requests
pip install beautifulsoup4
pip install pymysql

requests : http 요청처리를 위해 사용하는 모듈

beautifulsoup4 : html 및 xml 문서 구문 분석을위한 Python 패키지

pymysql : python과 mysql을 이어주는 패키지

 

2. html 크롤링하기

 

저는 영화와 평점이 있는 웹페이지 url을 선언해주고, 해당 웹페이지의 html을 가져왔습니다. 실제로 print(soup)해보면, 해당웹페이지에서 f12번을 누르면 볼 수 있는 html파일이 프린트 됩니다.

몇가지 조건을 넣어서 필요한 것들만 가져올 수 있는데, 예시코드는 여기 를 참고해주세요

 

3. 가져올 정보 위치 찾기

저는 summer_intern이라는 db를 생성하고, test_crawling이라는 테이블을 만들어주었습니다. attribute에는 pk, movie(varchar(30)), poin(varchar(10)) 을 넣어주었습니다.

웹페이지+f12

제가 가지고 와야 할 정보는 영화제목과 평점 입니다. f12번을 누르면 html 소스가 나타나는데, 영화검색 버튼 오른쪽에 노란색 하이라이트 친 부분을 클릭 후 '가버나움' 이라는 영화제목을 클릭하면 해당 소스가 어느부분인지 회색 블락으로 표시됩니다. 잘 살펴보면 div 태그에 class 이름은 tit5라고 지정되어있습니다. '위대한 쇼맨'을 클릭해도 div태그에 class 이름은 tit5입니다. 따라서 영화제목들은 <div class='tit5'> 로 가져올 수있습니다.

마찬가지로 평점은 td태그에 point 라는 이름으로 지정되어있습니다.

 

4. 해당정보 가져오기

 

title_n은 div태그의 class 가 tit5인 요소를 모두 가져옵니다. (point_n도 마찬가지)

movie_name은 해당 요소에서 진짜 영화제목을 리스트에 저장하는 코드입니다.

 

title_n과 point_n을 출력해보면(보기쉽게 3개만 출력해보았습니다)

 

이렇게 나옵니다. 영화제목은 그중에서도 a태그 안에 있는것을 확인할 수 있습니다.

 

그래서 movie_name list를 만들 때, div tag와 class가 tit5 인것을 find_all 로 모두 찾은 후, .a 로 a태그만 걸러내고, 그것을 string형식으로 바꿔줍니다.(영화제목 수 만큼-> len(title_n), title_n은 해당 웹페이지에서 모든영화제목을 가져온 리스트입니다)

point는 td태그에 있으므로 그냥 .string으로만 했습니다.

 

movie_name, movie_point를 출력해보면,

['가버나움', '위대한 쇼맨', '알라딘', '소년시절의 너', '다크 나이트', '시네마 천국', '패왕별희 디 오리지널', '우리들', '피아니스트의 전설', '바람과 함께 사라지다', '톰보이', '스
타 이즈 본', '샤인', '미스비헤이비어', '타오르는 여인의 초상', '미져리', '안녕, 나의 소울메이트', '온워드: 단 하루의 기적', '미션', '시티 오브 갓', '미녀와 야수', '소공녀', '벌 
새', '베스트 오퍼', '카메라를 멈추면 안 돼!', '트로이', '라라랜드', '플라이', '찬실이는 복도 많지', '내일을 위한 시간', '헤이트풀8', '캐리', '울프 콜', '소리꾼', '다가오는 것들', '카페 벨에포크', '밤쉘: 세상을 바꾼 폭탄선언', '원 데이', '로마 위드 러브', '클라우즈 오브 실스마리아', '몽상가들', '야구소녀', '존 윅', '아들', '결백', '호우시절', '조디악', 
'유령선', '반도', '레이니 데이 인 뉴욕']
['9.59', '9.40', '9.38', '9.36', '9.34', '9.31', '9.31', '9.25', '9.25', '9.24', '9.22', '9.18', '9.08', '9.05', '9.05', '9.02', '8.98', '8.97', '8.92', '8.84', '8.78', '8.77', 
'8.76', '8.64', '8.64', '8.62', '8.60', '8.60', '8.60', '8.54', '8.45', '8.43', '8.41', '8.35', '8.33', '8.32', '8.25', '8.22', '8.18', '8.17', '8.11', '8.08', '7.95', '7.86', '7.61', '7.38', '7.38', '6.31', '5.97', '5.35']

이렇게 필요한 것만 리스트에 잘 저장이 되어있습니다.

 

5. db에 연결하기

이제 python과 db를 연결해보겠습니다.

 

소스를 github에 올리는데, db정보는 올리면 안되기때문에 같은폴더에 db_setting.py 파일을 만들고, 파일안에 db 딕셔너리를 만들어 주었습니다. 그리고 이 파일에서 import 를 해주었습니다. 그리고 db_setting.py 는 .gitignore에 추가해주었습니다. 각자의 db정보를 넣어주시면 되겠습니다.

 

6. db에 저장하기

zip으로 영화제목과 평점을 튜플로 묶어준 것에서 title과 point하나씩을 뽑아서 val에 넣어줍니다. sql문은 insert문으로 짜줍니다. INSERT INTO [table_name] (column_1, column_2) VALUES (value_1, value_2)

commit 하고, connection을 닫아줍니다.

 

db에 들어가서 확인해보면 데이터가 저장되어있는걸 확인할 수 있습니다.

 

<전체코드>


'개발' 카테고리의 다른 글

[노마드코더]인스타 클론코딩 사전 지식 쌓기  (0) 2021.03.07
ubuntu crontab 설정하기  (0) 2020.09.25
ec2 ppk 파일 없이 접속하기  (0) 2020.08.02
라즈베리파이 기본설정  (0) 2020.07.23