Level 1

In [3]:
import requests
from bs4 import BeautifulSoup

lv1_url="https://askdjango.github.io/lv1/"
html=requests.get(lv1_url).text
soup=BeautifulSoup(html,'html.parser')
In [4]:
soup
Out[4]:
<!DOCTYPE doctype html>

<html lang="ko">
<head>
<meta charset="utf-8"/>
<title>[레벨1] 단순 HTML 크롤링</title>
<style>
#logo {
    max-width: 100%;
}
</style>
</head>
<body>
<h1>AskDjango VOD</h1>
<h2>[레벨1] 단순 HTML 크롤링</h2>
<p>본 HTML에 크롤링할 데이터가 있습니다.</p>
<ul id="course_list">
<li class="course"><a href="https://nomade.kr/vod/setup/">개발환경 구축하기</a></li>
<li class="course"><a href="https://nomade.kr/vod/python/">파이썬 차근차근 시작하기</a></li>
<li class="course"><a href="https://nomade.kr/vod/crawling/">크롤링 차근차근 시작하기</a></li>
<li class="course"><a href="https://nomade.kr/vod/automation/">파이썬으로 업무 자동화</a></li>
<li class="course"><a href="https://nomade.kr/vod/django/">장고 - 기본편</a></li>
<li class="course"><a href="https://nomade.kr/vod/djangogirls/">장고걸스 튜토리얼</a></li>
<li class="course"><a href="https://nomade.kr/vod/form/">장고 - Form/ModelForm 잘 알고 쓰기</a></li>
<li class="course"><a href="https://nomade.kr/vod/cbv/">장고 - 클래스 기반 뷰. 잘 알고 쓰기</a></li>
<li class="course"><a href="https://nomade.kr/vod/payment/">장고 - 결제 시스템 연동</a></li>
<li class="course"><a href="https://nomade.kr/vod/frontend/">장고 - 웹 프론트엔드 시작편</a></li>
<li class="course"><a href="https://nomade.kr/vod/widgets/">장고 - 다양한 위젯 만들기</a></li>
<li class="course"><a href="https://nomade.kr/vod/apiserver/">장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기</a></li>
<li class="course"><a href="https://nomade.kr/vod/hybrid/">장고 - 하이브리드 앱 만들기</a></li>
<li class="course"><a href="https://nomade.kr/vod/deploy/">장고 - 서비스 배포하기</a></li>
<li class="course"><a href="https://nomade.kr/vod/django-baemin/">장고 - 실전편 (Feat. 배달의 민족 St. 만들기)</a></li>
<li class="course"><a href="https://nomade.kr/vod/django-instagram/">장고 - 실전편 (Feat. 인스타그램 St. 만들기)</a></li>
</ul>
<img id="logo" src="https://nomade.kr/static/2017031408/nomadekr-og.jpg"/>
<hr/>
<h3>미션</h3>
<ul>
<li>위 VOD 코스의 코스명과 URL을 크롤링</li>
<li>제약사항 : requests 라이브러리만을 사용하세요.</li>
</ul>

실행 예시

<pre>
    개발환경 구축하기 https://nomade.kr/vod/setup/
    파이썬 차근차근 시작하기 https://nomade.kr/vod/python/
    크롤링 차근차근 시작하기 https://nomade.kr/vod/crawling/
    파이썬으로 업무 자동화 https://nomade.kr/vod/automation/
    장고 - 기본편 https://nomade.kr/vod/django/
    장고걸스 튜토리얼 https://nomade.kr/vod/djangogirls/
    장고 - Form/ModelForm 잘 알고 쓰기 https://nomade.kr/vod/form/
    장고 - 클래스 기반 뷰. 잘 알고 쓰기 https://nomade.kr/vod/cbv/
    장고 - 결제 시스템 연동 https://nomade.kr/vod/payment/
    장고 - 웹 프론트엔드 시작편 https://nomade.kr/vod/frontend/
    장고 - 다양한 위젯 만들기 https://nomade.kr/vod/widgets/
    장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기 https://nomade.kr/vod/apiserver/
    장고 - 하이브리드 앱 만들기 https://nomade.kr/vod/hybrid/
    장고 - 서비스 배포하기 https://nomade.kr/vod/deploy/
    장고 - 실전편 (Feat. 배달의 민족 St. 만들기) https://nomade.kr/vod/django-baemin/
    장고 - 실전편 (Feat. 인스타그램 St. 만들기) https://nomade.kr/vod/django-instagram/
