3. Requests
3
urllib 의 기능이 파편화 되어 있다고 판단.
좀더 편한 형태로 만든 url 요청 라이브러리
http://docs.python-requests.org/en/latest
각각의 HTTPMethod 에 해당하는 함수가 존재, url 을 던져주면 된다.
> pip install requests
4. Requests
4
파라미터를 전송해야 하는 경우, 딕셔너리(dict(), {}) 형태로 파라미터를 전달
http://apis.daum.net/search/blog?q=daum&apikey=DAUM_SEARCH_DEMO_APIKEY
post 의 경우, data 파라미터를 통해서 딕셔너리의 형태로 전달
헤더 추가하기
{'API_VERSION': '2.0', 'Content-Length': '0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-
requests/2.3.0 CPython/2.7.6 Windows/7'}
6. Requests
6
UTF-8
{'content-length': '6049', 'content-language': 'ko-KR', 'server': 'nginx/1.4.1',
'connection': 'keep-alive', 'cache-control': 'no-cache', 'date': 'Thu, 26 Jun
2014 05:02:18 GMT', 'content-type': 'text/json;charset=UTF-8'}
200
[]
False
r.text : text encoding 된 response body 텍스트
r.content : body가 바이트인 경우 content 를 통해서 데이터 가져올수 있다.
r.json : JSON 형식으로 response body 가 오는 경우, dict 로 변경
r. raw : raw socket response, requests() 함수에서 stream=True 설정 해야함.
8. Requests + Auth
8
HTTP Basic Auth 기본 제공
request() 함수에 auth=HTTPBasic(id, pw) 지정
HTTPBasic 은 생략 가능.
기존의 HTTPBasicAuthHandler() 만들고
install 해서 사용. 번거로움.
15. BS4(BeautifulSoup4)
15
태그 이름을 통해서 접근 => 편하지만, 해당 이름의 첫번째 태그만 가져온다.!!
현재 문서에서 첫번째 img 태그, 첫번째 a 태그를 가져온다.
원하는 태그 모두 가져오기, find_all(‘tag명’)
현재 문서에서 a 태그의 모든 링크를 가져와라.
find_all(name, attrs, recursive, text, limit, **kwargs)
24. Scrapy
24
Item.py 디자인하기
- 스크랩된 데이터를 담는 컨테이너, 파이썬 딕셔너리 같은.
- Item : scrapy.Item
- Item의 속성 : scrapy.Field
모델링
- 가져올 데이터들을 선정하고 그에 따라서 item 모델링
- dmoz.org 에서 title, link, description 을 가져온다.
/tutorial/tutorial/item.py
25. Scrapy
25
Spider 만들기
- spider : 사용자가 만든 클래스, 도메인에서 정보 긁어오기 위해서 사용.
- download 할 url 리스트 정의, 어떻게 링크를 따라 갈것인지,
- 어떻게 페이지내 컨텐츠를 가져올것인지.
작성법
- scrapy.Spider 클래스를 서브클래싱해서 사용.
- 3가지의 필수 속성/메소드
속성/메소드 설명
name Identifier, unique, 다른이름으로 설정
start_urls URL 리스트
parse() 각각의 url에 대한 Response 객체에서 호출됨.
response data 를 파싱하고 데이터를 뽑아 내는 역할.
Response 를 처리하고 스크랩된 데이터를 item 객체로 변환.
27. Scrapy
27
Crawling
프로젝트 디렉토리 상에서 :
scrapy crawl [spider_name]
scrapy Request(callback=parse())
start_urls count 만큼 생성
Request 가 실행.
Response 객체가 반환
parse() 로 전달.
내부에서는 이렇게 돌아갑니다.
29. Scrapy
29
원하는 웹 페이지에서 가져오는것 까지 성공, 다음은?
가져온 것 중에서 필요한것만 챙기기
웹 페이지에서 데이터 가져오기
Scrapy Selector : XPath, CSS 기반
예 설명
/html/head/title Html 안에 head 안에 title 태그
/html/head/title/text() Html 안에 head 안에 title 안의 문자열 반환
//td 전체 문서에서 td 태그들을 반환
//div[@class=“min”] 전체 div 태그들에서 class 명이 mine 것만 반환
30. Scrapy
30
Selector 클래스 제공
- 파싱을 직접 수행하는 주체이자 노드를 나타냄.
- 4가지 기본 메소드 제공
메소드 설명
xpath() Xpath 표현에 의해서 선택된 Selector 의 리스트 반환
css() CSS 표현에 의해서 선택된 Selector의 리스트 반환
extract() 선택된 데이터의 유니코드 값 반환
re() 정규표현식에 의한 Selector의 리스트 반환
31. Scrapy
31
데이터 추출하기
- response.body 부분에서 XPath 를 이용해서 필요한 것들을 추출
- XPath 를 알기 위해서 HTML을 사람이 봐야 한다. Firefox 확장기능 활용
예제) link-title, link url, text
37. 정리
37
urllib2 보다는 requests 사용하자.
oauth2 는 아직 미지원, OAuth1, Basic, Digest 인증 지원
HTMLParsing : 파싱 대상/성격 따라 다르게
파싱 대상
구조가 다르다. BS4
구조가 같다. Scrapy
ex) 각각의 쇼핑몰에서
데이터 파싱
ex) 특정 블로그 시스템내
페이지 파싱