SlideShare a Scribd company logo
1 of 28
Download to read offline
Web Scraper 
in 30 Minutes 
강철 <kang@cheol.net>
발표자 소개 
KAIST 전산학과 
2015년부터 G사에서 일합니다. 
에서 대한민국 정치의 모든 것을 개발하고 있습니다.
웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 
목표
목표 
웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 
스크래퍼/크롤러의 작동 원리를 이해한다.
목표 
웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 
스크래퍼/크롤러의 작동 원리를 이해한다. 
언제든 필요할 때 동시성 크롤러를 직접 구현
목차 
개론 
● 스크래퍼(Scraper), 크롤러(Crawler) 
● 웹(WWW)의 동작 방식 
실습 
1. Chrome Developer Tools로 웹사이트 구조 파악하기 
2. Requests로 웹페이지 요청하기 
3. scrapy.selector를 이용해 데이터 추출하기 
4. gevent로 여러 페이지 동시에 요청하기
Scraper, Crawler 
Web crawling: 
웹에서 링크를 타고다니며 웹페이지들을 수집하는 행위 
예) Google bot이 전 세계의 웹사이트를 수집하여 검색 서비스 제공 
Web scraping: 
웹사이트에서 정보를 추출하는 행위 
예) 쇼핑몰 가격비교 - 각 쇼핑몰 상품 페이지에서 상품 이름, 가격 등을 추출
Scraper, Crawler 
Google 검색 결과 
(structurized)
왜 필요한가 
국회 의안정보시스템.
왜 필요한가 
1. 의원 이름을 클릭하면 그 의원의 다른 법안들도 볼 수 있음 좋겠는데… 
2. 이 의원의 출석률은 얼마나 될까? 
3. 이 법안을 발의한 의원들의 정당 분포가 어떻게 될까? 
전부 새누리당? 아니면 반반? 
제공되는 기능 외에 하고 싶은 게 너무 많아!
왜 필요한가 
국회, 선거관리위원회 등 국가 정보시스템 데이터를 수집해 만든 
대한민국 정치의 모든 것 (http://pokr.kr/)
웹(WWW)의 동작 방식 
이미지 출처: wikipedia. 
org 
client 
server
웹(WWW)의 동작 방식 
1. 
Request 
- url 
- header 
- data 
이미지 출처: wikipedia. 
org
웹(WWW)의 동작 방식 
1. 
Request 
- url 
- header 
- data 2. 
HTML, 
resources 
- image 
- css 
- JavaScript 
이미지 출처: wikipedia. 
org
웹(WWW)의 동작 방식 
1. 
Request 
- url 
- header 
- data 2. 
HTML, 
resources 
- image 
- css 
- JavaScript 
3. 
브라우저는 그걸 받아 렌더링 
이미지 출처: wikipedia. 
org
실습: TED.com 스크래핑하기
실습: TED.com 스크래핑하기 
목표: 
최신 비디오 목록을 긁어모아 json으로 저장한다.
1. Chrome Developer Tools로 웹사이트 구조 파악하기 
Request URL, method, parameter 등을 확인한다.
2. Requests 이용해 HTML 다운로드 
import requests 
def fetch_page(url): 
r = requests.get(url) 
return r.text 
with open(“sample.html”, ‘w’) as f: 
html = fetch_page(“http://www.ted.com/talks/browse?page=2”) 
f.write(html.encode(‘utf-8’))
2. Requests 이용해 HTML 다운로드 
ssaammppllee..hhttmmll
3. DOM 구조 파악하기
4. 목록에서 게시물 링크들 추출하기 
from urlparse import urljoin 
from scrapy.selector import Selector 
# 실행결과 
[u'http://www.ted.com/talks/jamila_lyiscott_3_ways_to_speak_english', 
u'http://www.ted.com/talks/ruth_chang_how_to_make_hard_choices', 
u'http://www.ted.com/talks/anne_curzan_what_makes_a_word_real', 
… 
] 
def talk_links_from_listpage(url): 
html = fetch_page(url) 
sel = Selector(text=html) 
talk_links = sel.css('.talk-link .media__message a::attr(href)').extract() 
talk_links = [urljoin(url, talk_link) for talk_link in talk_links] 
return talk_links 
from pprint import pprint 
pprint(talk_links_from_listpage(‘http://www.ted.com/talks/browse?page=2’))
5. 각 게시물 세부정보 요청하기 
import re 
download_re = re.compile(r'http://download.ted.com/talks/[^"]+') 
def talk_from_page(url): 
html = fetch_page(url) 
sel = Selector(text=html) 
download_m = download_re.search(html) 
return { 
'title': sel.css('.talk-hero__title::text').extract(), 
'description': sel.css('.talk-description::text').extract(), 
'download': download_m.group(0) if download_m else None, 
} 
def latest_talks(page=1): 
list_url = 'http://www.ted.com/talks/browse?page={0}'.format(page) 
talk_links = talk_links_from_listpage(list_url) 
talks = [talk_from_page(url) for url in talk_links] 
return talks 
pprint(latest_talks())
6. 동시에 여러 페이지 요청하기 
from gevent import monkey; monkey.patch_all() 
from gevent.pool import Pool 
def latest_talks(page=1): 
list_url = 'http://www.ted.com/talks/browse?page={0}'.format(page) 
talk_links = talk_links_from_listpage(list_url) 
# talks = [talk_from_page(url) for url in talk_links] 
pool = Pool(20) # XXX: constant 
talks = pool.map(talk_from_page, talk_links) 
return talks 
pprint(latest_talks()) 
# 단 5줄 변경만으로: 34초 → 8초
정리 
Python의 쉽고 간결한 문법과 강력한 라이브러리를 이용하면 
간단한 스크래퍼 정도는 30분이면 충분히 짜고 남는다.
Q&A
Scrapy 좋아요 
● command line tools 
● referer & user-agent 
● item pipeline 
● export to file/DB 
● crawling: link extraction, queueing, scheduling 
● retry & failover 
● logging 
● daemonize 
● distributed execution
감사합니다

More Related Content

What's hot

파알못의 파이썬 크롤러 이해하기
파알못의 파이썬 크롤러 이해하기파알못의 파이썬 크롤러 이해하기
파알못의 파이썬 크롤러 이해하기Hyeyeon Yang
 
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)Osori Hanyang
 
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료라한사 아
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Jeong-gyu Kim
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 YoungSu Son
 
파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링HWANGTAEYONG
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기은아 정
 
Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자용진 조
 
휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치Juneyoung Oh
 
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기Changwan Jun
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리라한사 아
 
Django in Production
Django in ProductionDjango in Production
Django in ProductionHyun-woo Park
 
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기라한사 아
 
Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리라한사 아
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나JeongHwan Kim
 
Kakao Bot(Plus friend)
Kakao Bot(Plus friend)Kakao Bot(Plus friend)
Kakao Bot(Plus friend)SeongSik Choi
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편준철 박
 

What's hot (20)

파알못의 파이썬 크롤러 이해하기
파알못의 파이썬 크롤러 이해하기파알못의 파이썬 크롤러 이해하기
파알못의 파이썬 크롤러 이해하기
 
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
 
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기
 
파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
 
Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자Fiddler 피들러에 대해 알아보자
Fiddler 피들러에 대해 알아보자
 
휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치휴봇-슬랙 OSX 설치
휴봇-슬랙 OSX 설치
 
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
 
Django in Production
Django in ProductionDjango in Production
Django in Production
 
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
 
Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
Kakao Bot(Plus friend)
Kakao Bot(Plus friend)Kakao Bot(Plus friend)
Kakao Bot(Plus friend)
 
Restful API guide
Restful API guideRestful API guide
Restful API guide
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 

Similar to [PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼

집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02Kwang Woo NAM
 
정해균 포트폴리오
정해균 포트폴리오정해균 포트폴리오
정해균 포트폴리오Haegyun Jung
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지yongwoo Jeon
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web AnimationsChang W. Doh
 
파이썬 유용한 라이브러리
파이썬 유용한 라이브러리파이썬 유용한 라이브러리
파이썬 유용한 라이브러리SeongHyun Ahn
 
생활 코딩 #2(Simple Web Scraping with Python #2)
생활 코딩 #2(Simple Web Scraping with Python #2)생활 코딩 #2(Simple Web Scraping with Python #2)
생활 코딩 #2(Simple Web Scraping with Python #2)SeungYong Baek
 
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임KH Park (박경훈)
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
과정 커리큘럼
과정 커리큘럼과정 커리큘럼
과정 커리큘럼John Seo
 
Meteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayMeteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayseung-hyun Park
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15Chanwoong Kim
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 

Similar to [PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼 (20)

집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
 
정해균 포트폴리오
정해균 포트폴리오정해균 포트폴리오
정해균 포트폴리오
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations
 
파이썬 유용한 라이브러리
파이썬 유용한 라이브러리파이썬 유용한 라이브러리
파이썬 유용한 라이브러리
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
생활 코딩 #2(Simple Web Scraping with Python #2)
생활 코딩 #2(Simple Web Scraping with Python #2)생활 코딩 #2(Simple Web Scraping with Python #2)
생활 코딩 #2(Simple Web Scraping with Python #2)
 
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
Hacosa jquery 1th
Hacosa jquery 1thHacosa jquery 1th
Hacosa jquery 1th
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
과정 커리큘럼
과정 커리큘럼과정 커리큘럼
과정 커리큘럼
 
Portfolio
PortfolioPortfolio
Portfolio
 
Meteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayMeteor Korea DEV School 1st day
Meteor Korea DEV School 1st day
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 

[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼

  • 1. Web Scraper in 30 Minutes 강철 <kang@cheol.net>
  • 2. 발표자 소개 KAIST 전산학과 2015년부터 G사에서 일합니다. 에서 대한민국 정치의 모든 것을 개발하고 있습니다.
  • 3. 웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 목표
  • 4. 목표 웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 스크래퍼/크롤러의 작동 원리를 이해한다.
  • 5. 목표 웹 스크래퍼를 프레임웍 없이 처음부터 작성해 본다. 스크래퍼/크롤러의 작동 원리를 이해한다. 언제든 필요할 때 동시성 크롤러를 직접 구현
  • 6. 목차 개론 ● 스크래퍼(Scraper), 크롤러(Crawler) ● 웹(WWW)의 동작 방식 실습 1. Chrome Developer Tools로 웹사이트 구조 파악하기 2. Requests로 웹페이지 요청하기 3. scrapy.selector를 이용해 데이터 추출하기 4. gevent로 여러 페이지 동시에 요청하기
  • 7. Scraper, Crawler Web crawling: 웹에서 링크를 타고다니며 웹페이지들을 수집하는 행위 예) Google bot이 전 세계의 웹사이트를 수집하여 검색 서비스 제공 Web scraping: 웹사이트에서 정보를 추출하는 행위 예) 쇼핑몰 가격비교 - 각 쇼핑몰 상품 페이지에서 상품 이름, 가격 등을 추출
  • 8. Scraper, Crawler Google 검색 결과 (structurized)
  • 9. 왜 필요한가 국회 의안정보시스템.
  • 10. 왜 필요한가 1. 의원 이름을 클릭하면 그 의원의 다른 법안들도 볼 수 있음 좋겠는데… 2. 이 의원의 출석률은 얼마나 될까? 3. 이 법안을 발의한 의원들의 정당 분포가 어떻게 될까? 전부 새누리당? 아니면 반반? 제공되는 기능 외에 하고 싶은 게 너무 많아!
  • 11. 왜 필요한가 국회, 선거관리위원회 등 국가 정보시스템 데이터를 수집해 만든 대한민국 정치의 모든 것 (http://pokr.kr/)
  • 12. 웹(WWW)의 동작 방식 이미지 출처: wikipedia. org client server
  • 13. 웹(WWW)의 동작 방식 1. Request - url - header - data 이미지 출처: wikipedia. org
  • 14. 웹(WWW)의 동작 방식 1. Request - url - header - data 2. HTML, resources - image - css - JavaScript 이미지 출처: wikipedia. org
  • 15. 웹(WWW)의 동작 방식 1. Request - url - header - data 2. HTML, resources - image - css - JavaScript 3. 브라우저는 그걸 받아 렌더링 이미지 출처: wikipedia. org
  • 17. 실습: TED.com 스크래핑하기 목표: 최신 비디오 목록을 긁어모아 json으로 저장한다.
  • 18. 1. Chrome Developer Tools로 웹사이트 구조 파악하기 Request URL, method, parameter 등을 확인한다.
  • 19. 2. Requests 이용해 HTML 다운로드 import requests def fetch_page(url): r = requests.get(url) return r.text with open(“sample.html”, ‘w’) as f: html = fetch_page(“http://www.ted.com/talks/browse?page=2”) f.write(html.encode(‘utf-8’))
  • 20. 2. Requests 이용해 HTML 다운로드 ssaammppllee..hhttmmll
  • 21. 3. DOM 구조 파악하기
  • 22. 4. 목록에서 게시물 링크들 추출하기 from urlparse import urljoin from scrapy.selector import Selector # 실행결과 [u'http://www.ted.com/talks/jamila_lyiscott_3_ways_to_speak_english', u'http://www.ted.com/talks/ruth_chang_how_to_make_hard_choices', u'http://www.ted.com/talks/anne_curzan_what_makes_a_word_real', … ] def talk_links_from_listpage(url): html = fetch_page(url) sel = Selector(text=html) talk_links = sel.css('.talk-link .media__message a::attr(href)').extract() talk_links = [urljoin(url, talk_link) for talk_link in talk_links] return talk_links from pprint import pprint pprint(talk_links_from_listpage(‘http://www.ted.com/talks/browse?page=2’))
  • 23. 5. 각 게시물 세부정보 요청하기 import re download_re = re.compile(r'http://download.ted.com/talks/[^"]+') def talk_from_page(url): html = fetch_page(url) sel = Selector(text=html) download_m = download_re.search(html) return { 'title': sel.css('.talk-hero__title::text').extract(), 'description': sel.css('.talk-description::text').extract(), 'download': download_m.group(0) if download_m else None, } def latest_talks(page=1): list_url = 'http://www.ted.com/talks/browse?page={0}'.format(page) talk_links = talk_links_from_listpage(list_url) talks = [talk_from_page(url) for url in talk_links] return talks pprint(latest_talks())
  • 24. 6. 동시에 여러 페이지 요청하기 from gevent import monkey; monkey.patch_all() from gevent.pool import Pool def latest_talks(page=1): list_url = 'http://www.ted.com/talks/browse?page={0}'.format(page) talk_links = talk_links_from_listpage(list_url) # talks = [talk_from_page(url) for url in talk_links] pool = Pool(20) # XXX: constant talks = pool.map(talk_from_page, talk_links) return talks pprint(latest_talks()) # 단 5줄 변경만으로: 34초 → 8초
  • 25. 정리 Python의 쉽고 간결한 문법과 강력한 라이브러리를 이용하면 간단한 스크래퍼 정도는 30분이면 충분히 짜고 남는다.
  • 26. Q&A
  • 27. Scrapy 좋아요 ● command line tools ● referer & user-agent ● item pipeline ● export to file/DB ● crawling: link extraction, queueing, scheduling ● retry & failover ● logging ● daemonize ● distributed execution