</pre>
<p>AskDjango 크롤링 VOD를 통해 크롤링의 기본을 배우고, 꾸준히 크롤링을 연습해보세요.</p>
<hr/>
<p><a href="/">home</a></p>
<p>
    여러분의 파이썬/장고 페이스메이커가 되겠습니다. &amp;dash; <a href="https://nomade.kr/vod/">AskDjango VOD</a>
</p>
<p>
    ©
    <script>document.write((new Date()).getYear() + 1900);</script>
    SHAKEADE
</p>
</body>
</html>
In [9]:
for a_tag in soup.select("#course_list .course > a"): #course_list id 아래에 course 클래스 바로 자식 태그 a 
    print(a_tag.text, a_tag['href'])
    #print(a_tag['href']) #링크만 가지고 옴
    
개발환경 구축하기 https://nomade.kr/vod/setup/
파이썬 차근차근 시작하기 https://nomade.kr/vod/python/
크롤링 차근차근 시작하기 https://nomade.kr/vod/crawling/
파이썬으로 업무 자동화 https://nomade.kr/vod/automation/
장고 - 기본편 https://nomade.kr/vod/django/
장고걸스 튜토리얼 https://nomade.kr/vod/djangogirls/
장고 - Form/ModelForm 잘 알고 쓰기 https://nomade.kr/vod/form/
장고 - 클래스 기반 뷰. 잘 알고 쓰기 https://nomade.kr/vod/cbv/
장고 - 결제 시스템 연동 https://nomade.kr/vod/payment/
장고 - 웹 프론트엔드 시작편 https://nomade.kr/vod/frontend/
장고 - 다양한 위젯 만들기 https://nomade.kr/vod/widgets/
장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기 https://nomade.kr/vod/apiserver/
장고 - 하이브리드 앱 만들기 https://nomade.kr/vod/hybrid/
장고 - 서비스 배포하기 https://nomade.kr/vod/deploy/
장고 - 실전편 (Feat. 배달의 민족 St. 만들기) https://nomade.kr/vod/django-baemin/
장고 - 실전편 (Feat. 인스타그램 St. 만들기) https://nomade.kr/vod/django-instagram/

Level2

In [10]:
lv2_data_json_url="https://askdjango.github.io/lv2/data.json"
json_string=requests.get(lv2_data_json_url).text
In [12]:
json_string
Out[12]:
'[\n    {\n        "name": "개발환경 구축하기",\n        "url": "https://nomade.kr/vod/setup/"\n    },\n    {\n        "name": "파이썬 차근차근 시작하기",\n        "url": "https://nomade.kr/vod/python/"\n    },\n    {\n        "name": "크롤링 차근차근 시작하기",\n        "url": "https://nomade.kr/vod/crawling/"\n    },\n    {\n        "name": "파이썬으로 업무 자동화",\n        "url": "https://nomade.kr/vod/automation/"\n    },\n    {\n        "name": "장고 - 기본편",\n        "url": "https://nomade.kr/vod/django/"\n    },\n    {\n        "name": "장고걸스 튜토리얼",\n        "url": "https://nomade.kr/vod/djangogirls/"\n    },\n    {\n        "name": "장고 - Form/ModelForm 잘 알고 쓰기",\n        "url": "https://nomade.kr/vod/form/"\n    },\n    {\n        "name": "장고 - 클래스 기반 뷰. 잘 알고 쓰기",\n        "url": "https://nomade.kr/vod/cbv/"\n    },\n    {\n        "name": "장고 - 결제 시스템 연동",\n        "url": "https://nomade.kr/vod/payment/"\n    },\n    {\n        "name": "장고 - 웹 프론트엔드 시작편",\n        "url": "https://nomade.kr/vod/frontend/"\n    },\n    {\n        "name": "장고 - 다양한 위젯 만들기",\n        "url": "https://nomade.kr/vod/widgets/"\n    },\n    {\n        "name": "장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기",\n        "url": "https://nomade.kr/vod/apiserver/"\n    },\n    {\n        "name": "장고 - 하이브리드 앱 만들기",\n        "url": "https://nomade.kr/vod/hybrid/"\n    },\n    {\n        "name": "장고 - 서비스 배포하기",\n        "url": "https://nomade.kr/vod/deploy/"\n    },\n    {\n        "name": "장고 - 실전편 (Feat. 배달의 민족 St. 만들기)",\n        "url": "https://nomade.kr/vod/django-baemin/"\n    },\n    {\n        "name": "장고 - 실전편 (Feat. 인스타그램 St. 만들기)",\n        "url": "https://nomade.kr/vod/django-instagram/"\n    }\n]\n'
In [13]:
import json
result=json.loads(json_string)
In [16]:
result.__class__
Out[16]:
list
In [17]:
result
Out[17]:
[{'name': '개발환경 구축하기', 'url': 'https://nomade.kr/vod/setup/'},
 {'name': '파이썬 차근차근 시작하기', 'url': 'https://nomade.kr/vod/python/'},
 {'name': '크롤링 차근차근 시작하기', 'url': 'https://nomade.kr/vod/crawling/'},
 {'name': '파이썬으로 업무 자동화', 'url': 'https://nomade.kr/vod/automation/'},
 {'name': '장고 - 기본편', 'url': 'https://nomade.kr/vod/django/'},
 {'name': '장고걸스 튜토리얼', 'url': 'https://nomade.kr/vod/djangogirls/'},
 {'name': '장고 - Form/ModelForm 잘 알고 쓰기', 'url': 'https://nomade.kr/vod/form/'},
 {'name': '장고 - 클래스 기반 뷰. 잘 알고 쓰기', 'url': 'https://nomade.kr/vod/cbv/'},
 {'name': '장고 - 결제 시스템 연동', 'url': 'https://nomade.kr/vod/payment/'},
 {'name': '장고 - 웹 프론트엔드 시작편', 'url': 'https://nomade.kr/vod/frontend/'},
 {'name': '장고 - 다양한 위젯 만들기', 'url': 'https://nomade.kr/vod/widgets/'},
 {'name': '장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기',
  'url': 'https://nomade.kr/vod/apiserver/'},
 {'name': '장고 - 하이브리드 앱 만들기', 'url': 'https://nomade.kr/vod/hybrid/'},
 {'name': '장고 - 서비스 배포하기', 'url': 'https://nomade.kr/vod/deploy/'},
 {'name': '장고 - 실전편 (Feat. 배달의 민족 St. 만들기)',
  'url': 'https://nomade.kr/vod/django-baemin/'},
 {'name': '장고 - 실전편 (Feat. 인스타그램 St. 만들기)',
  'url': 'https://nomade.kr/vod/django-instagram/'}]
