Save 37% off PRO during our Black Friday Sale! »

Python Study 7 - Web Programming

Python Study 7 - Web Programming

B97968bf727069ae776a34f3a201d85d?s=128

AhnSeongHyun

May 19, 2015
Tweet

Transcript

  1. 안성현(@SH84AHN) 웹 관련 프로그래밍 1탄 클라이언트 만들기 1

  2. 오늘 다룰 것들. 2 urllib2 Request error build_opener install_opener urlencode

    urlopen urljoin/urlsplit urlparse ftplib hashlib json xml base64
  3. urllib2 패키지 3 http, ftp 서버와의 상호작용이 필요한 클라이언트 작성시

    사용. 웹 페이지, 자동화 도구, 프록시, 웹크롤러 등에서 데이터를 긁어오는데 주로 사용.  urllib vs. urllib2 - URL 만 vs. URL, Request urlib2.urlopen(url [, data [, timeout]]) - 요청 보내기 - url : 문자열 url, Request 클래스의 인스턴스 - data : POST 방식 전송시 폼데이터, URL 인코딩된 데이터 - timeout : 초 - 파일객체와 유사한 객체 반환
  4. urllib2.urlopen 4 메소드 설명 read(size) Size 만큼의 문자열 반환, 지정하지

    않으면 전체 readline() 한줄의 텍스트 반환 readlines() 모든줄을 리스트로 반환 close() 연결 닫기 info() URL 과 관련된 메타정보가 있는 객체 반환 getcode() HTTP 응답코드 정수 반환 geturl() 반환 데이터의 실제 URL 반환, redirection 고려 urlopen() 함수 반환객체의 함수들
  5. urllib2.urlopen 5 <! DOCTYPE html> 1070 Cache-Control: private Content-Length: 65092

    Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/6.0 X-AspNet-Version: 4.0.30319 X-Internal-Url: / Set-Cookie: TriggerOverlay=membership- 02|7|http://images.wolfgangsvault.com/cvfeatures/cream_clapto n_400x533.jpg; expires=Thu, 19-Jun-2014 06:04:35 GMT; path=/ Date: Thu, 19 Jun 2014 05:04:35 GMT Connection: close 200 http://www.concertvault.com/
  6. urllib2.Request 6 기본적인 것은 url 문자열로 호출 상세한 지정을 Request

    클래스 이용 > { "foo": [ "bar" ], "q": [ "query string" ] } data 를 추가하면 post 방식으로 자동 변경 urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])  data 추가
  7. urllib2.Request 7 { "Accept-Encoding": "identity", "Api-Link": "http://dev.danal.co.kr", "Api-Version": "1.0", "Connection":

    "close", "Content-Length": "", "Content-Type": "", "Host": "localhost:5000", "User-Agent": "Python-urllib/2.7" }  header 추가
  8. urllib2.Request 8 Request.add_data(data) - 요청에 데이터 추가 - POST 방식으로

    변경, data 는 URL 인코딩된 데이터 Request.get_method() - http method 반환 Request.has_data() - 데이터가 있는지 확인 Request.get_data() - 요청에 데이터가 있으면 반환 Request.add_header(key, val) - 헤더정보 추가 , key 가 헤더이름, val 가 헤더값 Request.add_unredirected_header(key, header) - redirect 가 있을경우에 추가되지 않을 헤더정보 추가 Request.has_header(header) - 헤더정보가 있는지
  9. urllib2.Request 9 Request.get_full_url() - 전체 url 반환 Request.get_type() - url의

    타입반환 Request.get_host() - 요청을 보낼 host 반환 Request.get_selector() - URL 에서 selector 부분 반환 Request.get_header(header_name, default=None) - 지정한 헤더에 대한 값 반환 Request.header_items() - 헤더정보 전체 반환 Request.is_unverifiable() - 요청을 검증할수 없는 경우 True 반환
  10. urllib2.build_opener 10 urlopen() 함수는 인증, 쿠키 등의 HTTP 고급 기능지원하지

    않음. 커스텀 오프너를 만들어야 함. 필요한 handler 를 추가하는 방식으로 생성  여러가지 handler.. urllib2.build_opener([handler, ...]) 클래스 설명 urllib2.HTTPBasicAuthHandler 기본 http 인증 처리 urllib2.HTTPDigestAuthHandler HTTP digest 인증 처리 urllib2.HTTPCookieProcessor HTTP 쿠키처리 urllib2.HTTPHandler url을 HTTP 로 열기 urllib2.HTTPSHandler url을 HTTPS 로 열기 urllib2.HTTPRedirectHandler HTTP 페이지 전환을 처리
  11. urllib2.build_opener 11 기본적으로 들어있는 handler 들. ['__doc__', '__init__', '__module__', '_call_chain',

    '_open', 'add_handler', 'addheaders', 'close', 'error', 'handle_error', 'handle_open', 'handlers', 'open', 'process_request', 'process_response']
  12. urllib2.build_opener 12 암호인증이 필요하다? 기본핸들러에는 없는데? HTTPBasicAuthHandler() 를 만들어서 사용.

  13. urllib.install_opener 13 install_opener(opener) - handler.open() 함수가 아닌 urlopen() 으로 호출하고

    싶을때. 설치.
  14. urlparse 14 URL 문자열 조작할때 사용 http 10.10.1.126:8090 /pages/viewpage.action pageId=3179193

    None None 10.10.1.126 8090 netloc : 네트워크 위치 지정자 fragment : 앞쪽#을 뺀 지정자
  15. urljoin, urlsplit 15 Base URL + 지정한 URL = 절대

    URL > http://10.10.1.126:8090/page > http://10.10.1.126:8090/1 params 제외, urlparse 와 동일 > SplitResult(scheme='http', netloc='10.10.1.126:8090', path='/pages/viewpage.action', query='pageId=3179193', fragment='')
  16. urlencode 16 urlencode(query) - query : 사전이거나 쌍들의 순서 quote

     unquote quote_plus  unquote_plus ash84_jin%3D%20%40gmail.com ash84_jin%3D+%40gmail.com ash84_jin= @gmail.com ash84_jin= @gmail.com
  17. error 17 exception urllib2.URLError - IOError 의 서브 클래스 -

    reason 속성이 문제에 대한 정보를 가지고 있다. exception urllib2.HTTPError - URLError의 서브 클래스 - HTTP 프로토콜과 관련된 문제 - 인증요구와 같은 이벤트를 알리는데 사용. - HTTP Staus code, reason 속성 exception urllib.ContentTooShortError - 다운로드된 데이터의 양이 예상한것(Content-length) 적은 경우 발생
  18. ftplib 18 FTP 프로토콜로 클라이언트쪽 구현시 사용 class ftplib.FTP([host[, user[,

    passwd[, acct[, timeout]]]]]) - FTP 연결을 나타내는 객체 생성 - host 를 연결하면 자동으로 connect() 함수 호출. - user, password, acct 를 지정하면 login() 함수 호출. FTP.connect(host[, port[, timeout]]) FTP.login([user[, passwd[, acct]]]) FTP.close()
  19. ftplib 19 ftp.cwd(path) - 디렉토리 변경, cd.. ftp.mkd() - 서버에

    새디렉토리 생성 ftp.rename(old, new) - 서버의 파일 이름 변경 ftp.pwd() - 현재 디렉토리 반환 ftp.rmd(dirname) - 해당 디렉토리 삭제 ftp.dir(dirname) - ‘LIST’ 명령 호출, 지정하지 않으면 현재 디렉토리 기준 출력 - dirname 지정하면 지정한곳으로 출력 ftp.size(filename) - 지정한 파일의 사이즈 출력
  20. ftplib 20 ftp.storbinary(command, file, [, blocksize]) - 이진 전송모드로 데이터

    전송 - command 는 문자열, “STOR “+filename - blocksize 는 전송에 사용할 블록크기 ftp.storlines(command, file) - 텍스트 전송 모드로 데이터 전송 - command 는 문자열, “STOR “+filename
  21. ftplib 21 ftp.retrlines(command [, callback]) - 서버에서 명령을 실행한 결과를

    텍스트로 반환 - callback 은 콜백함수 지정, 지정하지 않으면 stdout ftp.retrbianry(command, callback [, blocksizes [, rest]]) - 서버에서 실행한 결과를 이진 전송 모드로 반환 - command : “RETR ”+filename - callback : 데이터 블록 받을때 마다 호출되는 함수 - rest : 파일 오프셋
  22. base64 22 base64, base16, base32 인코딩을ㄹ 사용하여 이진데이터를 텍스트로 인코딩

    혹은 디코딩 메일첨부나 http 프로토콜에서 이진 데이터를 추가하는데 사용 altchars : base64 출력에서 +, \ 을 대체하기 위한 2개의 문자열 지정 YXNoODQ6MTIzNA== ash84:1234 YXNoODQ6MTIzNA== ash84:1234 61736838343A31323334 ash84:1234 MFZWQOBUHIYTEMZU ash84:1234
  23. xml 23 SAX, DOM, ElementTree 인터페이스 제공 DOM : xml.dom.minidom

    SAX : xml.sax ElementTree : xml.etree.ElementTree
  24. xml.dom.minidom 24 XML 을 파싱해서 DOM 규약에 따라 메모리에 트리구조로

    저장하는 기능 제공 parse, parseString() 으로 파싱 attributes firstchild lastchild nodename nodetype getElementByTagName() hasAttributes() getAttribute() documentElement() appendChild() removeChild() replaceChild()
  25. xml.sax 25 SAX2 API를 사용하여 API 문서를 파싱 start parsing

    attr : domain t1 attr : price 12000 attr : domain gs attr : domain ld attr : domain sas attr : domain 342d end parsing xml.sax.ContentHandler 의 서브클래스를 사용 일종의 handler 특정 경우에 특정 함수를 할당 - startDocuemnt : 문서 시작시 호출 - endDocuemnt : 문서 시작시 호출 - startElement : 엘리먼트 시작시 - endElement: 엘리먼트 끝날경우
  26. xml.etree.ElementTree 26 계층적인 데이터를 저장하고 조작하는데 사용하는 ElementTree 객체 정의

    찾기 : find(), finall(), findtext(), getroot(), get(), items(), keys().. 조작 : append(), clear(), insert(), remove(), set()(..
  27. json 27 dump, load 함수는 파일객체 대상 dumps, loads 함수는

    문자열 대상 {"habits": ["cooking", "camping", "sleeping"], "name": "ash84"} <type 'dict'> {u'habits': [u'cooking', u'camping', u'sleeping'], u'name': u'ash84'}
  28. json 28 object_hook : 디코딩된 결과 객체를 인수로 전달, 중간에

    데이터 조작을 할 함수 지정. cls : 디코딩할 JSONDecoder 하위 클래스 지정 parse_float, parse_int : 부동소수점, 정수값 디코딩을 위한 함수 호출 지정. {u'name': u'ash8\n4', 'habit': u'cooking'}
  29. hashlib 29 다양한 보안 해시와 MD5, SHA 등의 Message-digest 알고리즘

    구현 모듈 함수 설명 md5(data) MD5 해시(128비트) sha1(data) SHA1 해시(160비트) sha224(data) SHA224 해시(226비트) shar256(data) SHA256 해시(256비트) sha384(data) SHA384 해시(384비트) sha512(data) SHA512 해시(512비트) 함수 설명 d.update(data) 새로운 데이터로 업데이트, 그러나 이어지는 것. 덮어써지는게 아니다. d.digest() 무가공 바이트 문자열로 요약 값 반환 d.hexdigest() 16진수 숫자들로 인코딩된 요약텍스트 위의 함수의 리턴 객체에 대한 함수들.
  30. hashlib 30 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6 c15b0f00a08 37268335dd6931045bdcdf92623ff819a64244b53d0e746d4387 97349d4da578 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6 c15b0f00a08 098f6bcd4621d373cade4e832627b4f6 05a671c66aefea124cc08b76ea6d30bb

    098f6bcd4621d373cade4e832627b4f6 SHA256 MD5
  31. 정리 31 urllib, urllib2 를 이용, 상세한 요청은 Request 인증,

    쿠키 등의 고급 기능 => build_opener 이용, 커스텀 오프너 urlencode 는 호출시 반드시 사용. error 처리를 잘 활용하자. 401, 404, 500 XML 파싱 => 용도와 크기 고려 JSON, dump, load 만 기억 hashlib 에서 update 는 갱신이 아니라 concat