장고와 수프로 시작하는 웹 크롤링
자기소개
발표의 목적
Hello, Ms.Python, 오늘 날씨는 어때요.
Hello, Ms.Python, 오늘 세미나 장소 �주소를 알려주세요.
여러분은 앞으로
웹 크롤링 사이트
요런 90년대 올드한 느낌이 나는 웹사이트를 나이키st로 예쁘게 만들어봤어요.�http://www.sujinlee.me/runkorea/
Source
왜 만들었나요?
Coursera - Python for Everybody에서 �BeautifulSoup4, urllib2, 데이터 시각화 (구글 map 좌표 출력)를 배웠어요. (초보자에게 강추!)
지금까지 배운 내용을 응용해 장고로 웹사이트를 만들어보자!
→ 만들고 보니 장고 0.1티스푼정도 이해하게 되었어요.
어떤 것들을 추가했나요?
크롤링하기 전 선행 기본 지식
크롤링을 위한 도구
외부 패키지 - 설치가 필요합니다.�$ pip install requests �HTTP 프로토콜과 헤더관련 사항을 처리해줘 파일처럼 웹페이지를 다룰 수가 있어요.�$ pip install beautifulsoup4�HTML의 원소를 쉽게 추출하여 데이터를 얻을 수 있어요.
내부 패키지�import re�정규표현식을 알면 문자열을 찾거나, 수정하거나, 원하는 형식 문자열으로 변경할 수 있어요.�import json�딕셔녀리, 리스트를 json으로 변환할 수 있어요.
BeautifulSoup4
python3으로 웹 크롤링을 합니다.�
왜 BeautifulSoup 수프일까요?
당신의 파싱을 소중하게, 한글 인코딩 문제 해결
import requests�read=requests.get('URL')�read.encoding = 'euc-kr'
# -*- coding: utf-8 -*-
웹사이트 구조 살펴보고 파싱하기
크롬 웹 브라우저에서 오른쪽버튼을 눌러 개발자 도구로 html 소스를 확인하세요.
import requests�from bs4 import BeautifulSoup�read=requests.get('http://www.roadrun.co.kr/schedule/view.php?no=6198')�read.encoding = 'euc-kr'�soup = BeautifulSoup(read.content, 'html.parser')�table = soup.find_all('table')[1]
print(table)
<table>
</table>
BeautifulSoup4 크롤링 간단 레시피
[]
{}
�[{}, {}, {},.. {}]
event_data.py
with open("event_data.py", "w") as f:� try:� f.write('# -*- coding: utf-8 -*-\nevent_dict={}'.format(str(all_data)))� print("event_data.py Updated all data successfully!")� except:� print("event_data.py Error processing")
event_dict=[{'description': '경남에서 펼치지는 올해의 마지막 마라톤대회! 감사합니다.', 'location': '양산종합운동장', 'email': 'moon21@knnews.co.kr', 'weather': 'partly-cloudy-day', 'temperature': '6.68°C', 'website': 'http://www.ysrun.kr', 'date': '2016/12/04 09:30', 'race': '하프,10km,5km', 'city': '경남', 'application_period': '2016/5/30 - 2016/11/4', 'phone': '055-210-6103', 'host': '양산시, 경남신문', 'title': '제12회 양산전국하프마라톤', 'map_url': 'http:/…….
2. JSON 파일로 만들기
event_data.json
with open('event_data.json', 'w', encoding='utf8') as json_file:� json_file.write(all_data)
[� {� "temperature": "0.81°C",� "longitude": "127.06892112991035",� "latitude": "37.52929744334148",� "location": "한강시민공원 뚝섬지구 수변무대",� "phone": "042-638-1080",� "website": "http://www.run1080.com/new/mini/index.php?code=841",� "weather": "partly-cloudy-day",� "map_url": "http://map.daum.net/link/map/11078317",� "email": "run0314@naver.com",� "race": [� "풀",� "하프",� "10km",� "5km"� ],
� python for Informatics - charles severance (이광춘 역) 일부를 편집 수정
JSON (JavaScript Object Notation)
Django는 serialization framework으로 모델을 json으로 변환할 수 있어요.
https://docs.djangoproject.com/en/1.10/topics/serialization/
Django Rest Framework를 통해 인스턴스를 json 같은 형태로 직렬화(serializing) 또는 반직렬화(deserializing)하여 웹 API를 만들 수 있어요. �http://www.django-rest-framework.org/
Django Web Framework
앞서 만든 데이터 파일을
Django View로 연동해봅니다.
Django view
event_script.py
event_data.py
스크립트 실행
파일 생성
데이터 전달
from django.conf.urls import url, include�from . import views�urlpatterns = [� url(r'^runkorea/$', views.event_list, name='event_list'),�]
2. Django View / views.py
from file import function
from . import filename
from . import views �우리는 장고의 메소드와 blog 어플리케이션에서 사용할 모든 views들을 불러오고 있어요
.
장고걸스 튜토리얼 -urls.py 내용을 떠올려보세요.�https://tutorial.djangogirls.org/ko/django_views/
2. Django View / views.py
from . import event_data
def event_list(request):� events = event_data.event_dict� #context� context = {� 'events': events, }� return render(request, 'marathon/event_list.html', context)
3. Django Template / event_list.html
<table>
{% for event in events %}� <tbody>� <tr>� <td> {{ event.date }} </td>� <td> {{event.weather}} </td>� <td> {{ event.temperature }} </td>
…[...생략]
</tr>� {% endfor %}� </tbody>�</table>
매일 크롤링하기
그냥 궁금해서, Firebase
어려웠던 점
피드백 받기
장고 커뮤니티에 게시글을 올리면 많은선생님들이 좋은 숙제를 주십니다.
장고걸스서울 슬랙, Django 페이스북을 적극 활용하세요.
마치며
감사합니다.