In [21]:
for course in result:
#     print(course['name'],course['url'])
    print('{name}{url}'.format(**course)) #위와 같은 표현
#     print(course)
개발환경 구축하기https://nomade.kr/vod/setup/
파이썬 차근차근 시작하기https://nomade.kr/vod/python/
크롤링 차근차근 시작하기https://nomade.kr/vod/crawling/
파이썬으로 업무 자동화https://nomade.kr/vod/automation/
장고 - 기본편https://nomade.kr/vod/django/
장고걸스 튜토리얼https://nomade.kr/vod/djangogirls/
장고 - Form/ModelForm 잘 알고 쓰기https://nomade.kr/vod/form/
장고 - 클래스 기반 뷰. 잘 알고 쓰기https://nomade.kr/vod/cbv/
장고 - 결제 시스템 연동https://nomade.kr/vod/payment/
장고 - 웹 프론트엔드 시작편https://nomade.kr/vod/frontend/
장고 - 다양한 위젯 만들기https://nomade.kr/vod/widgets/
장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기https://nomade.kr/vod/apiserver/
장고 - 하이브리드 앱 만들기https://nomade.kr/vod/hybrid/
장고 - 서비스 배포하기https://nomade.kr/vod/deploy/
장고 - 실전편 (Feat. 배달의 민족 St. 만들기)https://nomade.kr/vod/django-baemin/
장고 - 실전편 (Feat. 인스타그램 St. 만들기)https://nomade.kr/vod/django-instagram/

Level3

In [22]:
import re
lv3_url='https://askdjango.github.io/lv3/'
In [23]:
html=requests.get(lv3_url).text
In [32]:
# matched=re.search(r'var courses = (.+);',html,re.S)
matched=re.search(r'var courses = (.+?);',html,re.S) #re.S는 개행문자도 포함, 개수뒤의?는 최소로 만드는 매칭, 아니면 전체가 나옴
In [33]:
print(matched.group(1))
[
        {"name": "개발환경 구축하기", "url": "https://nomade.kr/vod/setup/"},
        {"name": "파이썬 차근차근 시작하기", "url": "https://nomade.kr/vod/python/"},
        {"name": "크롤링 차근차근 시작하기", "url": "https://nomade.kr/vod/crawling/"},
        {"name": "파이썬으로 업무 자동화", "url": "https://nomade.kr/vod/automation/"},
        {"name": "장고 - 기본편", "url": "https://nomade.kr/vod/django/"},
        {"name": "장고걸스 튜토리얼", "url": "https://nomade.kr/vod/djangogirls/"},
        {"name": "장고 - Form/ModelForm 잘 알고 쓰기", "url": "https://nomade.kr/vod/form/"},
        {"name": "장고 - 클래스 기반 뷰. 잘 알고 쓰기", "url": "https://nomade.kr/vod/cbv/"},
        {"name": "장고 - 결제 시스템 연동", "url": "https://nomade.kr/vod/payment/"},
        {"name": "장고 - 웹 프론트엔드 시작편", "url": "https://nomade.kr/vod/frontend/"},
        {"name": "장고 - 다양한 위젯 만들기", "url": "https://nomade.kr/vod/widgets/"},
        {"name": "장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기", "url": "https://nomade.kr/vod/apiserver/"},
        {"name": "장고 - 하이브리드 앱 만들기", "url": "https://nomade.kr/vod/hybrid/"},
        {"name": "장고 - 서비스 배포하기", "url": "https://nomade.kr/vod/deploy/"},
        {"name": "장고 - 실전편 (Feat. 배달의 민족 St. 만들기)", "url": "https://nomade.kr/vod/django-baemin/"},
        {"name": "장고 - 실전편 (Feat. 인스타그램 St. 만들기)", "url": "https://nomade.kr/vod/django-instagram/"}
    ]
