1.가장 기본적인 애플리케이션
import urllib2 url = r'http://www.baidu.com' html = urllib2.urlopen(url).read() print html
클라이언트와 서버는 요청과 응답을 통해 통신합니다. 클라이언트는 먼저 서버에 요청을 보낸 다음 서버에서 반환된 응답을 받습니다.
urllib2는 사용자가 요청을 보내기 전에 요청 객체를 구성한 다음 urllib2.urlopen 메서드를 통해 요청을 보낼 수 있도록 하는 요청 클래스를 제공합니다.
import urllib2 url = r'http://www.baidu.com' req = urllib2.Request(url) html = urllib2.urlopen(req).read() print html
위 예에서는
을 먼저 사용하세요.req = urllib2.Request(url)
요청 객체를 인스턴스화한 다음
을 사용하세요.urllib2.urlopen(req)
이 페이지를 엽니다.
요청 개체를 인스턴스화할 때 URL을 설정해야 하며 여러 기본 매개변수가 있다는 것을 확인했습니다.
데이터와 헤더도 베이스에서 흔히 사용됩니다. 탐색을 위해 로그인이 필요한 일부 웹사이트에서는 이 두 매개변수가 필요한 경우가 많습니다
import urllib import urllib2 url = 'http://www.baidu.com/' values = {'name' : 'Michael Foord', 'location' : 'Northampton','language' : 'Python' } data = urllib.urlencode(values) req = urllib2.Request(url,data) response = urllib2.urlopen(req) the_page = response.read() print the_page
이 예는 Baidu에 일부 데이터를 보내는 것입니다. Baidu를 방문할 때 정보를 게시할 필요가 없기 때문에 정상적인 오류 페이지가 반환되지만 게시하면 오류가 발생합니다.
Baidu는 해당 웹페이지를 찾을 수 없으면 오류를 보고합니다.
물론 POST 데이터이므로 GET 메소드에서도 사용할 수 있습니다. 위 코드를 약간 수정하세요
Baidu는 http://www.baidu.com/s?wd=XXX를 통해 쿼리하므로 사전 {'wd':'xxx'}를 urlencode해야 합니다
#coding:utf-8 import urllib import urllib2 url = 'http://www.baidu.com/s' values = {'wd':'杨彦星'} data = urllib.urlencode(values) print data url2 = url+'?'+data response = urllib2.urlopen(url2) the_page = response.read() print the_page
다음은 Renren에 로그인한 후 홈페이지 콘텐츠를 표시하여 쿠키 사용을 자세히 설명하는 예입니다. 다음은 문서에 제시된 예를 원하는 기능을 달성하도록 변형해 보겠습니다. 🎜>
import cookielib, urllib2 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") #coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #创建一个cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #将要POST出去的数据进行编码 data = urllib.urlencode({"email":email,"password":pass}) r = opener.open(url,data) print cj
위 코드에는 설명할 점이 2가지 있는데, 이해하는데 시간이 오래 걸렸습니다
r = opener.open(url,data)
#coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #创建一个cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) #将要POST出去的数据进行编码 data = urllib.urlencode({"email":email,"password":pass}) #r = opener.open(url,data)如果没有上面的urllib2.install_opener方法,就必须这样写了 r = urllib2.urlopen(url,data) html = urllib2.urlopen('http://www.renren.com/home').read() print html
2. 예외 처리
urlopen()이 응답을 처리할 수 없으면 URLError 예외가 발생합니다. HTTPError 예외는 URLError의 하위 클래스이며 HTTP 유형 URL에 액세스할 때만 발생합니다.
1. URLError 예외
일반적으로 URLError의 원인은 네트워크 연결이 없거나(대상 서버에 대한 경로 없음), 액세스한 대상 서버가 존재하지 않는 것입니다. 이 경우 예외 객체에는 이유 속성((오류 코드, 오류 이유)의 튜플)이 있습니다.
#! /usr/bin/env python #coding=utf-8 import urllib2 url="http://www.baidu.com/" try: response=urllib2.urlopen(url) except urllib2.URLError,e: print e.reason
2. HTTP 오류
서버에서 반환된 모든 HTTP 응답에는 상태 코드가 있습니다. 그 중 일부 상태 코드는 서버가 해당 요청을 완료할 수 없음을 나타냅니다. 기본 핸들러는 이러한 상태 코드 중 일부를 처리할 수 있습니다(반환된 응답이 리디렉션인 경우 urllib2는 자동으로 리디렉션된 페이지에서 정보를 얻습니다). urllib2 모듈이 처리할 수 없는 일부 상태 코드가 있으므로 urlopen 함수는 404/401이 일반적인 HTTPError 예외를 발생시킵니다.
HTTPError 예외 인스턴스에는 서버에서 반환된 오류 상태 코드를 나타내는 정수 유형의 코드 속성이 있습니다.
urllib2 모듈의 기본 핸들러는 리디렉션을 처리할 수 있으며(상태 코드는 300 범위에 있음) 100-299 범위의 상태 코드는 성공을 나타냅니다. 따라서 HTTPError 예외가 발생할 수 있는 상태 코드 범위는 400-599입니다.
오류가 발생하면 서버는 HTTP 오류 코드와 오류 페이지를 반환합니다. HTTPError 인스턴스를 반환 페이지로 사용할 수 있습니다. 즉, HTTPError 인스턴스에는 code 속성뿐만 아니라 read, geturl 및 info와 같은 메서드도 있다는 의미입니다.
#! /usr/bin/env python #coding=utf-8 import urllib2 url="http://cs.scu.edu.cn/~duanlei" try: response=urllib2.urlopen(url) except urllib2.HTTPError,e: print e.code print e.read()
3. 요약
코드에서 URLError와 HTTPError를 처리하려는 경우 두 가지 방법이 있는데 코드는 다음과 같습니다.
#! /usr/bin/env python #coding=utf-8 import urllib2 url="xxxxxx" #需要访问的URL try: response=urllib2.urlopen(url) except urllib2.HTTPError,e: #HTTPError必须排在URLError的前面 print "The server couldn't fulfill the request" print "Error code:",e.code print "Return content:",e.read() except urllib2.URLError,e: print "Failed to reach the server" print "The reason:",e.reason else: #something you should do pass #其他异常的处理 #! /usr/bin/env python #coding=utf-8 import urllib2 url="http://xxx" #需要访问的URL try: response=urllib2.urlopen(url) except urllib2.URLError,e: if hasattr(e,"reason"): print "Failed to reach the server" print "The reason:",e.reason elif hasattr(e,"code"): print "The server couldn't fulfill the request" print "Error code:",e.code print "Return content:",e.read() else: pass #其他异常的处理