In [34]:
json_string=matched.group(1)
type(json_string)
Out[34]:
str
In [35]:
import json
course_list=json.loads(json_string)
In [36]:
course_list
Out[36]:
[{'name': '개발환경 구축하기', 'url': 'https://nomade.kr/vod/setup/'},
 {'name': '파이썬 차근차근 시작하기', 'url': 'https://nomade.kr/vod/python/'},
 {'name': '크롤링 차근차근 시작하기', 'url': 'https://nomade.kr/vod/crawling/'},
 {'name': '파이썬으로 업무 자동화', 'url': 'https://nomade.kr/vod/automation/'},
 {'name': '장고 - 기본편', 'url': 'https://nomade.kr/vod/django/'},
 {'name': '장고걸스 튜토리얼', 'url': 'https://nomade.kr/vod/djangogirls/'},
 {'name': '장고 - Form/ModelForm 잘 알고 쓰기', 'url': 'https://nomade.kr/vod/form/'},
 {'name': '장고 - 클래스 기반 뷰. 잘 알고 쓰기', 'url': 'https://nomade.kr/vod/cbv/'},
 {'name': '장고 - 결제 시스템 연동', 'url': 'https://nomade.kr/vod/payment/'},
 {'name': '장고 - 웹 프론트엔드 시작편', 'url': 'https://nomade.kr/vod/frontend/'},
 {'name': '장고 - 다양한 위젯 만들기', 'url': 'https://nomade.kr/vod/widgets/'},
 {'name': '장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기',
  'url': 'https://nomade.kr/vod/apiserver/'},
 {'name': '장고 - 하이브리드 앱 만들기', 'url': 'https://nomade.kr/vod/hybrid/'},
 {'name': '장고 - 서비스 배포하기', 'url': 'https://nomade.kr/vod/deploy/'},
 {'name': '장고 - 실전편 (Feat. 배달의 민족 St. 만들기)',
  'url': 'https://nomade.kr/vod/django-baemin/'},
 {'name': '장고 - 실전편 (Feat. 인스타그램 St. 만들기)',
  'url': 'https://nomade.kr/vod/django-instagram/'}]
In [37]:
for course in course_list:
    print('{name}{url}'.format(**course))
개발환경 구축하기https://nomade.kr/vod/setup/
파이썬 차근차근 시작하기https://nomade.kr/vod/python/
크롤링 차근차근 시작하기https://nomade.kr/vod/crawling/
파이썬으로 업무 자동화https://nomade.kr/vod/automation/
장고 - 기본편https://nomade.kr/vod/django/
장고걸스 튜토리얼https://nomade.kr/vod/djangogirls/
장고 - Form/ModelForm 잘 알고 쓰기https://nomade.kr/vod/form/
장고 - 클래스 기반 뷰. 잘 알고 쓰기https://nomade.kr/vod/cbv/
장고 - 결제 시스템 연동https://nomade.kr/vod/payment/
장고 - 웹 프론트엔드 시작편https://nomade.kr/vod/frontend/
장고 - 다양한 위젯 만들기https://nomade.kr/vod/widgets/
장고 - API 서버 만들기 및 초간단 안드로이드 앱 만들기https://nomade.kr/vod/apiserver/
장고 - 하이브리드 앱 만들기https://nomade.kr/vod/hybrid/
장고 - 서비스 배포하기https://nomade.kr/vod/deploy/
장고 - 실전편 (Feat. 배달의 민족 St. 만들기)https://nomade.kr/vod/django-baemin/
장고 - 실전편 (Feat. 인스타그램 St. 만들기)https://nomade.kr/vod/django-instagram/
In [ ]: